1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291 |
- <?php
- namespace Illuminate\Tests\Testing\Fluent;
- use Illuminate\Support\Collection;
- use Illuminate\Testing\Fluent\AssertableJson;
- use Illuminate\Tests\Testing\Stubs\ArrayableStubObject;
- use PHPUnit\Framework\AssertionFailedError;
- use PHPUnit\Framework\TestCase;
- use RuntimeException;
- use TypeError;
- class AssertTest extends TestCase
- {
- public function testAssertHas()
- {
- $assert = AssertableJson::fromArray([
- 'prop' => 'value',
- ]);
- $assert->has('prop');
- }
- public function testAssertHasFailsWhenPropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'value',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [prop] does not exist.');
- $assert->has('prop');
- }
- public function testAssertHasNestedProp()
- {
- $assert = AssertableJson::fromArray([
- 'example' => [
- 'nested' => 'nested-value',
- ],
- ]);
- $assert->has('example.nested');
- }
- public function testAssertHasFailsWhenNestedPropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'example' => [
- 'nested' => 'nested-value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [example.another] does not exist.');
- $assert->has('example.another');
- }
- public function testAssertHasCountItemsInProp()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $assert->has('bar', 2);
- }
- public function testAssertHasCountFailsWhenAmountOfItemsDoesNotMatch()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not have the expected size.');
- $assert->has('bar', 1);
- }
- public function testAssertHasCountFailsWhenPropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] does not exist.');
- $assert->has('baz', 1);
- }
- public function testAssertHasFailsWhenSecondArgumentUnsupportedType()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'baz',
- ]);
- $this->expectException(TypeError::class);
- $assert->has('bar', 'invalid');
- }
- public function testAssertHasOnlyCounts()
- {
- $assert = AssertableJson::fromArray([
- 'foo',
- 'bar',
- 'baz',
- ]);
- $assert->has(3);
- }
- public function testAssertHasOnlyCountFails()
- {
- $assert = AssertableJson::fromArray([
- 'foo',
- 'bar',
- 'baz',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Root level does not have the expected size.');
- $assert->has(2);
- }
- public function testAssertHasOnlyCountFailsScoped()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not have the expected size.');
- $assert->has('bar', function ($bar) {
- $bar->has(3);
- });
- }
- public function testAssertCount()
- {
- $assert = AssertableJson::fromArray([
- 'foo',
- 'bar',
- 'baz',
- ]);
- $assert->count(3);
- }
- public function testAssertCountFails()
- {
- $assert = AssertableJson::fromArray([
- 'foo',
- 'bar',
- 'baz',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Root level does not have the expected size.');
- $assert->count(2);
- }
- public function testAssertCountFailsScoped()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not have the expected size.');
- $assert->has('bar', function ($bar) {
- $bar->count(3);
- });
- }
- public function testAssertMissing()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'bar' => true,
- ],
- ]);
- $assert->missing('foo.baz');
- }
- public function testAssertMissingFailsWhenPropExists()
- {
- $assert = AssertableJson::fromArray([
- 'prop' => 'value',
- 'foo' => [
- 'bar' => true,
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo.bar] was found while it was expected to be missing.');
- $assert->missing('foo.bar');
- }
- public function testAssertMissingAll()
- {
- $assert = AssertableJson::fromArray([
- 'baz' => 'foo',
- ]);
- $assert->missingAll([
- 'foo',
- 'bar',
- ]);
- }
- public function testAssertMissingAllFailsWhenAtLeastOnePropExists()
- {
- $assert = AssertableJson::fromArray([
- 'baz' => 'foo',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] was found while it was expected to be missing.');
- $assert->missingAll([
- 'bar',
- 'baz',
- ]);
- }
- public function testAssertMissingAllAcceptsMultipleArgumentsInsteadOfArray()
- {
- $assert = AssertableJson::fromArray([
- 'baz' => 'foo',
- ]);
- $assert->missingAll('foo', 'bar');
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] was found while it was expected to be missing.');
- $assert->missingAll('bar', 'baz');
- }
- public function testAssertWhereMatchesValue()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'value',
- ]);
- $assert->where('bar', 'value');
- }
- public function testAssertWhereFailsWhenDoesNotMatchValue()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'value',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not match the expected value.');
- $assert->where('bar', 'invalid');
- }
- public function testAssertWhereFailsWhenMissing()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'value',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] does not exist.');
- $assert->where('baz', 'invalid');
- }
- public function testAssertWhereFailsWhenMachingLoosely()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 1,
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not match the expected value.');
- $assert->where('bar', true);
- }
- public function testAssertWhereUsingClosure()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'baz',
- ]);
- $assert->where('bar', function ($value) {
- return $value === 'baz';
- });
- }
- public function testAssertWhereFailsWhenDoesNotMatchValueUsingClosure()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'baz',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] was marked as invalid using a closure.');
- $assert->where('bar', function ($value) {
- return $value === 'invalid';
- });
- }
- public function testAssertWhereClosureArrayValuesAreAutomaticallyCastedToCollections()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'foo',
- 'example' => 'value',
- ],
- ]);
- $assert->where('bar', function ($value) {
- $this->assertInstanceOf(Collection::class, $value);
- return $value->count() === 2;
- });
- }
- public function testAssertWhereMatchesValueUsingArrayable()
- {
- $stub = ArrayableStubObject::make(['foo' => 'bar']);
- $assert = AssertableJson::fromArray([
- 'bar' => $stub->toArray(),
- ]);
- $assert->where('bar', $stub);
- }
- public function testAssertWhereMatchesValueUsingArrayableWhenSortedDifferently()
- {
- $assert = AssertableJson::fromArray([
- 'data' => [
- 'status' => 200,
- 'user' => [
- 'id' => 1,
- 'name' => 'Taylor',
- ],
- ],
- ]);
- $assert->where('data', [
- 'user' => [
- 'name' => 'Taylor',
- 'id' => 1,
- ],
- 'status' => 200,
- ]);
- }
- public function testAssertWhereFailsWhenDoesNotMatchValueUsingArrayable()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => ['id' => 1, 'name' => 'Example'],
- 'baz' => [
- 'id' => 1,
- 'name' => 'Taylor Otwell',
- 'email' => 'taylor@laravel.com',
- 'email_verified_at' => '2021-01-22T10:34:42.000000Z',
- 'created_at' => '2021-01-22T10:34:42.000000Z',
- 'updated_at' => '2021-01-22T10:34:42.000000Z',
- ],
- ]);
- $assert
- ->where('bar', ArrayableStubObject::make(['name' => 'Example', 'id' => 1]))
- ->where('baz', [
- 'name' => 'Taylor Otwell',
- 'email' => 'taylor@laravel.com',
- 'id' => 1,
- 'email_verified_at' => '2021-01-22T10:34:42.000000Z',
- 'updated_at' => '2021-01-22T10:34:42.000000Z',
- 'created_at' => '2021-01-22T10:34:42.000000Z',
- ]);
- }
- public function testAssertWhereContainsFailsWithEmptyValue()
- {
- $assert = AssertableJson::fromArray([]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain [1].');
- $assert->whereContains('foo', ['1']);
- }
- public function testAssertWhereContainsFailsWithMissingValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => ['bar', 'baz'],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain [invalid].');
- $assert->whereContains('foo', ['bar', 'baz', 'invalid']);
- }
- public function testAssertWhereContainsFailsWithMissingNestedValue()
- {
- $assert = AssertableJson::fromArray([
- ['id' => 1],
- ['id' => 2],
- ['id' => 3],
- ['id' => 4],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [id] does not contain [5].');
- $assert->whereContains('id', [1, 2, 3, 4, 5]);
- }
- public function testAssertWhereContainsFailsWhenDoesNotMatchType()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain [1].');
- $assert->whereContains('foo', ['1']);
- }
- public function testAssertWhereContainsFailsWhenDoesNotSatisfyClosure()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain a value that passes the truth test within the given closure.');
- $assert->whereContains('foo', [function ($actual) {
- return $actual === 5;
- }]);
- }
- public function testAssertWhereContainsFailsWhenHavingExpectedValueButDoesNotSatisfyClosure()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain a value that passes the truth test within the given closure.');
- $assert->whereContains('foo', [1, function ($actual) {
- return $actual === 5;
- }]);
- }
- public function testAssertWhereContainsFailsWhenSatisfiesClosureButDoesNotHaveExpectedValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] does not contain [5].');
- $assert->whereContains('foo', [5, function ($actual) {
- return $actual === 1;
- }]);
- }
- public function testAssertWhereContainsWithNestedValue()
- {
- $assert = AssertableJson::fromArray([
- ['id' => 1],
- ['id' => 2],
- ['id' => 3],
- ['id' => 4],
- ]);
- $assert->whereContains('id', 1);
- $assert->whereContains('id', [1, 2, 3, 4]);
- $assert->whereContains('id', [4, 3, 2, 1]);
- }
- public function testAssertWhereContainsWithMatchingType()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $assert->whereContains('foo', 1);
- $assert->whereContains('foo', [1]);
- }
- public function testAssertWhereContainsWithNullValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => null,
- ]);
- $assert->whereContains('foo', null);
- $assert->whereContains('foo', [null]);
- }
- public function testAssertWhereContainsWithOutOfOrderMatchingType()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [4, 1, 7, 3],
- ]);
- $assert->whereContains('foo', [1, 7, 4, 3]);
- }
- public function testAssertWhereContainsWithOutOfOrderNestedMatchingType()
- {
- $assert = AssertableJson::fromArray([
- ['bar' => 5],
- ['baz' => 4],
- ['zal' => 8],
- ]);
- $assert->whereContains('baz', 4);
- }
- public function testAssertWhereContainsWithClosure()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $assert->whereContains('foo', function ($actual) {
- return $actual % 3 === 0;
- });
- }
- public function testAssertWhereContainsWithNestedClosure()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 1,
- 'bar' => 2,
- 'baz' => 3,
- ]);
- $assert->whereContains('baz', function ($actual) {
- return $actual % 3 === 0;
- });
- }
- public function testAssertWhereContainsWithMultipleClosure()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [1, 2, 3, 4],
- ]);
- $assert->whereContains('foo', [
- function ($actual) {
- return $actual % 3 === 0;
- },
- function ($actual) {
- return $actual % 2 === 0;
- },
- ]);
- }
- public function testAssertWhereContainsWithNullExpectation()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 1,
- ]);
- $assert->whereContains('foo', null);
- }
- public function testAssertNestedWhereMatchesValue()
- {
- $assert = AssertableJson::fromArray([
- 'example' => [
- 'nested' => 'nested-value',
- ],
- ]);
- $assert->where('example.nested', 'nested-value');
- }
- public function testAssertNestedWhereFailsWhenDoesNotMatchValue()
- {
- $assert = AssertableJson::fromArray([
- 'example' => [
- 'nested' => 'nested-value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [example.nested] does not match the expected value.');
- $assert->where('example.nested', 'another-value');
- }
- public function testScope()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $called = false;
- $assert->has('bar', function (AssertableJson $assert) use (&$called) {
- $called = true;
- $assert
- ->where('baz', 'example')
- ->where('prop', 'value');
- });
- $this->assertTrue($called, 'The scoped query was never actually called.');
- }
- public function testScopeFailsWhenPropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] does not exist.');
- $assert->has('baz', function (AssertableJson $item) {
- $item->where('baz', 'example');
- });
- }
- public function testScopeFailsWhenPropSingleValue()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => 'value',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] is not scopeable.');
- $assert->has('bar', function (AssertableJson $item) {
- //
- });
- }
- public function testScopeShorthand()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- ['key' => 'first'],
- ['key' => 'second'],
- ],
- ]);
- $called = false;
- $assert->has('bar', 2, function (AssertableJson $item) use (&$called) {
- $item->where('key', 'first');
- $called = true;
- });
- $this->assertTrue($called, 'The scoped query was never actually called.');
- }
- public function testScopeShorthandWithoutCount()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- ['key' => 'first'],
- ['key' => 'second'],
- ],
- ]);
- $called = false;
- $assert->has('bar', null, function (AssertableJson $item) use (&$called) {
- $item->where('key', 'first');
- $called = true;
- });
- $this->assertTrue($called, 'The scoped query was never actually called.');
- }
- public function testScopeShorthandFailsWhenAssertingZeroItems()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- ['key' => 'first'],
- ['key' => 'second'],
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not have the expected size.');
- $assert->has('bar', 0, function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testScopeShorthandFailsWhenAmountOfItemsDoesNotMatch()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- ['key' => 'first'],
- ['key' => 'second'],
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [bar] does not have the expected size.');
- $assert->has('bar', 1, function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testScopeShorthandFailsWhenAssertingEmptyArray()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage(
- 'Cannot scope directly onto the first element of property [bar] because it is empty.'
- );
- $assert->has('bar', 0, function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testScopeShorthandFailsWhenAssertingEmptyArrayWithoutCount()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage(
- 'Cannot scope directly onto the first element of property [bar] because it is empty.'
- );
- $assert->has('bar', null, function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testScopeShorthandFailsWhenSecondArgumentUnsupportedType()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- ['key' => 'first'],
- ['key' => 'second'],
- ],
- ]);
- $this->expectException(TypeError::class);
- $assert->has('bar', 'invalid', function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testFirstScope()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'key' => 'first',
- ],
- 'bar' => [
- 'key' => 'second',
- ],
- ]);
- $assert->first(function (AssertableJson $item) {
- $item->where('key', 'first');
- });
- }
- public function testFirstScopeFailsWhenNoProps()
- {
- $assert = AssertableJson::fromArray([]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Cannot scope directly onto the first element of the root level because it is empty.');
- $assert->first(function (AssertableJson $item) {
- //
- });
- }
- public function testFirstNestedScopeFailsWhenNoProps()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Cannot scope directly onto the first element of property [foo] because it is empty.');
- $assert->has('foo', function (AssertableJson $assert) {
- $assert->first(function (AssertableJson $item) {
- //
- });
- });
- }
- public function testFirstScopeFailsWhenPropSingleValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] is not scopeable.');
- $assert->first(function (AssertableJson $item) {
- //
- });
- }
- public function testEachScope()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'key' => 'first',
- ],
- 'bar' => [
- 'key' => 'second',
- ],
- ]);
- $assert->each(function (AssertableJson $item) {
- $item->whereType('key', 'string');
- });
- }
- public function testEachScopeFailsWhenNoProps()
- {
- $assert = AssertableJson::fromArray([]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Cannot scope directly onto each element of the root level because it is empty.');
- $assert->each(function (AssertableJson $item) {
- //
- });
- }
- public function testEachNestedScopeFailsWhenNoProps()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Cannot scope directly onto each element of property [foo] because it is empty.');
- $assert->has('foo', function (AssertableJson $assert) {
- $assert->each(function (AssertableJson $item) {
- //
- });
- });
- }
- public function testEachScopeFailsWhenPropSingleValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] is not scopeable.');
- $assert->each(function (AssertableJson $item) {
- //
- });
- }
- public function testFailsWhenNotInteractingWithAllPropsInScope()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Unexpected properties were found in scope [bar].');
- $assert->has('bar', function (AssertableJson $item) {
- $item->where('baz', 'example');
- });
- }
- public function testDisableInteractionCheckForCurrentScope()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $assert->has('bar', function (AssertableJson $item) {
- $item->etc();
- });
- }
- public function testCannotDisableInteractionCheckForDifferentScopes()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => [
- 'foo' => 'bar',
- 'example' => 'value',
- ],
- 'prop' => 'value',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Unexpected properties were found in scope [bar.baz].');
- $assert->has('bar', function (AssertableJson $item) {
- $item
- ->etc()
- ->has('baz', function (AssertableJson $item) {
- //
- });
- });
- }
- public function testTopLevelPropInteractionDisabledByDefault()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- 'bar' => 'baz',
- ]);
- $assert->has('foo');
- }
- public function testTopLevelInteractionEnabledWhenInteractedFlagSet()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- 'bar' => 'baz',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Unexpected properties were found on the root level.');
- $assert
- ->has('foo')
- ->interacted();
- }
- public function testAssertWhereAllMatchesValues()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'bar' => 'value',
- 'example' => ['hello' => 'world'],
- ],
- 'baz' => 'another',
- ]);
- $assert->whereAll([
- 'foo.bar' => 'value',
- 'foo.example' => ArrayableStubObject::make(['hello' => 'world']),
- 'baz' => function ($value) {
- return $value === 'another';
- },
- ]);
- }
- public function testAssertWhereAllFailsWhenAtLeastOnePropDoesNotMatchValue()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- 'baz' => 'example',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] was marked as invalid using a closure.');
- $assert->whereAll([
- 'foo' => 'bar',
- 'baz' => function ($value) {
- return $value === 'foo';
- },
- ]);
- }
- public function testAssertWhereTypeString()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $assert->whereType('foo', 'string');
- }
- public function testAssertWhereTypeInteger()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 123,
- ]);
- $assert->whereType('foo', 'integer');
- }
- public function testAssertWhereTypeBoolean()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => true,
- ]);
- $assert->whereType('foo', 'boolean');
- }
- public function testAssertWhereTypeDouble()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 12.3,
- ]);
- $assert->whereType('foo', 'double');
- }
- public function testAssertWhereTypeArray()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => ['bar', 'baz'],
- 'bar' => ['foo' => 'baz'],
- ]);
- $assert->whereType('foo', 'array');
- $assert->whereType('bar', 'array');
- }
- public function testAssertWhereTypeNull()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => null,
- ]);
- $assert->whereType('foo', 'null');
- }
- public function testAssertWhereAllType()
- {
- $assert = AssertableJson::fromArray([
- 'one' => 'foo',
- 'two' => 123,
- 'three' => true,
- 'four' => 12.3,
- 'five' => ['foo', 'bar'],
- 'six' => ['foo' => 'bar'],
- 'seven' => null,
- ]);
- $assert->whereAllType([
- 'one' => 'string',
- 'two' => 'integer',
- 'three' => 'boolean',
- 'four' => 'double',
- 'five' => 'array',
- 'six' => 'array',
- 'seven' => 'null',
- ]);
- }
- public function testAssertWhereTypeWhenWrongTypeIsGiven()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] is not of expected type [integer].');
- $assert->whereType('foo', 'integer');
- }
- public function testAssertWhereTypeWithUnionTypes()
- {
- $firstAssert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $secondAssert = AssertableJson::fromArray([
- 'foo' => null,
- ]);
- $firstAssert->whereType('foo', ['string', 'null']);
- $secondAssert->whereType('foo', ['string', 'null']);
- }
- public function testAssertWhereTypeWhenWrongUnionTypeIsGiven()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 123,
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] is not of expected type [string|null].');
- $assert->whereType('foo', ['string', 'null']);
- }
- public function testAssertWhereTypeWithPipeInUnionType()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $assert->whereType('foo', 'string|null');
- }
- public function testAssertWhereTypeWithPipeInWrongUnionType()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => 'bar',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo] is not of expected type [integer|null].');
- $assert->whereType('foo', 'integer|null');
- }
- public function testAssertHasAll()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'bar' => 'value',
- 'example' => ['hello' => 'world'],
- ],
- 'baz' => 'another',
- ]);
- $assert->hasAll([
- 'foo.bar',
- 'foo.example',
- 'baz',
- ]);
- }
- public function testAssertHasAllFailsWhenAtLeastOnePropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'bar' => 'value',
- 'example' => ['hello' => 'world'],
- ],
- 'baz' => 'another',
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo.baz] does not exist.');
- $assert->hasAll([
- 'foo.bar',
- 'foo.baz',
- 'baz',
- ]);
- }
- public function testAssertHasAllAcceptsMultipleArgumentsInsteadOfArray()
- {
- $assert = AssertableJson::fromArray([
- 'foo' => [
- 'bar' => 'value',
- 'example' => ['hello' => 'world'],
- ],
- 'baz' => 'another',
- ]);
- $assert->hasAll('foo.bar', 'foo.example', 'baz');
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [foo.baz] does not exist.');
- $assert->hasAll('foo.bar', 'foo.baz', 'baz');
- }
- public function testAssertCountMultipleProps()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'key' => 'value',
- 'prop' => 'example',
- ],
- 'baz' => [
- 'another' => 'value',
- ],
- ]);
- $assert->hasAll([
- 'bar' => 2,
- 'baz' => 1,
- ]);
- }
- public function testAssertCountMultiplePropsFailsWhenPropMissing()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'key' => 'value',
- 'prop' => 'example',
- ],
- ]);
- $this->expectException(AssertionFailedError::class);
- $this->expectExceptionMessage('Property [baz] does not exist.');
- $assert->hasAll([
- 'bar' => 2,
- 'baz' => 1,
- ]);
- }
- public function testMacroable()
- {
- AssertableJson::macro('myCustomMacro', function () {
- throw new RuntimeException('My Custom Macro was called!');
- });
- $this->expectException(RuntimeException::class);
- $this->expectExceptionMessage('My Custom Macro was called!');
- $assert = AssertableJson::fromArray(['foo' => 'bar']);
- $assert->myCustomMacro();
- }
- public function testTappable()
- {
- $assert = AssertableJson::fromArray([
- 'bar' => [
- 'baz' => 'example',
- 'prop' => 'value',
- ],
- ]);
- $called = false;
- $assert->has('bar', function (AssertableJson $assert) use (&$called) {
- $assert->etc();
- $assert->tap(function (AssertableJson $assert) use (&$called) {
- $called = true;
- });
- });
- $this->assertTrue($called, 'The scoped query was never actually called.');
- }
- }
|