1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725 |
- <?php
- namespace Illuminate\Tests\Database;
- use DateTime;
- use DateTimeImmutable;
- use DateTimeInterface;
- use Exception;
- use Foo\Bar\EloquentModelNamespacedStub;
- use Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes;
- use Illuminate\Contracts\Events\Dispatcher;
- use Illuminate\Database\Connection;
- use Illuminate\Database\ConnectionResolverInterface;
- use Illuminate\Database\ConnectionResolverInterface as Resolver;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\Eloquent\Casts\ArrayObject;
- use Illuminate\Database\Eloquent\Casts\AsArrayObject;
- use Illuminate\Database\Eloquent\Casts\AsCollection;
- use Illuminate\Database\Eloquent\Casts\AsStringable;
- use Illuminate\Database\Eloquent\Collection;
- use Illuminate\Database\Eloquent\JsonEncodingException;
- use Illuminate\Database\Eloquent\MassAssignmentException;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Database\Eloquent\Relations\BelongsTo;
- use Illuminate\Database\Eloquent\Relations\Relation;
- use Illuminate\Database\Query\Builder as BaseBuilder;
- use Illuminate\Database\Query\Grammars\Grammar;
- use Illuminate\Database\Query\Processors\Processor;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Collection as BaseCollection;
- use Illuminate\Support\InteractsWithTime;
- use Illuminate\Support\Str;
- use Illuminate\Support\Stringable;
- use InvalidArgumentException;
- use LogicException;
- use Mockery as m;
- use PHPUnit\Framework\TestCase;
- use ReflectionClass;
- use stdClass;
- class DatabaseEloquentModelTest extends TestCase
- {
- use InteractsWithTime;
- protected function setUp(): void
- {
- parent::setUp();
- Carbon::setTestNow(Carbon::now());
- }
- protected function tearDown(): void
- {
- parent::tearDown();
- m::close();
- Carbon::setTestNow(null);
- Model::unsetEventDispatcher();
- Carbon::resetToStringFormat();
- }
- public function testAttributeManipulation()
- {
- $model = new EloquentModelStub;
- $model->name = 'foo';
- $this->assertSame('foo', $model->name);
- $this->assertTrue(isset($model->name));
- unset($model->name);
- $this->assertFalse(isset($model->name));
- // test mutation
- $model->list_items = ['name' => 'taylor'];
- $this->assertEquals(['name' => 'taylor'], $model->list_items);
- $attributes = $model->getAttributes();
- $this->assertSame(json_encode(['name' => 'taylor']), $attributes['list_items']);
- }
- public function testSetAttributeWithNumericKey()
- {
- $model = new EloquentDateModelStub;
- $model->setAttribute(0, 'value');
- $this->assertEquals([0 => 'value'], $model->getAttributes());
- }
- public function testDirtyAttributes()
- {
- $model = new EloquentModelStub(['foo' => '1', 'bar' => 2, 'baz' => 3]);
- $model->syncOriginal();
- $model->foo = 1;
- $model->bar = 20;
- $model->baz = 30;
- $this->assertTrue($model->isDirty());
- $this->assertFalse($model->isDirty('foo'));
- $this->assertTrue($model->isDirty('bar'));
- $this->assertTrue($model->isDirty('foo', 'bar'));
- $this->assertTrue($model->isDirty(['foo', 'bar']));
- }
- public function testIntAndNullComparisonWhenDirty()
- {
- $model = new EloquentModelCastingStub;
- $model->intAttribute = null;
- $model->syncOriginal();
- $this->assertFalse($model->isDirty('intAttribute'));
- $model->forceFill(['intAttribute' => 0]);
- $this->assertTrue($model->isDirty('intAttribute'));
- }
- public function testFloatAndNullComparisonWhenDirty()
- {
- $model = new EloquentModelCastingStub;
- $model->floatAttribute = null;
- $model->syncOriginal();
- $this->assertFalse($model->isDirty('floatAttribute'));
- $model->forceFill(['floatAttribute' => 0.0]);
- $this->assertTrue($model->isDirty('floatAttribute'));
- }
- public function testDirtyOnCastOrDateAttributes()
- {
- $model = new EloquentModelCastingStub;
- $model->setDateFormat('Y-m-d H:i:s');
- $model->boolAttribute = 1;
- $model->foo = 1;
- $model->bar = '2017-03-18';
- $model->dateAttribute = '2017-03-18';
- $model->datetimeAttribute = '2017-03-23 22:17:00';
- $model->syncOriginal();
- $model->boolAttribute = true;
- $model->foo = true;
- $model->bar = '2017-03-18 00:00:00';
- $model->dateAttribute = '2017-03-18 00:00:00';
- $model->datetimeAttribute = null;
- $this->assertTrue($model->isDirty());
- $this->assertTrue($model->isDirty('foo'));
- $this->assertTrue($model->isDirty('bar'));
- $this->assertFalse($model->isDirty('boolAttribute'));
- $this->assertFalse($model->isDirty('dateAttribute'));
- $this->assertTrue($model->isDirty('datetimeAttribute'));
- }
- public function testDirtyOnCastedObjects()
- {
- $model = new EloquentModelCastingStub;
- $model->setRawAttributes([
- 'objectAttribute' => '["one", "two", "three"]',
- 'collectionAttribute' => '["one", "two", "three"]',
- ]);
- $model->syncOriginal();
- $model->objectAttribute = ['one', 'two', 'three'];
- $model->collectionAttribute = ['one', 'two', 'three'];
- $this->assertFalse($model->isDirty());
- $this->assertFalse($model->isDirty('objectAttribute'));
- $this->assertFalse($model->isDirty('collectionAttribute'));
- }
- public function testDirtyOnCastedArrayObject()
- {
- $model = new EloquentModelCastingStub;
- $model->setRawAttributes([
- 'asarrayobjectAttribute' => '{"foo": "bar"}',
- ]);
- $model->syncOriginal();
- $this->assertInstanceOf(ArrayObject::class, $model->asarrayobjectAttribute);
- $this->assertFalse($model->isDirty('asarrayobjectAttribute'));
- $model->asarrayobjectAttribute = ['foo' => 'bar'];
- $this->assertFalse($model->isDirty('asarrayobjectAttribute'));
- $model->asarrayobjectAttribute = ['foo' => 'baz'];
- $this->assertTrue($model->isDirty('asarrayobjectAttribute'));
- }
- public function testDirtyOnCastedCollection()
- {
- $model = new EloquentModelCastingStub;
- $model->setRawAttributes([
- 'ascollectionAttribute' => '{"foo": "bar"}',
- ]);
- $model->syncOriginal();
- $this->assertInstanceOf(BaseCollection::class, $model->ascollectionAttribute);
- $this->assertFalse($model->isDirty('ascollectionAttribute'));
- $model->ascollectionAttribute = ['foo' => 'bar'];
- $this->assertFalse($model->isDirty('ascollectionAttribute'));
- $model->ascollectionAttribute = ['foo' => 'baz'];
- $this->assertTrue($model->isDirty('ascollectionAttribute'));
- }
- public function testDirtyOnCastedStringable()
- {
- $model = new EloquentModelCastingStub;
- $model->setRawAttributes([
- 'asStringableAttribute' => 'foo bar',
- ]);
- $model->syncOriginal();
- $this->assertInstanceOf(Stringable::class, $model->asStringableAttribute);
- $this->assertFalse($model->isDirty('asStringableAttribute'));
- $model->asStringableAttribute = Str::of('foo bar');
- $this->assertFalse($model->isDirty('asStringableAttribute'));
- $model->asStringableAttribute = Str::of('foo baz');
- $this->assertTrue($model->isDirty('asStringableAttribute'));
- }
- public function testCleanAttributes()
- {
- $model = new EloquentModelStub(['foo' => '1', 'bar' => 2, 'baz' => 3]);
- $model->syncOriginal();
- $model->foo = 1;
- $model->bar = 20;
- $model->baz = 30;
- $this->assertFalse($model->isClean());
- $this->assertTrue($model->isClean('foo'));
- $this->assertFalse($model->isClean('bar'));
- $this->assertFalse($model->isClean('foo', 'bar'));
- $this->assertFalse($model->isClean(['foo', 'bar']));
- }
- public function testCleanWhenFloatUpdateAttribute()
- {
- // test is equivalent
- $model = new EloquentModelStub(['castedFloat' => 8 - 6.4]);
- $model->syncOriginal();
- $model->castedFloat = 1.6;
- $this->assertTrue($model->originalIsEquivalent('castedFloat'));
- // test is not equivalent
- $model = new EloquentModelStub(['castedFloat' => 5.6]);
- $model->syncOriginal();
- $model->castedFloat = 5.5;
- $this->assertFalse($model->originalIsEquivalent('castedFloat'));
- }
- public function testCalculatedAttributes()
- {
- $model = new EloquentModelStub;
- $model->password = 'secret';
- $attributes = $model->getAttributes();
- // ensure password attribute was not set to null
- $this->assertArrayNotHasKey('password', $attributes);
- $this->assertSame('******', $model->password);
- $hash = 'e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4';
- $this->assertEquals($hash, $attributes['password_hash']);
- $this->assertEquals($hash, $model->password_hash);
- }
- public function testArrayAccessToAttributes()
- {
- $model = new EloquentModelStub(['attributes' => 1, 'connection' => 2, 'table' => 3]);
- unset($model['table']);
- $this->assertTrue(isset($model['attributes']));
- $this->assertEquals(1, $model['attributes']);
- $this->assertTrue(isset($model['connection']));
- $this->assertEquals(2, $model['connection']);
- $this->assertFalse(isset($model['table']));
- $this->assertEquals(null, $model['table']);
- $this->assertFalse(isset($model['with']));
- }
- public function testOnly()
- {
- $model = new EloquentModelStub;
- $model->first_name = 'taylor';
- $model->last_name = 'otwell';
- $model->project = 'laravel';
- $this->assertEquals(['project' => 'laravel'], $model->only('project'));
- $this->assertEquals(['first_name' => 'taylor', 'last_name' => 'otwell'], $model->only('first_name', 'last_name'));
- $this->assertEquals(['first_name' => 'taylor', 'last_name' => 'otwell'], $model->only(['first_name', 'last_name']));
- }
- public function testNewInstanceReturnsNewInstanceWithAttributesSet()
- {
- $model = new EloquentModelStub;
- $instance = $model->newInstance(['name' => 'taylor']);
- $this->assertInstanceOf(EloquentModelStub::class, $instance);
- $this->assertSame('taylor', $instance->name);
- }
- public function testNewInstanceReturnsNewInstanceWithTableSet()
- {
- $model = new EloquentModelStub;
- $model->setTable('test');
- $newInstance = $model->newInstance();
- $this->assertSame('test', $newInstance->getTable());
- }
- public function testNewInstanceReturnsNewInstanceWithMergedCasts()
- {
- $model = new EloquentModelStub;
- $model->mergeCasts(['foo' => 'date']);
- $newInstance = $model->newInstance();
- $this->assertArrayHasKey('foo', $newInstance->getCasts());
- $this->assertSame('date', $newInstance->getCasts()['foo']);
- }
- public function testCreateMethodSavesNewModel()
- {
- $_SERVER['__eloquent.saved'] = false;
- $model = EloquentModelSaveStub::create(['name' => 'taylor']);
- $this->assertTrue($_SERVER['__eloquent.saved']);
- $this->assertSame('taylor', $model->name);
- }
- public function testMakeMethodDoesNotSaveNewModel()
- {
- $_SERVER['__eloquent.saved'] = false;
- $model = EloquentModelSaveStub::make(['name' => 'taylor']);
- $this->assertFalse($_SERVER['__eloquent.saved']);
- $this->assertSame('taylor', $model->name);
- }
- public function testForceCreateMethodSavesNewModelWithGuardedAttributes()
- {
- $_SERVER['__eloquent.saved'] = false;
- $model = EloquentModelSaveStub::forceCreate(['id' => 21]);
- $this->assertTrue($_SERVER['__eloquent.saved']);
- $this->assertEquals(21, $model->id);
- }
- public function testFindMethodUseWritePdo()
- {
- EloquentModelFindWithWritePdoStub::onWriteConnection()->find(1);
- }
- public function testDestroyMethodCallsQueryBuilderCorrectly()
- {
- EloquentModelDestroyStub::destroy(1, 2, 3);
- }
- public function testDestroyMethodCallsQueryBuilderCorrectlyWithCollection()
- {
- EloquentModelDestroyStub::destroy(new BaseCollection([1, 2, 3]));
- }
- public function testDestroyMethodCallsQueryBuilderCorrectlyWithEloquentCollection()
- {
- EloquentModelDestroyStub::destroy(new Collection([
- new EloquentModelDestroyStub(['id' => 1]),
- new EloquentModelDestroyStub(['id' => 2]),
- new EloquentModelDestroyStub(['id' => 3]),
- ]));
- }
- public function testDestroyMethodCallsQueryBuilderCorrectlyWithMultipleArgs()
- {
- EloquentModelDestroyStub::destroy(1, 2, 3);
- }
- public function testDestroyMethodCallsQueryBuilderCorrectlyWithEmptyIds()
- {
- $count = EloquentModelEmptyDestroyStub::destroy([]);
- $this->assertSame(0, $count);
- }
- public function testWithMethodCallsQueryBuilderCorrectly()
- {
- $result = EloquentModelWithStub::with('foo', 'bar');
- $this->assertSame('foo', $result);
- }
- public function testWithoutMethodRemovesEagerLoadedRelationshipCorrectly()
- {
- $model = new EloquentModelWithoutRelationStub;
- $this->addMockConnection($model);
- $instance = $model->newInstance()->newQuery()->without('foo');
- $this->assertEmpty($instance->getEagerLoads());
- }
- public function testWithOnlyMethodLoadsRelationshipCorrectly()
- {
- $model = new EloquentModelWithoutRelationStub();
- $this->addMockConnection($model);
- $instance = $model->newInstance()->newQuery()->withOnly('taylor');
- $this->assertNotNull($instance->getEagerLoads()['taylor']);
- $this->assertArrayNotHasKey('foo', $instance->getEagerLoads());
- }
- public function testEagerLoadingWithColumns()
- {
- $model = new EloquentModelWithoutRelationStub;
- $instance = $model->newInstance()->newQuery()->with('foo:bar,baz', 'hadi');
- $builder = m::mock(Builder::class);
- $builder->shouldReceive('select')->once()->with(['bar', 'baz']);
- $this->assertNotNull($instance->getEagerLoads()['hadi']);
- $this->assertNotNull($instance->getEagerLoads()['foo']);
- $closure = $instance->getEagerLoads()['foo'];
- $closure($builder);
- }
- public function testWithMethodCallsQueryBuilderCorrectlyWithArray()
- {
- $result = EloquentModelWithStub::with(['foo', 'bar']);
- $this->assertSame('foo', $result);
- }
- public function testUpdateProcess()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('where')->once()->with('id', '=', 1);
- $query->shouldReceive('update')->once()->with(['name' => 'taylor'])->andReturn(1);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.updating: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.updated: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.saved: '.get_class($model), $model)->andReturn(true);
- $model->id = 1;
- $model->foo = 'bar';
- // make sure foo isn't synced so we can test that dirty attributes only are updated
- $model->syncOriginal();
- $model->name = 'taylor';
- $model->exists = true;
- $this->assertTrue($model->save());
- }
- public function testUpdateProcessDoesntOverrideTimestamps()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('where')->once()->with('id', '=', 1);
- $query->shouldReceive('update')->once()->with(['created_at' => 'foo', 'updated_at' => 'bar'])->andReturn(1);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until');
- $events->shouldReceive('dispatch');
- $model->id = 1;
- $model->syncOriginal();
- $model->created_at = 'foo';
- $model->updated_at = 'bar';
- $model->exists = true;
- $this->assertTrue($model->save());
- }
- public function testSaveIsCanceledIfSavingEventReturnsFalse()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery'])->getMock();
- $query = m::mock(Builder::class);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(false);
- $model->exists = true;
- $this->assertFalse($model->save());
- }
- public function testUpdateIsCanceledIfUpdatingEventReturnsFalse()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery'])->getMock();
- $query = m::mock(Builder::class);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.updating: '.get_class($model), $model)->andReturn(false);
- $model->exists = true;
- $model->foo = 'bar';
- $this->assertFalse($model->save());
- }
- public function testEventsCanBeFiredWithCustomEventObjects()
- {
- $model = $this->getMockBuilder(EloquentModelEventObjectStub::class)->onlyMethods(['newModelQuery'])->getMock();
- $query = m::mock(Builder::class);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with(m::type(EloquentModelSavingEventStub::class))->andReturn(false);
- $model->exists = true;
- $this->assertFalse($model->save());
- }
- public function testUpdateProcessWithoutTimestamps()
- {
- $model = $this->getMockBuilder(EloquentModelEventObjectStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'fireModelEvent'])->getMock();
- $model->timestamps = false;
- $query = m::mock(Builder::class);
- $query->shouldReceive('where')->once()->with('id', '=', 1);
- $query->shouldReceive('update')->once()->with(['name' => 'taylor'])->andReturn(1);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->never())->method('updateTimestamps');
- $model->expects($this->any())->method('fireModelEvent')->willReturn(true);
- $model->id = 1;
- $model->syncOriginal();
- $model->name = 'taylor';
- $model->exists = true;
- $this->assertTrue($model->save());
- }
- public function testUpdateUsesOldPrimaryKey()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('where')->once()->with('id', '=', 1);
- $query->shouldReceive('update')->once()->with(['id' => 2, 'foo' => 'bar'])->andReturn(1);
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.updating: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.updated: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.saved: '.get_class($model), $model)->andReturn(true);
- $model->id = 1;
- $model->syncOriginal();
- $model->id = 2;
- $model->foo = 'bar';
- $model->exists = true;
- $this->assertTrue($model->save());
- }
- public function testTimestampsAreReturnedAsObjects()
- {
- $model = $this->getMockBuilder(EloquentDateModelStub::class)->onlyMethods(['getDateFormat'])->getMock();
- $model->expects($this->any())->method('getDateFormat')->willReturn('Y-m-d');
- $model->setRawAttributes([
- 'created_at' => '2012-12-04',
- 'updated_at' => '2012-12-05',
- ]);
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $this->assertInstanceOf(Carbon::class, $model->updated_at);
- }
- public function testTimestampsAreReturnedAsObjectsFromPlainDatesAndTimestamps()
- {
- $model = $this->getMockBuilder(EloquentDateModelStub::class)->onlyMethods(['getDateFormat'])->getMock();
- $model->expects($this->any())->method('getDateFormat')->willReturn('Y-m-d H:i:s');
- $model->setRawAttributes([
- 'created_at' => '2012-12-04',
- 'updated_at' => $this->currentTime(),
- ]);
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $this->assertInstanceOf(Carbon::class, $model->updated_at);
- }
- public function testTimestampsAreReturnedAsObjectsOnCreate()
- {
- $timestamps = [
- 'created_at' => Carbon::now(),
- 'updated_at' => Carbon::now(),
- ];
- $model = new EloquentDateModelStub;
- Model::setConnectionResolver($resolver = m::mock(ConnectionResolverInterface::class));
- $resolver->shouldReceive('connection')->andReturn($mockConnection = m::mock(stdClass::class));
- $mockConnection->shouldReceive('getQueryGrammar')->andReturn($mockConnection);
- $mockConnection->shouldReceive('getDateFormat')->andReturn('Y-m-d H:i:s');
- $instance = $model->newInstance($timestamps);
- $this->assertInstanceOf(Carbon::class, $instance->updated_at);
- $this->assertInstanceOf(Carbon::class, $instance->created_at);
- }
- public function testDateTimeAttributesReturnNullIfSetToNull()
- {
- $timestamps = [
- 'created_at' => Carbon::now(),
- 'updated_at' => Carbon::now(),
- ];
- $model = new EloquentDateModelStub;
- Model::setConnectionResolver($resolver = m::mock(ConnectionResolverInterface::class));
- $resolver->shouldReceive('connection')->andReturn($mockConnection = m::mock(stdClass::class));
- $mockConnection->shouldReceive('getQueryGrammar')->andReturn($mockConnection);
- $mockConnection->shouldReceive('getDateFormat')->andReturn('Y-m-d H:i:s');
- $instance = $model->newInstance($timestamps);
- $instance->created_at = null;
- $this->assertNull($instance->created_at);
- }
- public function testTimestampsAreCreatedFromStringsAndIntegers()
- {
- $model = new EloquentDateModelStub;
- $model->created_at = '2013-05-22 00:00:00';
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $model = new EloquentDateModelStub;
- $model->created_at = $this->currentTime();
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $model = new EloquentDateModelStub;
- $model->created_at = 0;
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $model = new EloquentDateModelStub;
- $model->created_at = '2012-01-01';
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- }
- public function testFromDateTime()
- {
- $model = new EloquentModelStub;
- $value = Carbon::parse('2015-04-17 22:59:01');
- $this->assertSame('2015-04-17 22:59:01', $model->fromDateTime($value));
- $value = new DateTime('2015-04-17 22:59:01');
- $this->assertInstanceOf(DateTime::class, $value);
- $this->assertInstanceOf(DateTimeInterface::class, $value);
- $this->assertSame('2015-04-17 22:59:01', $model->fromDateTime($value));
- $value = new DateTimeImmutable('2015-04-17 22:59:01');
- $this->assertInstanceOf(DateTimeImmutable::class, $value);
- $this->assertInstanceOf(DateTimeInterface::class, $value);
- $this->assertSame('2015-04-17 22:59:01', $model->fromDateTime($value));
- $value = '2015-04-17 22:59:01';
- $this->assertSame('2015-04-17 22:59:01', $model->fromDateTime($value));
- $value = '2015-04-17';
- $this->assertSame('2015-04-17 00:00:00', $model->fromDateTime($value));
- $value = '2015-4-17';
- $this->assertSame('2015-04-17 00:00:00', $model->fromDateTime($value));
- $value = '1429311541';
- $this->assertSame('2015-04-17 22:59:01', $model->fromDateTime($value));
- $this->assertNull($model->fromDateTime(null));
- }
- public function testFromDateTimeMilliseconds()
- {
- $model = $this->getMockBuilder('Illuminate\Tests\Database\EloquentDateModelStub')->onlyMethods(['getDateFormat'])->getMock();
- $model->expects($this->any())->method('getDateFormat')->willReturn('Y-m-d H:s.vi');
- $model->setRawAttributes([
- 'created_at' => '2012-12-04 22:59.32130',
- ]);
- $this->assertInstanceOf(Carbon::class, $model->created_at);
- $this->assertSame('22:30:59.321000', $model->created_at->format('H:i:s.u'));
- }
- public function testInsertProcess()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.created: '.get_class($model), $model);
- $events->shouldReceive('dispatch')->once()->with('eloquent.saved: '.get_class($model), $model);
- $model->name = 'taylor';
- $model->exists = false;
- $this->assertTrue($model->save());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insert')->once()->with(['name' => 'taylor']);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->setIncrementing(false);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('dispatch')->once()->with('eloquent.created: '.get_class($model), $model);
- $events->shouldReceive('dispatch')->once()->with('eloquent.saved: '.get_class($model), $model);
- $model->name = 'taylor';
- $model->exists = false;
- $this->assertTrue($model->save());
- $this->assertNull($model->id);
- $this->assertTrue($model->exists);
- }
- public function testInsertIsCanceledIfCreatingEventReturnsFalse()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
- $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(false);
- $this->assertFalse($model->save());
- $this->assertFalse($model->exists);
- }
- public function testDeleteProperlyDeletesModel()
- {
- $model = $this->getMockBuilder(Model::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'touchOwners'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('where')->once()->with('id', '=', 1)->andReturn($query);
- $query->shouldReceive('delete')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('touchOwners');
- $model->exists = true;
- $model->id = 1;
- $model->delete();
- }
- public function testPushNoRelations()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->name = 'taylor';
- $model->exists = false;
- $this->assertTrue($model->push());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- }
- public function testPushEmptyOneRelation()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->name = 'taylor';
- $model->exists = false;
- $model->setRelation('relationOne', null);
- $this->assertTrue($model->push());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- $this->assertNull($model->relationOne);
- }
- public function testPushOneRelation()
- {
- $related1 = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'related1'], 'id')->andReturn(2);
- $query->shouldReceive('getConnection')->once();
- $related1->expects($this->once())->method('newModelQuery')->willReturn($query);
- $related1->expects($this->once())->method('updateTimestamps');
- $related1->name = 'related1';
- $related1->exists = false;
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->name = 'taylor';
- $model->exists = false;
- $model->setRelation('relationOne', $related1);
- $this->assertTrue($model->push());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- $this->assertEquals(2, $model->relationOne->id);
- $this->assertTrue($model->relationOne->exists);
- $this->assertEquals(2, $related1->id);
- $this->assertTrue($related1->exists);
- }
- public function testPushEmptyManyRelation()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->name = 'taylor';
- $model->exists = false;
- $model->setRelation('relationMany', new Collection([]));
- $this->assertTrue($model->push());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- $this->assertCount(0, $model->relationMany);
- }
- public function testPushManyRelation()
- {
- $related1 = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'related1'], 'id')->andReturn(2);
- $query->shouldReceive('getConnection')->once();
- $related1->expects($this->once())->method('newModelQuery')->willReturn($query);
- $related1->expects($this->once())->method('updateTimestamps');
- $related1->name = 'related1';
- $related1->exists = false;
- $related2 = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'related2'], 'id')->andReturn(3);
- $query->shouldReceive('getConnection')->once();
- $related2->expects($this->once())->method('newModelQuery')->willReturn($query);
- $related2->expects($this->once())->method('updateTimestamps');
- $related2->name = 'related2';
- $related2->exists = false;
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with(['name' => 'taylor'], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $model->expects($this->once())->method('updateTimestamps');
- $model->name = 'taylor';
- $model->exists = false;
- $model->setRelation('relationMany', new Collection([$related1, $related2]));
- $this->assertTrue($model->push());
- $this->assertEquals(1, $model->id);
- $this->assertTrue($model->exists);
- $this->assertCount(2, $model->relationMany);
- $this->assertEquals([2, 3], $model->relationMany->pluck('id')->all());
- }
- public function testNewQueryReturnsEloquentQueryBuilder()
- {
- $conn = m::mock(Connection::class);
- $grammar = m::mock(Grammar::class);
- $processor = m::mock(Processor::class);
- EloquentModelStub::setConnectionResolver($resolver = m::mock(ConnectionResolverInterface::class));
- $conn->shouldReceive('query')->andReturnUsing(function () use ($conn, $grammar, $processor) {
- return new BaseBuilder($conn, $grammar, $processor);
- });
- $resolver->shouldReceive('connection')->andReturn($conn);
- $model = new EloquentModelStub;
- $builder = $model->newQuery();
- $this->assertInstanceOf(Builder::class, $builder);
- }
- public function testGetAndSetTableOperations()
- {
- $model = new EloquentModelStub;
- $this->assertSame('stub', $model->getTable());
- $model->setTable('foo');
- $this->assertSame('foo', $model->getTable());
- }
- public function testGetKeyReturnsValueOfPrimaryKey()
- {
- $model = new EloquentModelStub;
- $model->id = 1;
- $this->assertEquals(1, $model->getKey());
- $this->assertSame('id', $model->getKeyName());
- }
- public function testConnectionManagement()
- {
- EloquentModelStub::setConnectionResolver($resolver = m::mock(ConnectionResolverInterface::class));
- $model = m::mock(EloquentModelStub::class.'[getConnectionName,connection]');
- $retval = $model->setConnection('foo');
- $this->assertEquals($retval, $model);
- $this->assertSame('foo', $model->connection);
- $model->shouldReceive('getConnectionName')->once()->andReturn('somethingElse');
- $resolver->shouldReceive('connection')->once()->with('somethingElse')->andReturn('bar');
- $this->assertSame('bar', $model->getConnection());
- }
- public function testToArray()
- {
- $model = new EloquentModelStub;
- $model->name = 'foo';
- $model->age = null;
- $model->password = 'password1';
- $model->setHidden(['password']);
- $model->setRelation('names', new BaseCollection([
- new EloquentModelStub(['bar' => 'baz']), new EloquentModelStub(['bam' => 'boom']),
- ]));
- $model->setRelation('partner', new EloquentModelStub(['name' => 'abby']));
- $model->setRelation('group', null);
- $model->setRelation('multi', new BaseCollection);
- $array = $model->toArray();
- $this->assertIsArray($array);
- $this->assertSame('foo', $array['name']);
- $this->assertSame('baz', $array['names'][0]['bar']);
- $this->assertSame('boom', $array['names'][1]['bam']);
- $this->assertSame('abby', $array['partner']['name']);
- $this->assertNull($array['group']);
- $this->assertEquals([], $array['multi']);
- $this->assertFalse(isset($array['password']));
- $model->setAppends(['appendable']);
- $array = $model->toArray();
- $this->assertSame('appended', $array['appendable']);
- }
- public function testVisibleCreatesArrayWhitelist()
- {
- $model = new EloquentModelStub;
- $model->setVisible(['name']);
- $model->name = 'Taylor';
- $model->age = 26;
- $array = $model->toArray();
- $this->assertEquals(['name' => 'Taylor'], $array);
- }
- public function testHiddenCanAlsoExcludeRelationships()
- {
- $model = new EloquentModelStub;
- $model->name = 'Taylor';
- $model->setRelation('foo', ['bar']);
- $model->setHidden(['foo', 'list_items', 'password']);
- $array = $model->toArray();
- $this->assertEquals(['name' => 'Taylor'], $array);
- }
- public function testGetArrayableRelationsFunctionExcludeHiddenRelationships()
- {
- $model = new EloquentModelStub;
- $class = new ReflectionClass($model);
- $method = $class->getMethod('getArrayableRelations');
- $method->setAccessible(true);
- $model->setRelation('foo', ['bar']);
- $model->setRelation('bam', ['boom']);
- $model->setHidden(['foo']);
- $array = $method->invokeArgs($model, []);
- $this->assertSame(['bam' => ['boom']], $array);
- }
- public function testToArraySnakeAttributes()
- {
- $model = new EloquentModelStub;
- $model->setRelation('namesList', new BaseCollection([
- new EloquentModelStub(['bar' => 'baz']), new EloquentModelStub(['bam' => 'boom']),
- ]));
- $array = $model->toArray();
- $this->assertSame('baz', $array['names_list'][0]['bar']);
- $this->assertSame('boom', $array['names_list'][1]['bam']);
- $model = new EloquentModelCamelStub;
- $model->setRelation('namesList', new BaseCollection([
- new EloquentModelStub(['bar' => 'baz']), new EloquentModelStub(['bam' => 'boom']),
- ]));
- $array = $model->toArray();
- $this->assertSame('baz', $array['namesList'][0]['bar']);
- $this->assertSame('boom', $array['namesList'][1]['bam']);
- }
- public function testToArrayUsesMutators()
- {
- $model = new EloquentModelStub;
- $model->list_items = [1, 2, 3];
- $array = $model->toArray();
- $this->assertEquals([1, 2, 3], $array['list_items']);
- }
- public function testHidden()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $model->setHidden(['age', 'id']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- }
- public function testVisible()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $model->setVisible(['name', 'id']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- }
- public function testDynamicHidden()
- {
- $model = new EloquentModelDynamicHiddenStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- }
- public function testWithHidden()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $model->setHidden(['age', 'id']);
- $model->makeVisible('age');
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayNotHasKey('id', $array);
- }
- public function testMakeHidden()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'address' => 'foobar', 'id' => 'baz']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayHasKey('address', $array);
- $this->assertArrayHasKey('id', $array);
- $array = $model->makeHidden('address')->toArray();
- $this->assertArrayNotHasKey('address', $array);
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayHasKey('id', $array);
- $array = $model->makeHidden(['name', 'age'])->toArray();
- $this->assertArrayNotHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- $this->assertArrayNotHasKey('address', $array);
- $this->assertArrayHasKey('id', $array);
- }
- public function testDynamicVisible()
- {
- $model = new EloquentModelDynamicVisibleStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- }
- public function testMakeVisibleIf()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']);
- $model->setHidden(['age', 'id']);
- $model->makeVisibleIf(true, 'age');
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayNotHasKey('id', $array);
- $model->setHidden(['age', 'id']);
- $model->makeVisibleIf(false, 'age');
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- $this->assertArrayNotHasKey('id', $array);
- $model->setHidden(['age', 'id']);
- $model->makeVisibleIf(function ($model) {
- return ! is_null($model->name);
- }, 'age');
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayNotHasKey('id', $array);
- }
- public function testMakeHiddenIf()
- {
- $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'address' => 'foobar', 'id' => 'baz']);
- $array = $model->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayHasKey('address', $array);
- $this->assertArrayHasKey('id', $array);
- $array = $model->makeHiddenIf(true, 'address')->toArray();
- $this->assertArrayNotHasKey('address', $array);
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayHasKey('id', $array);
- $model->makeVisible('address');
- $array = $model->makeHiddenIf(false, ['name', 'age'])->toArray();
- $this->assertArrayHasKey('name', $array);
- $this->assertArrayHasKey('age', $array);
- $this->assertArrayHasKey('address', $array);
- $this->assertArrayHasKey('id', $array);
- $array = $model->makeHiddenIf(function ($model) {
- return ! is_null($model->id);
- }, ['name', 'age'])->toArray();
- $this->assertArrayHasKey('address', $array);
- $this->assertArrayNotHasKey('name', $array);
- $this->assertArrayNotHasKey('age', $array);
- $this->assertArrayHasKey('id', $array);
- }
- public function testFillable()
- {
- $model = new EloquentModelStub;
- $model->fillable(['name', 'age']);
- $model->fill(['name' => 'foo', 'age' => 'bar']);
- $this->assertSame('foo', $model->name);
- $this->assertSame('bar', $model->age);
- }
- public function testQualifyColumn()
- {
- $model = new EloquentModelStub;
- $this->assertSame('stub.column', $model->qualifyColumn('column'));
- }
- public function testForceFillMethodFillsGuardedAttributes()
- {
- $model = (new EloquentModelSaveStub)->forceFill(['id' => 21]);
- $this->assertEquals(21, $model->id);
- }
- public function testFillingJSONAttributes()
- {
- $model = new EloquentModelStub;
- $model->fillable(['meta->name', 'meta->price', 'meta->size->width']);
- $model->fill(['meta->name' => 'foo', 'meta->price' => 'bar', 'meta->size->width' => 'baz']);
- $this->assertEquals(
- ['meta' => json_encode(['name' => 'foo', 'price' => 'bar', 'size' => ['width' => 'baz']])],
- $model->toArray()
- );
- $model = new EloquentModelStub(['meta' => json_encode(['name' => 'Taylor'])]);
- $model->fillable(['meta->name', 'meta->price', 'meta->size->width']);
- $model->fill(['meta->name' => 'foo', 'meta->price' => 'bar', 'meta->size->width' => 'baz']);
- $this->assertEquals(
- ['meta' => json_encode(['name' => 'foo', 'price' => 'bar', 'size' => ['width' => 'baz']])],
- $model->toArray()
- );
- }
- public function testUnguardAllowsAnythingToBeSet()
- {
- $model = new EloquentModelStub;
- EloquentModelStub::unguard();
- $model->guard(['*']);
- $model->fill(['name' => 'foo', 'age' => 'bar']);
- $this->assertSame('foo', $model->name);
- $this->assertSame('bar', $model->age);
- EloquentModelStub::unguard(false);
- }
- public function testUnderscorePropertiesAreNotFilled()
- {
- $model = new EloquentModelStub;
- $model->fill(['_method' => 'PUT']);
- $this->assertEquals([], $model->getAttributes());
- }
- public function testGuarded()
- {
- $model = new EloquentModelStub;
- EloquentModelStub::setConnectionResolver($resolver = m::mock(Resolver::class));
- $resolver->shouldReceive('connection')->andReturn($connection = m::mock(stdClass::class));
- $connection->shouldReceive('getSchemaBuilder->getColumnListing')->andReturn(['name', 'age', 'foo']);
- $model->guard(['name', 'age']);
- $model->fill(['name' => 'foo', 'age' => 'bar', 'foo' => 'bar']);
- $this->assertFalse(isset($model->name));
- $this->assertFalse(isset($model->age));
- $this->assertSame('bar', $model->foo);
- $model = new EloquentModelStub;
- $model->guard(['name', 'age']);
- $model->fill(['Foo' => 'bar']);
- $this->assertFalse(isset($model->Foo));
- }
- public function testFillableOverridesGuarded()
- {
- $model = new EloquentModelStub;
- $model->guard([]);
- $model->fillable(['age', 'foo']);
- $model->fill(['name' => 'foo', 'age' => 'bar', 'foo' => 'bar']);
- $this->assertFalse(isset($model->name));
- $this->assertSame('bar', $model->age);
- $this->assertSame('bar', $model->foo);
- }
- public function testGlobalGuarded()
- {
- $this->expectException(MassAssignmentException::class);
- $this->expectExceptionMessage('name');
- $model = new EloquentModelStub;
- $model->guard(['*']);
- $model->fill(['name' => 'foo', 'age' => 'bar', 'votes' => 'baz']);
- }
- public function testUnguardedRunsCallbackWhileBeingUnguarded()
- {
- $model = Model::unguarded(function () {
- return (new EloquentModelStub)->guard(['*'])->fill(['name' => 'Taylor']);
- });
- $this->assertSame('Taylor', $model->name);
- $this->assertFalse(Model::isUnguarded());
- }
- public function testUnguardedCallDoesNotChangeUnguardedState()
- {
- Model::unguard();
- $model = Model::unguarded(function () {
- return (new EloquentModelStub)->guard(['*'])->fill(['name' => 'Taylor']);
- });
- $this->assertSame('Taylor', $model->name);
- $this->assertTrue(Model::isUnguarded());
- Model::reguard();
- }
- public function testUnguardedCallDoesNotChangeUnguardedStateOnException()
- {
- try {
- Model::unguarded(function () {
- throw new Exception;
- });
- } catch (Exception $e) {
- // ignore the exception
- }
- $this->assertFalse(Model::isUnguarded());
- }
- public function testHasOneCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->hasOne(EloquentModelSaveStub::class);
- $this->assertSame('save_stub.eloquent_model_stub_id', $relation->getQualifiedForeignKeyName());
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->hasOne(EloquentModelSaveStub::class, 'foo');
- $this->assertSame('save_stub.foo', $relation->getQualifiedForeignKeyName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- }
- public function testMorphOneCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->morphOne(EloquentModelSaveStub::class, 'morph');
- $this->assertSame('save_stub.morph_id', $relation->getQualifiedForeignKeyName());
- $this->assertSame('save_stub.morph_type', $relation->getQualifiedMorphType());
- $this->assertEquals(EloquentModelStub::class, $relation->getMorphClass());
- }
- public function testCorrectMorphClassIsReturned()
- {
- Relation::morphMap(['alias' => 'AnotherModel']);
- $model = new EloquentModelStub;
- try {
- $this->assertEquals(EloquentModelStub::class, $model->getMorphClass());
- } finally {
- Relation::morphMap([], false);
- }
- }
- public function testHasManyCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->hasMany(EloquentModelSaveStub::class);
- $this->assertSame('save_stub.eloquent_model_stub_id', $relation->getQualifiedForeignKeyName());
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->hasMany(EloquentModelSaveStub::class, 'foo');
- $this->assertSame('save_stub.foo', $relation->getQualifiedForeignKeyName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- }
- public function testMorphManyCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->morphMany(EloquentModelSaveStub::class, 'morph');
- $this->assertSame('save_stub.morph_id', $relation->getQualifiedForeignKeyName());
- $this->assertSame('save_stub.morph_type', $relation->getQualifiedMorphType());
- $this->assertEquals(EloquentModelStub::class, $relation->getMorphClass());
- }
- public function testBelongsToCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->belongsToStub();
- $this->assertSame('belongs_to_stub_id', $relation->getForeignKeyName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->belongsToExplicitKeyStub();
- $this->assertSame('foo', $relation->getForeignKeyName());
- }
- public function testMorphToCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- // $this->morphTo();
- $model->setAttribute('morph_to_stub_type', EloquentModelSaveStub::class);
- $relation = $model->morphToStub();
- $this->assertSame('morph_to_stub_id', $relation->getForeignKeyName());
- $this->assertSame('morph_to_stub_type', $relation->getMorphType());
- $this->assertSame('morphToStub', $relation->getRelationName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- // $this->morphTo(null, 'type', 'id');
- $relation2 = $model->morphToStubWithKeys();
- $this->assertSame('id', $relation2->getForeignKeyName());
- $this->assertSame('type', $relation2->getMorphType());
- $this->assertSame('morphToStubWithKeys', $relation2->getRelationName());
- // $this->morphTo('someName');
- $relation3 = $model->morphToStubWithName();
- $this->assertSame('some_name_id', $relation3->getForeignKeyName());
- $this->assertSame('some_name_type', $relation3->getMorphType());
- $this->assertSame('someName', $relation3->getRelationName());
- // $this->morphTo('someName', 'type', 'id');
- $relation4 = $model->morphToStubWithNameAndKeys();
- $this->assertSame('id', $relation4->getForeignKeyName());
- $this->assertSame('type', $relation4->getMorphType());
- $this->assertSame('someName', $relation4->getRelationName());
- }
- public function testBelongsToManyCreatesProperRelation()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->belongsToMany(EloquentModelSaveStub::class);
- $this->assertSame('eloquent_model_save_stub_eloquent_model_stub.eloquent_model_stub_id', $relation->getQualifiedForeignPivotKeyName());
- $this->assertSame('eloquent_model_save_stub_eloquent_model_stub.eloquent_model_save_stub_id', $relation->getQualifiedRelatedPivotKeyName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- $this->assertEquals(__FUNCTION__, $relation->getRelationName());
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $relation = $model->belongsToMany(EloquentModelSaveStub::class, 'table', 'foreign', 'other');
- $this->assertSame('table.foreign', $relation->getQualifiedForeignPivotKeyName());
- $this->assertSame('table.other', $relation->getQualifiedRelatedPivotKeyName());
- $this->assertSame($model, $relation->getParent());
- $this->assertInstanceOf(EloquentModelSaveStub::class, $relation->getQuery()->getModel());
- }
- public function testRelationsWithVariedConnections()
- {
- // Has one
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasOne(EloquentNoConnectionModelStub::class);
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasOne(EloquentDifferentConnectionModelStub::class);
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- // Morph One
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->morphOne(EloquentNoConnectionModelStub::class, 'type');
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->morphOne(EloquentDifferentConnectionModelStub::class, 'type');
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- // Belongs to
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->belongsTo(EloquentNoConnectionModelStub::class);
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->belongsTo(EloquentDifferentConnectionModelStub::class);
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- // has many
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasMany(EloquentNoConnectionModelStub::class);
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasMany(EloquentDifferentConnectionModelStub::class);
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- // has many through
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasManyThrough(EloquentNoConnectionModelStub::class, EloquentModelSaveStub::class);
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->hasManyThrough(EloquentDifferentConnectionModelStub::class, EloquentModelSaveStub::class);
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- // belongs to many
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->belongsToMany(EloquentNoConnectionModelStub::class);
- $this->assertSame('non_default', $relation->getRelated()->getConnectionName());
- $model = new EloquentModelStub;
- $model->setConnection('non_default');
- $this->addMockConnection($model);
- $relation = $model->belongsToMany(EloquentDifferentConnectionModelStub::class);
- $this->assertSame('different_connection', $relation->getRelated()->getConnectionName());
- }
- public function testModelsAssumeTheirName()
- {
- require_once __DIR__.'/stubs/EloquentModelNamespacedStub.php';
- $model = new EloquentModelWithoutTableStub;
- $this->assertSame('eloquent_model_without_table_stubs', $model->getTable());
- $namespacedModel = new EloquentModelNamespacedStub;
- $this->assertSame('eloquent_model_namespaced_stubs', $namespacedModel->getTable());
- }
- public function testTheMutatorCacheIsPopulated()
- {
- $class = new EloquentModelStub;
- $expectedAttributes = [
- 'list_items',
- 'password',
- 'appendable',
- ];
- $this->assertEquals($expectedAttributes, $class->getMutatedAttributes());
- }
- public function testRouteKeyIsPrimaryKey()
- {
- $model = new EloquentModelNonIncrementingStub;
- $model->id = 'foo';
- $this->assertSame('foo', $model->getRouteKey());
- }
- public function testRouteNameIsPrimaryKeyName()
- {
- $model = new EloquentModelStub;
- $this->assertSame('id', $model->getRouteKeyName());
- }
- public function testCloneModelMakesAFreshCopyOfTheModel()
- {
- $class = new EloquentModelStub;
- $class->id = 1;
- $class->exists = true;
- $class->first = 'taylor';
- $class->last = 'otwell';
- $class->created_at = $class->freshTimestamp();
- $class->updated_at = $class->freshTimestamp();
- $class->setRelation('foo', ['bar']);
- $clone = $class->replicate();
- $this->assertNull($clone->id);
- $this->assertFalse($clone->exists);
- $this->assertSame('taylor', $clone->first);
- $this->assertSame('otwell', $clone->last);
- $this->assertArrayNotHasKey('created_at', $clone->getAttributes());
- $this->assertArrayNotHasKey('updated_at', $clone->getAttributes());
- $this->assertEquals(['bar'], $clone->foo);
- }
- public function testModelObserversCanBeAttachedToModels()
- {
- EloquentModelStub::setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@saved');
- $events->shouldReceive('forget');
- EloquentModelStub::observe(new EloquentTestObserverStub);
- EloquentModelStub::flushEventListeners();
- }
- public function testModelObserversCanBeAttachedToModelsWithString()
- {
- EloquentModelStub::setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@saved');
- $events->shouldReceive('forget');
- EloquentModelStub::observe(EloquentTestObserverStub::class);
- EloquentModelStub::flushEventListeners();
- }
- public function testModelObserversCanBeAttachedToModelsThroughAnArray()
- {
- EloquentModelStub::setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@saved');
- $events->shouldReceive('forget');
- EloquentModelStub::observe([EloquentTestObserverStub::class]);
- EloquentModelStub::flushEventListeners();
- }
- public function testThrowExceptionOnAttachingNotExistsModelObserverWithString()
- {
- $this->expectException(InvalidArgumentException::class);
- EloquentModelStub::observe(NotExistClass::class);
- }
- public function testThrowExceptionOnAttachingNotExistsModelObserversThroughAnArray()
- {
- $this->expectException(InvalidArgumentException::class);
- EloquentModelStub::observe([NotExistClass::class]);
- }
- public function testModelObserversCanBeAttachedToModelsThroughCallingObserveMethodOnlyOnce()
- {
- EloquentModelStub::setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelStub', EloquentTestObserverStub::class.'@saved');
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelStub', EloquentTestAnotherObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelStub', EloquentTestAnotherObserverStub::class.'@saved');
- $events->shouldReceive('forget');
- EloquentModelStub::observe([
- EloquentTestObserverStub::class,
- EloquentTestAnotherObserverStub::class,
- ]);
- EloquentModelStub::flushEventListeners();
- }
- public function testWithoutEventDispatcher()
- {
- EloquentModelSaveStub::setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('listen')->once()->with('eloquent.creating: Illuminate\Tests\Database\EloquentModelSaveStub', EloquentTestObserverStub::class.'@creating');
- $events->shouldReceive('listen')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelSaveStub', EloquentTestObserverStub::class.'@saved');
- $events->shouldNotReceive('until');
- $events->shouldNotReceive('dispatch');
- $events->shouldReceive('forget');
- EloquentModelSaveStub::observe(EloquentTestObserverStub::class);
- $model = EloquentModelSaveStub::withoutEvents(function () {
- $model = new EloquentModelSaveStub;
- $model->save();
- return $model;
- });
- $model->withoutEvents(function () use ($model) {
- $model->first_name = 'Taylor';
- $model->save();
- });
- $events->shouldReceive('until')->once()->with('eloquent.saving: Illuminate\Tests\Database\EloquentModelSaveStub', $model);
- $events->shouldReceive('dispatch')->once()->with('eloquent.saved: Illuminate\Tests\Database\EloquentModelSaveStub', $model);
- $model->last_name = 'Otwell';
- $model->save();
- EloquentModelSaveStub::flushEventListeners();
- }
- public function testSetObservableEvents()
- {
- $class = new EloquentModelStub;
- $class->setObservableEvents(['foo']);
- $this->assertContains('foo', $class->getObservableEvents());
- }
- public function testAddObservableEvent()
- {
- $class = new EloquentModelStub;
- $class->addObservableEvents('foo');
- $this->assertContains('foo', $class->getObservableEvents());
- }
- public function testAddMultipleObserveableEvents()
- {
- $class = new EloquentModelStub;
- $class->addObservableEvents('foo', 'bar');
- $this->assertContains('foo', $class->getObservableEvents());
- $this->assertContains('bar', $class->getObservableEvents());
- }
- public function testRemoveObservableEvent()
- {
- $class = new EloquentModelStub;
- $class->setObservableEvents(['foo', 'bar']);
- $class->removeObservableEvents('bar');
- $this->assertNotContains('bar', $class->getObservableEvents());
- }
- public function testRemoveMultipleObservableEvents()
- {
- $class = new EloquentModelStub;
- $class->setObservableEvents(['foo', 'bar']);
- $class->removeObservableEvents('foo', 'bar');
- $this->assertNotContains('foo', $class->getObservableEvents());
- $this->assertNotContains('bar', $class->getObservableEvents());
- }
- public function testGetModelAttributeMethodThrowsExceptionIfNotRelation()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Illuminate\Tests\Database\EloquentModelStub::incorrectRelationStub must return a relationship instance.');
- $model = new EloquentModelStub;
- $model->incorrectRelationStub;
- }
- public function testModelIsBootedOnUnserialize()
- {
- $model = new EloquentModelBootingTestStub;
- $this->assertTrue(EloquentModelBootingTestStub::isBooted());
- $model->foo = 'bar';
- $string = serialize($model);
- $model = null;
- EloquentModelBootingTestStub::unboot();
- $this->assertFalse(EloquentModelBootingTestStub::isBooted());
- unserialize($string);
- $this->assertTrue(EloquentModelBootingTestStub::isBooted());
- }
- public function testModelsTraitIsInitialized()
- {
- $model = new EloquentModelStubWithTrait;
- $this->assertTrue($model->fooBarIsInitialized);
- }
- public function testAppendingOfAttributes()
- {
- $model = new EloquentModelAppendsStub;
- $this->assertTrue(isset($model->is_admin));
- $this->assertTrue(isset($model->camelCased));
- $this->assertTrue(isset($model->StudlyCased));
- $this->assertSame('admin', $model->is_admin);
- $this->assertSame('camelCased', $model->camelCased);
- $this->assertSame('StudlyCased', $model->StudlyCased);
- $this->assertTrue($model->hasAppended('is_admin'));
- $this->assertTrue($model->hasAppended('camelCased'));
- $this->assertTrue($model->hasAppended('StudlyCased'));
- $this->assertFalse($model->hasAppended('not_appended'));
- $model->setHidden(['is_admin', 'camelCased', 'StudlyCased']);
- $this->assertEquals([], $model->toArray());
- $model->setVisible([]);
- $this->assertEquals([], $model->toArray());
- }
- public function testGetMutatedAttributes()
- {
- $model = new EloquentModelGetMutatorsStub;
- $this->assertEquals(['first_name', 'middle_name', 'last_name'], $model->getMutatedAttributes());
- EloquentModelGetMutatorsStub::resetMutatorCache();
- EloquentModelGetMutatorsStub::$snakeAttributes = false;
- $this->assertEquals(['firstName', 'middleName', 'lastName'], $model->getMutatedAttributes());
- }
- public function testReplicateCreatesANewModelInstanceWithSameAttributeValues()
- {
- $model = new EloquentModelStub;
- $model->id = 'id';
- $model->foo = 'bar';
- $model->created_at = new DateTime;
- $model->updated_at = new DateTime;
- $replicated = $model->replicate();
- $this->assertNull($replicated->id);
- $this->assertSame('bar', $replicated->foo);
- $this->assertNull($replicated->created_at);
- $this->assertNull($replicated->updated_at);
- }
- public function testReplicatingEventIsFiredWhenReplicatingModel()
- {
- $model = new EloquentModelStub;
- $model->setEventDispatcher($events = m::mock(Dispatcher::class));
- $events->shouldReceive('dispatch')->once()->with('eloquent.replicating: '.get_class($model), m::on(function ($m) use ($model) {
- return $model->is($m);
- }));
- $model->replicate();
- }
- public function testIncrementOnExistingModelCallsQueryAndSetsAttribute()
- {
- $model = m::mock(EloquentModelStub::class.'[newQueryWithoutRelationships]');
- $model->exists = true;
- $model->id = 1;
- $model->syncOriginalAttribute('id');
- $model->foo = 2;
- $model->shouldReceive('newQueryWithoutRelationships')->andReturn($query = m::mock(stdClass::class));
- $query->shouldReceive('where')->andReturn($query);
- $query->shouldReceive('increment');
- $model->publicIncrement('foo', 1);
- $this->assertFalse($model->isDirty());
- $model->publicIncrement('foo', 1, ['category' => 1]);
- $this->assertEquals(4, $model->foo);
- $this->assertEquals(1, $model->category);
- $this->assertTrue($model->isDirty('category'));
- }
- public function testRelationshipTouchOwnersIsPropagated()
- {
- $relation = $this->getMockBuilder(BelongsTo::class)->onlyMethods(['touch'])->disableOriginalConstructor()->getMock();
- $relation->expects($this->once())->method('touch');
- $model = m::mock(EloquentModelStub::class.'[partner]');
- $this->addMockConnection($model);
- $model->shouldReceive('partner')->once()->andReturn($relation);
- $model->setTouchedRelations(['partner']);
- $mockPartnerModel = m::mock(EloquentModelStub::class.'[touchOwners]');
- $mockPartnerModel->shouldReceive('touchOwners')->once();
- $model->setRelation('partner', $mockPartnerModel);
- $model->touchOwners();
- }
- public function testRelationshipTouchOwnersIsNotPropagatedIfNoRelationshipResult()
- {
- $relation = $this->getMockBuilder(BelongsTo::class)->onlyMethods(['touch'])->disableOriginalConstructor()->getMock();
- $relation->expects($this->once())->method('touch');
- $model = m::mock(EloquentModelStub::class.'[partner]');
- $this->addMockConnection($model);
- $model->shouldReceive('partner')->once()->andReturn($relation);
- $model->setTouchedRelations(['partner']);
- $model->setRelation('partner', null);
- $model->touchOwners();
- }
- public function testModelAttributesAreCastedWhenPresentInCastsArray()
- {
- $model = new EloquentModelCastingStub;
- $model->setDateFormat('Y-m-d H:i:s');
- $model->intAttribute = '3';
- $model->floatAttribute = '4.0';
- $model->stringAttribute = 2.5;
- $model->boolAttribute = 1;
- $model->booleanAttribute = 0;
- $model->objectAttribute = ['foo' => 'bar'];
- $obj = new stdClass;
- $obj->foo = 'bar';
- $model->arrayAttribute = $obj;
- $model->jsonAttribute = ['foo' => 'bar'];
- $model->dateAttribute = '1969-07-20';
- $model->datetimeAttribute = '1969-07-20 22:56:00';
- $model->timestampAttribute = '1969-07-20 22:56:00';
- $model->collectionAttribute = new BaseCollection;
- $this->assertIsInt($model->intAttribute);
- $this->assertIsFloat($model->floatAttribute);
- $this->assertIsString($model->stringAttribute);
- $this->assertIsBool($model->boolAttribute);
- $this->assertIsBool($model->booleanAttribute);
- $this->assertIsObject($model->objectAttribute);
- $this->assertIsArray($model->arrayAttribute);
- $this->assertIsArray($model->jsonAttribute);
- $this->assertTrue($model->boolAttribute);
- $this->assertFalse($model->booleanAttribute);
- $this->assertEquals($obj, $model->objectAttribute);
- $this->assertEquals(['foo' => 'bar'], $model->arrayAttribute);
- $this->assertEquals(['foo' => 'bar'], $model->jsonAttribute);
- $this->assertSame('{"foo":"bar"}', $model->jsonAttributeValue());
- $this->assertInstanceOf(Carbon::class, $model->dateAttribute);
- $this->assertInstanceOf(Carbon::class, $model->datetimeAttribute);
- $this->assertInstanceOf(BaseCollection::class, $model->collectionAttribute);
- $this->assertSame('1969-07-20', $model->dateAttribute->toDateString());
- $this->assertSame('1969-07-20 22:56:00', $model->datetimeAttribute->toDateTimeString());
- $this->assertEquals(-14173440, $model->timestampAttribute);
- $arr = $model->toArray();
- $this->assertIsInt($arr['intAttribute']);
- $this->assertIsFloat($arr['floatAttribute']);
- $this->assertIsString($arr['stringAttribute']);
- $this->assertIsBool($arr['boolAttribute']);
- $this->assertIsBool($arr['booleanAttribute']);
- $this->assertIsObject($arr['objectAttribute']);
- $this->assertIsArray($arr['arrayAttribute']);
- $this->assertIsArray($arr['jsonAttribute']);
- $this->assertIsArray($arr['collectionAttribute']);
- $this->assertTrue($arr['boolAttribute']);
- $this->assertFalse($arr['booleanAttribute']);
- $this->assertEquals($obj, $arr['objectAttribute']);
- $this->assertEquals(['foo' => 'bar'], $arr['arrayAttribute']);
- $this->assertEquals(['foo' => 'bar'], $arr['jsonAttribute']);
- $this->assertSame('1969-07-20 00:00:00', $arr['dateAttribute']);
- $this->assertSame('1969-07-20 22:56:00', $arr['datetimeAttribute']);
- $this->assertEquals(-14173440, $arr['timestampAttribute']);
- }
- public function testModelDateAttributeCastingResetsTime()
- {
- $model = new EloquentModelCastingStub;
- $model->setDateFormat('Y-m-d H:i:s');
- $model->dateAttribute = '1969-07-20 22:56:00';
- $this->assertSame('1969-07-20 00:00:00', $model->dateAttribute->toDateTimeString());
- $arr = $model->toArray();
- $this->assertSame('1969-07-20 00:00:00', $arr['dateAttribute']);
- }
- public function testModelAttributeCastingPreservesNull()
- {
- $model = new EloquentModelCastingStub;
- $model->intAttribute = null;
- $model->floatAttribute = null;
- $model->stringAttribute = null;
- $model->boolAttribute = null;
- $model->booleanAttribute = null;
- $model->objectAttribute = null;
- $model->arrayAttribute = null;
- $model->jsonAttribute = null;
- $model->dateAttribute = null;
- $model->datetimeAttribute = null;
- $model->timestampAttribute = null;
- $model->collectionAttribute = null;
- $attributes = $model->getAttributes();
- $this->assertNull($attributes['intAttribute']);
- $this->assertNull($attributes['floatAttribute']);
- $this->assertNull($attributes['stringAttribute']);
- $this->assertNull($attributes['boolAttribute']);
- $this->assertNull($attributes['booleanAttribute']);
- $this->assertNull($attributes['objectAttribute']);
- $this->assertNull($attributes['arrayAttribute']);
- $this->assertNull($attributes['jsonAttribute']);
- $this->assertNull($attributes['dateAttribute']);
- $this->assertNull($attributes['datetimeAttribute']);
- $this->assertNull($attributes['timestampAttribute']);
- $this->assertNull($attributes['collectionAttribute']);
- $this->assertNull($model->intAttribute);
- $this->assertNull($model->floatAttribute);
- $this->assertNull($model->stringAttribute);
- $this->assertNull($model->boolAttribute);
- $this->assertNull($model->booleanAttribute);
- $this->assertNull($model->objectAttribute);
- $this->assertNull($model->arrayAttribute);
- $this->assertNull($model->jsonAttribute);
- $this->assertNull($model->dateAttribute);
- $this->assertNull($model->datetimeAttribute);
- $this->assertNull($model->timestampAttribute);
- $this->assertNull($model->collectionAttribute);
- $array = $model->toArray();
- $this->assertNull($array['intAttribute']);
- $this->assertNull($array['floatAttribute']);
- $this->assertNull($array['stringAttribute']);
- $this->assertNull($array['boolAttribute']);
- $this->assertNull($array['booleanAttribute']);
- $this->assertNull($array['objectAttribute']);
- $this->assertNull($array['arrayAttribute']);
- $this->assertNull($array['jsonAttribute']);
- $this->assertNull($array['dateAttribute']);
- $this->assertNull($array['datetimeAttribute']);
- $this->assertNull($array['timestampAttribute']);
- $this->assertNull($attributes['collectionAttribute']);
- }
- public function testModelAttributeCastingFailsOnUnencodableData()
- {
- $this->expectException(JsonEncodingException::class);
- $this->expectExceptionMessage('Unable to encode attribute [objectAttribute] for model [Illuminate\Tests\Database\EloquentModelCastingStub] to JSON: Malformed UTF-8 characters, possibly incorrectly encoded.');
- $model = new EloquentModelCastingStub;
- $model->objectAttribute = ['foo' => "b\xF8r"];
- $obj = new stdClass;
- $obj->foo = "b\xF8r";
- $model->arrayAttribute = $obj;
- $model->jsonAttribute = ['foo' => "b\xF8r"];
- $model->getAttributes();
- }
- public function testModelAttributeCastingWithSpecialFloatValues()
- {
- $model = new EloquentModelCastingStub;
- $model->floatAttribute = 0;
- $this->assertSame(0.0, $model->floatAttribute);
- $model->floatAttribute = 'Infinity';
- $this->assertSame(INF, $model->floatAttribute);
- $model->floatAttribute = INF;
- $this->assertSame(INF, $model->floatAttribute);
- $model->floatAttribute = '-Infinity';
- $this->assertSame(-INF, $model->floatAttribute);
- $model->floatAttribute = -INF;
- $this->assertSame(-INF, $model->floatAttribute);
- $model->floatAttribute = 'NaN';
- $this->assertNan($model->floatAttribute);
- $model->floatAttribute = NAN;
- $this->assertNan($model->floatAttribute);
- }
- public function testMergeCastsMergesCasts()
- {
- $model = new EloquentModelCastingStub;
- $castCount = count($model->getCasts());
- $this->assertArrayNotHasKey('foo', $model->getCasts());
- $model->mergeCasts(['foo' => 'date']);
- $this->assertCount($castCount + 1, $model->getCasts());
- $this->assertArrayHasKey('foo', $model->getCasts());
- }
- public function testUpdatingNonExistentModelFails()
- {
- $model = new EloquentModelStub;
- $this->assertFalse($model->update());
- }
- public function testIssetBehavesCorrectlyWithAttributesAndRelationships()
- {
- $model = new EloquentModelStub;
- $this->assertFalse(isset($model->nonexistent));
- $model->some_attribute = 'some_value';
- $this->assertTrue(isset($model->some_attribute));
- $model->setRelation('some_relation', 'some_value');
- $this->assertTrue(isset($model->some_relation));
- }
- public function testNonExistingAttributeWithInternalMethodNameDoesntCallMethod()
- {
- $model = m::mock(EloquentModelStub::class.'[delete,getRelationValue]');
- $model->name = 'Spark';
- $model->shouldNotReceive('delete');
- $model->shouldReceive('getRelationValue')->once()->with('belongsToStub')->andReturn('relation');
- // Can return a normal relation
- $this->assertSame('relation', $model->belongsToStub);
- // Can return a normal attribute
- $this->assertSame('Spark', $model->name);
- // Returns null for a Model.php method name
- $this->assertNull($model->delete);
- $model = m::mock(EloquentModelStub::class.'[delete]');
- $model->delete = 123;
- $this->assertEquals(123, $model->delete);
- }
- public function testIntKeyTypePreserved()
- {
- $model = $this->getMockBuilder(EloquentModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with([], 'id')->andReturn(1);
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $this->assertTrue($model->save());
- $this->assertEquals(1, $model->id);
- }
- public function testStringKeyTypePreserved()
- {
- $model = $this->getMockBuilder(EloquentKeyTypeModelStub::class)->onlyMethods(['newModelQuery', 'updateTimestamps', 'refresh'])->getMock();
- $query = m::mock(Builder::class);
- $query->shouldReceive('insertGetId')->once()->with([], 'id')->andReturn('string id');
- $query->shouldReceive('getConnection')->once();
- $model->expects($this->once())->method('newModelQuery')->willReturn($query);
- $this->assertTrue($model->save());
- $this->assertSame('string id', $model->id);
- }
- public function testScopesMethod()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- Carbon::setTestNow();
- $scopes = [
- 'published',
- 'category' => 'Laravel',
- 'framework' => ['Laravel', '5.3'],
- 'date' => Carbon::now(),
- ];
- $this->assertInstanceOf(Builder::class, $model->scopes($scopes));
- $this->assertSame($scopes, $model->scopesCalled);
- }
- public function testScopesMethodWithString()
- {
- $model = new EloquentModelStub;
- $this->addMockConnection($model);
- $this->assertInstanceOf(Builder::class, $model->scopes('published'));
- $this->assertSame(['published'], $model->scopesCalled);
- }
- public function testIsWithNull()
- {
- $firstInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance = null;
- $this->assertFalse($firstInstance->is($secondInstance));
- }
- public function testIsWithTheSameModelInstance()
- {
- $firstInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance = new EloquentModelStub(['id' => 1]);
- $result = $firstInstance->is($secondInstance);
- $this->assertTrue($result);
- }
- public function testIsWithAnotherModelInstance()
- {
- $firstInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance = new EloquentModelStub(['id' => 2]);
- $result = $firstInstance->is($secondInstance);
- $this->assertFalse($result);
- }
- public function testIsWithAnotherTable()
- {
- $firstInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance->setTable('foo');
- $result = $firstInstance->is($secondInstance);
- $this->assertFalse($result);
- }
- public function testIsWithAnotherConnection()
- {
- $firstInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance = new EloquentModelStub(['id' => 1]);
- $secondInstance->setConnection('foo');
- $result = $firstInstance->is($secondInstance);
- $this->assertFalse($result);
- }
- public function testWithoutTouchingCallback()
- {
- new EloquentModelStub(['id' => 1]);
- $called = false;
- EloquentModelStub::withoutTouching(function () use (&$called) {
- $called = true;
- });
- $this->assertTrue($called);
- }
- public function testWithoutTouchingOnCallback()
- {
- new EloquentModelStub(['id' => 1]);
- $called = false;
- Model::withoutTouchingOn([EloquentModelStub::class], function () use (&$called) {
- $called = true;
- });
- $this->assertTrue($called);
- }
- protected function addMockConnection($model)
- {
- $model->setConnectionResolver($resolver = m::mock(ConnectionResolverInterface::class));
- $resolver->shouldReceive('connection')->andReturn($connection = m::mock(Connection::class));
- $connection->shouldReceive('getQueryGrammar')->andReturn($grammar = m::mock(Grammar::class));
- $grammar->shouldReceive('getBitwiseOperators')->andReturn([]);
- $connection->shouldReceive('getPostProcessor')->andReturn($processor = m::mock(Processor::class));
- $connection->shouldReceive('query')->andReturnUsing(function () use ($connection, $grammar, $processor) {
- return new BaseBuilder($connection, $grammar, $processor);
- });
- }
- public function testTouchingModelWithTimestamps()
- {
- $this->assertFalse(
- Model::isIgnoringTouch(Model::class)
- );
- }
- public function testNotTouchingModelWithUpdatedAtNull()
- {
- $this->assertTrue(
- Model::isIgnoringTouch(EloquentModelWithUpdatedAtNull::class)
- );
- }
- public function testNotTouchingModelWithoutTimestamps()
- {
- $this->assertTrue(
- Model::isIgnoringTouch(EloquentModelWithoutTimestamps::class)
- );
- }
- public function testGetOriginalCastsAttributes()
- {
- $model = new EloquentModelCastingStub;
- $model->intAttribute = '1';
- $model->floatAttribute = '0.1234';
- $model->stringAttribute = 432;
- $model->boolAttribute = '1';
- $model->booleanAttribute = '0';
- $stdClass = new stdClass;
- $stdClass->json_key = 'json_value';
- $model->objectAttribute = $stdClass;
- $array = [
- 'foo' => 'bar',
- ];
- $collection = collect($array);
- $model->arrayAttribute = $array;
- $model->jsonAttribute = $array;
- $model->collectionAttribute = $collection;
- $model->syncOriginal();
- $model->intAttribute = 2;
- $model->floatAttribute = 0.443;
- $model->stringAttribute = '12';
- $model->boolAttribute = true;
- $model->booleanAttribute = false;
- $model->objectAttribute = $stdClass;
- $model->arrayAttribute = [
- 'foo' => 'bar2',
- ];
- $model->jsonAttribute = [
- 'foo' => 'bar2',
- ];
- $model->collectionAttribute = collect([
- 'foo' => 'bar2',
- ]);
- $this->assertIsInt($model->getOriginal('intAttribute'));
- $this->assertEquals(1, $model->getOriginal('intAttribute'));
- $this->assertEquals(2, $model->intAttribute);
- $this->assertEquals(2, $model->getAttribute('intAttribute'));
- $this->assertIsFloat($model->getOriginal('floatAttribute'));
- $this->assertEquals(0.1234, $model->getOriginal('floatAttribute'));
- $this->assertEquals(0.443, $model->floatAttribute);
- $this->assertIsString($model->getOriginal('stringAttribute'));
- $this->assertSame('432', $model->getOriginal('stringAttribute'));
- $this->assertSame('12', $model->stringAttribute);
- $this->assertIsBool($model->getOriginal('boolAttribute'));
- $this->assertTrue($model->getOriginal('boolAttribute'));
- $this->assertTrue($model->boolAttribute);
- $this->assertIsBool($model->getOriginal('booleanAttribute'));
- $this->assertFalse($model->getOriginal('booleanAttribute'));
- $this->assertFalse($model->booleanAttribute);
- $this->assertEquals($stdClass, $model->getOriginal('objectAttribute'));
- $this->assertEquals($model->getAttribute('objectAttribute'), $model->getOriginal('objectAttribute'));
- $this->assertEquals($array, $model->getOriginal('arrayAttribute'));
- $this->assertEquals(['foo' => 'bar'], $model->getOriginal('arrayAttribute'));
- $this->assertEquals(['foo' => 'bar2'], $model->getAttribute('arrayAttribute'));
- $this->assertEquals($array, $model->getOriginal('jsonAttribute'));
- $this->assertEquals(['foo' => 'bar'], $model->getOriginal('jsonAttribute'));
- $this->assertEquals(['foo' => 'bar2'], $model->getAttribute('jsonAttribute'));
- $this->assertEquals(['foo' => 'bar'], $model->getOriginal('collectionAttribute')->toArray());
- $this->assertEquals(['foo' => 'bar2'], $model->getAttribute('collectionAttribute')->toArray());
- }
- public function testUnsavedModel()
- {
- $user = new UnsavedModel;
- $user->name = null;
- $this->assertNull($user->name);
- }
- }
- class EloquentTestObserverStub
- {
- public function creating()
- {
- //
- }
- public function saved()
- {
- //
- }
- }
- class EloquentTestAnotherObserverStub
- {
- public function creating()
- {
- //
- }
- public function saved()
- {
- //
- }
- }
- class EloquentModelStub extends Model
- {
- public $connection;
- public $scopesCalled = [];
- protected $table = 'stub';
- protected $guarded = [];
- protected $casts = ['castedFloat' => 'float'];
- public function getListItemsAttribute($value)
- {
- return json_decode($value, true);
- }
- public function setListItemsAttribute($value)
- {
- $this->attributes['list_items'] = json_encode($value);
- }
- public function getPasswordAttribute()
- {
- return '******';
- }
- public function setPasswordAttribute($value)
- {
- $this->attributes['password_hash'] = sha1($value);
- }
- public function publicIncrement($column, $amount = 1, $extra = [])
- {
- return $this->increment($column, $amount, $extra);
- }
- public function belongsToStub()
- {
- return $this->belongsTo(EloquentModelSaveStub::class);
- }
- public function morphToStub()
- {
- return $this->morphTo();
- }
- public function morphToStubWithKeys()
- {
- return $this->morphTo(null, 'type', 'id');
- }
- public function morphToStubWithName()
- {
- return $this->morphTo('someName');
- }
- public function morphToStubWithNameAndKeys()
- {
- return $this->morphTo('someName', 'type', 'id');
- }
- public function belongsToExplicitKeyStub()
- {
- return $this->belongsTo(EloquentModelSaveStub::class, 'foo');
- }
- public function incorrectRelationStub()
- {
- return 'foo';
- }
- public function getDates()
- {
- return [];
- }
- public function getAppendableAttribute()
- {
- return 'appended';
- }
- public function scopePublished(Builder $builder)
- {
- $this->scopesCalled[] = 'published';
- }
- public function scopeCategory(Builder $builder, $category)
- {
- $this->scopesCalled['category'] = $category;
- }
- public function scopeFramework(Builder $builder, $framework, $version)
- {
- $this->scopesCalled['framework'] = [$framework, $version];
- }
- public function scopeDate(Builder $builder, Carbon $date)
- {
- $this->scopesCalled['date'] = $date;
- }
- }
- trait FooBarTrait
- {
- public $fooBarIsInitialized = false;
- public function initializeFooBarTrait()
- {
- $this->fooBarIsInitialized = true;
- }
- }
- class EloquentModelStubWithTrait extends EloquentModelStub
- {
- use FooBarTrait;
- }
- class EloquentModelCamelStub extends EloquentModelStub
- {
- public static $snakeAttributes = false;
- }
- class EloquentDateModelStub extends EloquentModelStub
- {
- public function getDates()
- {
- return ['created_at', 'updated_at'];
- }
- }
- class EloquentModelSaveStub extends Model
- {
- protected $table = 'save_stub';
- protected $guarded = [];
- public function save(array $options = [])
- {
- if ($this->fireModelEvent('saving') === false) {
- return false;
- }
- $_SERVER['__eloquent.saved'] = true;
- $this->fireModelEvent('saved', false);
- }
- public function setIncrementing($value)
- {
- $this->incrementing = $value;
- }
- public function getConnection()
- {
- $mock = m::mock(Connection::class);
- $mock->shouldReceive('getQueryGrammar')->andReturn($grammar = m::mock(Grammar::class));
- $grammar->shouldReceive('getBitwiseOperators')->andReturn([]);
- $mock->shouldReceive('getPostProcessor')->andReturn($processor = m::mock(Processor::class));
- $mock->shouldReceive('getName')->andReturn('name');
- $mock->shouldReceive('query')->andReturnUsing(function () use ($mock, $grammar, $processor) {
- return new BaseBuilder($mock, $grammar, $processor);
- });
- return $mock;
- }
- }
- class EloquentKeyTypeModelStub extends EloquentModelStub
- {
- protected $keyType = 'string';
- }
- class EloquentModelFindWithWritePdoStub extends Model
- {
- public function newQuery()
- {
- $mock = m::mock(Builder::class);
- $mock->shouldReceive('useWritePdo')->once()->andReturnSelf();
- $mock->shouldReceive('find')->once()->with(1)->andReturn('foo');
- return $mock;
- }
- }
- class EloquentModelDestroyStub extends Model
- {
- protected $fillable = [
- 'id',
- ];
- public function newQuery()
- {
- $mock = m::mock(Builder::class);
- $mock->shouldReceive('whereIn')->once()->with('id', [1, 2, 3])->andReturn($mock);
- $mock->shouldReceive('get')->once()->andReturn([$model = m::mock(stdClass::class)]);
- $model->shouldReceive('delete')->once();
- return $mock;
- }
- }
- class EloquentModelEmptyDestroyStub extends Model
- {
- public function newQuery()
- {
- $mock = m::mock(Builder::class);
- $mock->shouldReceive('whereIn')->never();
- return $mock;
- }
- }
- class EloquentModelHydrateRawStub extends Model
- {
- public static function hydrate(array $items, $connection = null)
- {
- return 'hydrated';
- }
- public function getConnection()
- {
- $mock = m::mock(Connection::class);
- $mock->shouldReceive('select')->once()->with('SELECT ?', ['foo'])->andReturn([]);
- return $mock;
- }
- }
- class EloquentModelWithStub extends Model
- {
- public function newQuery()
- {
- $mock = m::mock(Builder::class);
- $mock->shouldReceive('with')->once()->with(['foo', 'bar'])->andReturn('foo');
- return $mock;
- }
- }
- class EloquentModelWithoutRelationStub extends Model
- {
- public $with = ['foo'];
- protected $guarded = [];
- public function getEagerLoads()
- {
- return $this->eagerLoads;
- }
- }
- class EloquentModelWithoutTableStub extends Model
- {
- //
- }
- class EloquentModelBootingTestStub extends Model
- {
- public static function unboot()
- {
- unset(static::$booted[static::class]);
- }
- public static function isBooted()
- {
- return array_key_exists(static::class, static::$booted);
- }
- }
- class EloquentModelAppendsStub extends Model
- {
- protected $appends = ['is_admin', 'camelCased', 'StudlyCased'];
- public function getIsAdminAttribute()
- {
- return 'admin';
- }
- public function getCamelCasedAttribute()
- {
- return 'camelCased';
- }
- public function getStudlyCasedAttribute()
- {
- return 'StudlyCased';
- }
- }
- class EloquentModelGetMutatorsStub extends Model
- {
- public static function resetMutatorCache()
- {
- static::$mutatorCache = [];
- }
- public function getFirstNameAttribute()
- {
- //
- }
- public function getMiddleNameAttribute()
- {
- //
- }
- public function getLastNameAttribute()
- {
- //
- }
- public function doNotgetFirstInvalidAttribute()
- {
- //
- }
- public function doNotGetSecondInvalidAttribute()
- {
- //
- }
- public function doNotgetThirdInvalidAttributeEither()
- {
- //
- }
- public function doNotGetFourthInvalidAttributeEither()
- {
- //
- }
- }
- class EloquentModelCastingStub extends Model
- {
- protected $casts = [
- 'intAttribute' => 'int',
- 'floatAttribute' => 'float',
- 'stringAttribute' => 'string',
- 'boolAttribute' => 'bool',
- 'booleanAttribute' => 'boolean',
- 'objectAttribute' => 'object',
- 'arrayAttribute' => 'array',
- 'jsonAttribute' => 'json',
- 'collectionAttribute' => 'collection',
- 'dateAttribute' => 'date',
- 'datetimeAttribute' => 'datetime',
- 'timestampAttribute' => 'timestamp',
- 'asarrayobjectAttribute' => AsArrayObject::class,
- 'ascollectionAttribute' => AsCollection::class,
- 'asStringableAttribute' => AsStringable::class,
- ];
- public function jsonAttributeValue()
- {
- return $this->attributes['jsonAttribute'];
- }
- protected function serializeDate(DateTimeInterface $date)
- {
- return $date->format('Y-m-d H:i:s');
- }
- }
- class EloquentModelDynamicHiddenStub extends Model
- {
- protected $table = 'stub';
- protected $guarded = [];
- public function getHidden()
- {
- return ['age', 'id'];
- }
- }
- class EloquentModelDynamicVisibleStub extends Model
- {
- protected $table = 'stub';
- protected $guarded = [];
- public function getVisible()
- {
- return ['name', 'id'];
- }
- }
- class EloquentModelNonIncrementingStub extends Model
- {
- protected $table = 'stub';
- protected $guarded = [];
- public $incrementing = false;
- }
- class EloquentNoConnectionModelStub extends EloquentModelStub
- {
- //
- }
- class EloquentDifferentConnectionModelStub extends EloquentModelStub
- {
- public $connection = 'different_connection';
- }
- class EloquentModelSavingEventStub
- {
- //
- }
- class EloquentModelEventObjectStub extends Model
- {
- protected $dispatchesEvents = [
- 'saving' => EloquentModelSavingEventStub::class,
- ];
- }
- class EloquentModelWithoutTimestamps extends Model
- {
- protected $table = 'stub';
- public $timestamps = false;
- }
- class EloquentModelWithUpdatedAtNull extends Model
- {
- protected $table = 'stub';
- const UPDATED_AT = null;
- }
- class UnsavedModel extends Model
- {
- protected $casts = ['name' => Uppercase::class];
- }
- class Uppercase implements CastsInboundAttributes
- {
- public function set($model, string $key, $value, array $attributes)
- {
- return is_string($value) ? strtoupper($value) : $value;
- }
- }
|