PageRenderTime 67ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Database/DatabaseEloquentModelTest.php

https://github.com/guilex/framework
PHP | 640 lines | 512 code | 122 blank | 6 comment | 0 complexity | 5b260e6147f8c601b78085be70c61221 MD5 | raw file
  1. <?php
  2. use Mockery as m;
  3. class DatabaseEloquentModelTest extends PHPUnit_Framework_TestCase {
  4. public function tearDown()
  5. {
  6. m::close();
  7. Illuminate\Database\Eloquent\Model::unsetEventDispatcher();
  8. }
  9. public function testAttributeManipulation()
  10. {
  11. $model = new EloquentModelStub;
  12. $model->name = 'foo';
  13. $this->assertEquals('foo', $model->name);
  14. $this->assertTrue(isset($model->name));
  15. unset($model->name);
  16. $this->assertFalse(isset($model->name));
  17. // test mutation
  18. $model->list_items = array('name' => 'taylor');
  19. $this->assertEquals(array('name' => 'taylor'), $model->list_items);
  20. $attributes = $model->getAttributes();
  21. $this->assertEquals(json_encode(array('name' => 'taylor')), $attributes['list_items']);
  22. }
  23. public function testCalculatedAttributes()
  24. {
  25. $model = new EloquentModelStub;
  26. $model->password = 'secret';
  27. $attributes = $model->getAttributes();
  28. // ensure password attribute was not set to null
  29. $this->assertFalse(array_key_exists('password', $attributes));
  30. $this->assertEquals('******', $model->password);
  31. $this->assertEquals('5ebe2294ecd0e0f08eab7690d2a6ee69', $attributes['password_hash']);
  32. $this->assertEquals('5ebe2294ecd0e0f08eab7690d2a6ee69', $model->password_hash);
  33. }
  34. public function testNewInstanceReturnsNewInstanceWithAttributesSet()
  35. {
  36. $model = new EloquentModelStub;
  37. $instance = $model->newInstance(array('name' => 'taylor'));
  38. $this->assertInstanceOf('EloquentModelStub', $instance);
  39. $this->assertEquals('taylor', $instance->name);
  40. }
  41. public function testCreateMethodSavesNewModel()
  42. {
  43. $_SERVER['__eloquent.saved'] = false;
  44. $model = EloquentModelSaveStub::create(array('name' => 'taylor'));
  45. $this->assertTrue($_SERVER['__eloquent.saved']);
  46. $this->assertEquals('taylor', $model->name);
  47. }
  48. public function testFindMethodCallsQueryBuilderCorrectly()
  49. {
  50. $result = EloquentModelFindStub::find(1);
  51. $this->assertEquals('foo', $result);
  52. }
  53. public function testFindMethodWithArrayCallsQueryBuilderCorrectly()
  54. {
  55. $result = EloquentModelFindManyStub::find(array(1, 2));
  56. $this->assertEquals('foo', $result);
  57. }
  58. public function testWithMethodCallsQueryBuilderCorrectly()
  59. {
  60. $result = EloquentModelWithStub::with('foo', 'bar');
  61. $this->assertEquals('foo', $result);
  62. }
  63. public function testWithMethodCallsQueryBuilderCorrectlyWithArray()
  64. {
  65. $result = EloquentModelWithStub::with(array('foo', 'bar'));
  66. $this->assertEquals('foo', $result);
  67. }
  68. public function testUpdateProcess()
  69. {
  70. $model = $this->getMock('EloquentModelStub', array('newQuery', 'updateTimestamps'));
  71. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  72. $query->shouldReceive('where')->once()->with('id', '=', 1);
  73. $query->shouldReceive('update')->once()->with(array('id' => 1, 'name' => 'taylor'));
  74. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  75. $model->expects($this->once())->method('updateTimestamps');
  76. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  77. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
  78. $events->shouldReceive('until')->once()->with('eloquent.updating: '.get_class($model), $model)->andReturn(true);
  79. $events->shouldReceive('fire')->once()->with('eloquent.updated: '.get_class($model), $model)->andReturn(true);
  80. $events->shouldReceive('fire')->once()->with('eloquent.saved: '.get_class($model), $model)->andReturn(true);
  81. $model->foo = 'bar';
  82. // make sure foo isn't synced so we can test that dirty attributes only are updated
  83. $model->syncOriginal();
  84. $model->id = 1;
  85. $model->name = 'taylor';
  86. $model->exists = true;
  87. $this->assertTrue($model->save());
  88. }
  89. public function testSaveIsCancelledIfSavingEventReturnsFalse()
  90. {
  91. $model = $this->getMock('EloquentModelStub', array('newQuery'));
  92. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  93. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  94. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  95. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(false);
  96. $model->exists = true;
  97. $this->assertFalse($model->save());
  98. }
  99. public function testUpdateIsCancelledIfUpdatingEventReturnsFalse()
  100. {
  101. $model = $this->getMock('EloquentModelStub', array('newQuery'));
  102. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  103. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  104. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  105. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
  106. $events->shouldReceive('until')->once()->with('eloquent.updating: '.get_class($model), $model)->andReturn(false);
  107. $model->exists = true;
  108. $this->assertFalse($model->save());
  109. }
  110. public function testUpdateProcessWithoutTimestamps()
  111. {
  112. $model = $this->getMock('EloquentModelStub', array('newQuery', 'updateTimestamps'));
  113. $model->timestamps = false;
  114. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  115. $query->shouldReceive('where')->once()->with('id', '=', 1);
  116. $query->shouldReceive('update')->once()->with(array('id' => 1, 'name' => 'taylor'));
  117. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  118. $model->expects($this->never())->method('updateTimestamps');
  119. $model->id = 1;
  120. $model->name = 'taylor';
  121. $model->exists = true;
  122. $this->assertTrue($model->save());
  123. }
  124. public function testTimestampsAreReturnedAsObjects()
  125. {
  126. $model = $this->getMock('EloquentDateModelStub', array('getDateFormat'));
  127. $model->expects($this->any())->method('getDateFormat')->will($this->returnValue('Y-m-d'));
  128. $model->setRawAttributes(array(
  129. 'created_at' => '2012-12-04',
  130. 'updated_at' => '2012-12-05',
  131. ));
  132. $this->assertInstanceOf('DateTime', $model->created_at);
  133. $this->assertInstanceOf('DateTime', $model->updated_at);
  134. }
  135. public function testTimestampsAreReturnedAsObjectsOnCreate()
  136. {
  137. $timestamps = array(
  138. 'created_at' => new DateTime,
  139. 'updated_at' => new DateTime
  140. );
  141. $model = new EloquentDateModelStub;
  142. Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver = m::mock('Illuminate\Database\ConnectionResolverInterface'));
  143. $resolver->shouldReceive('connection')->andReturn($mockConnection = m::mock('StdClass'));
  144. $mockConnection->shouldReceive('getQueryGrammar')->andReturn($mockConnection);
  145. $mockConnection->shouldReceive('getDateFormat')->andReturn('Y-m-d H:i:s');
  146. $instance = $model->newInstance($timestamps);
  147. $this->assertInstanceOf('DateTime', $instance->updated_at);
  148. $this->assertInstanceOf('DateTime', $instance->created_at);
  149. }
  150. public function testDateTimeAttributesReturnNullIfSetToNull()
  151. {
  152. $timestamps = array(
  153. 'created_at' => new DateTime,
  154. 'updated_at' => new DateTime
  155. );
  156. $model = new EloquentDateModelStub;
  157. Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver = m::mock('Illuminate\Database\ConnectionResolverInterface'));
  158. $resolver->shouldReceive('connection')->andReturn($mockConnection = m::mock('StdClass'));
  159. $mockConnection->shouldReceive('getQueryGrammar')->andReturn($mockConnection);
  160. $mockConnection->shouldReceive('getDateFormat')->andReturn('Y-m-d H:i:s');
  161. $instance = $model->newInstance($timestamps);
  162. $instance->created_at = null;
  163. $this->assertNull($instance->created_at);
  164. }
  165. public function testInsertProcess()
  166. {
  167. $model = $this->getMock('EloquentModelStub', array('newQuery', 'updateTimestamps'));
  168. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  169. $query->shouldReceive('insertGetId')->once()->with(array('name' => 'taylor'), 'id')->andReturn(1);
  170. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  171. $model->expects($this->once())->method('updateTimestamps');
  172. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  173. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
  174. $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(true);
  175. $events->shouldReceive('fire')->once()->with('eloquent.created: '.get_class($model), $model);
  176. $events->shouldReceive('fire')->once()->with('eloquent.saved: '.get_class($model), $model);
  177. $model->name = 'taylor';
  178. $model->exists = false;
  179. $this->assertTrue($model->save());
  180. $this->assertEquals(1, $model->id);
  181. $this->assertTrue($model->exists);
  182. $model = $this->getMock('EloquentModelStub', array('newQuery', 'updateTimestamps'));
  183. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  184. $query->shouldReceive('insert')->once()->with(array('name' => 'taylor'));
  185. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  186. $model->expects($this->once())->method('updateTimestamps');
  187. $model->setIncrementing(false);
  188. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  189. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
  190. $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(true);
  191. $events->shouldReceive('fire')->once()->with('eloquent.created: '.get_class($model), $model);
  192. $events->shouldReceive('fire')->once()->with('eloquent.saved: '.get_class($model), $model);
  193. $model->name = 'taylor';
  194. $model->exists = false;
  195. $this->assertTrue($model->save());
  196. $this->assertNull($model->id);
  197. $this->assertTrue($model->exists);
  198. }
  199. public function testInsertIsCancelledIfCreatingEventReturnsFalse()
  200. {
  201. $model = $this->getMock('EloquentModelStub', array('newQuery'));
  202. $query = m::mock('Illuminate\Database\Eloquent\Builder');
  203. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  204. $model->setEventDispatcher($events = m::mock('Illuminate\Events\Dispatcher'));
  205. $events->shouldReceive('until')->once()->with('eloquent.saving: '.get_class($model), $model)->andReturn(true);
  206. $events->shouldReceive('until')->once()->with('eloquent.creating: '.get_class($model), $model)->andReturn(false);
  207. $this->assertFalse($model->save());
  208. $this->assertFalse($model->exists);
  209. }
  210. public function testDeleteProperlyDeletesModel()
  211. {
  212. $model = $this->getMock('Illuminate\Database\Eloquent\Model', array('newQuery', 'updateTimestamps'));
  213. $query = m::mock('stdClass');
  214. $query->shouldReceive('where')->once()->with('id', 1)->andReturn($query);
  215. $query->shouldReceive('delete')->once();
  216. $model->expects($this->once())->method('newQuery')->will($this->returnValue($query));
  217. $model->exists = true;
  218. $model->id = 1;
  219. $model->delete();
  220. }
  221. public function testNewQueryReturnsEloquentQueryBuilder()
  222. {
  223. $conn = m::mock('Illuminate\Database\Connection');
  224. $grammar = m::mock('Illuminate\Database\Query\Grammars\Grammar');
  225. $processor = m::mock('Illuminate\Database\Query\Processors\Processor');
  226. $conn->shouldReceive('getQueryGrammar')->once()->andReturn($grammar);
  227. $conn->shouldReceive('getPostProcessor')->once()->andReturn($processor);
  228. EloquentModelStub::setConnectionResolver($resolver = m::mock('Illuminate\Database\ConnectionResolverInterface'));
  229. $resolver->shouldReceive('connection')->andReturn($conn);
  230. $model = new EloquentModelStub;
  231. $builder = $model->newQuery();
  232. $this->assertInstanceOf('Illuminate\Database\Eloquent\Builder', $builder);
  233. }
  234. public function testGetAndSetTableOperations()
  235. {
  236. $model = new EloquentModelStub;
  237. $this->assertEquals('stub', $model->getTable());
  238. $model->setTable('foo');
  239. $this->assertEquals('foo', $model->getTable());
  240. }
  241. public function testGetKeyReturnsValueOfPrimaryKey()
  242. {
  243. $model = new EloquentModelStub;
  244. $model->id = 1;
  245. $this->assertEquals(1, $model->getKey());
  246. $this->assertEquals('id', $model->getKeyName());
  247. }
  248. public function testConnectionManagement()
  249. {
  250. EloquentModelStub::setConnectionResolver($resolver = m::mock('Illuminate\Database\ConnectionResolverInterface'));
  251. $model = new EloquentModelStub;
  252. $model->setConnection('foo');
  253. $resolver->shouldReceive('connection')->once()->with('foo')->andReturn('bar');
  254. $this->assertEquals('bar', $model->getConnection());
  255. }
  256. public function testToArray()
  257. {
  258. $model = new EloquentModelStub;
  259. $model->name = 'foo';
  260. $model->age = null;
  261. $model->password = 'password1';
  262. $model->setHidden(array('password'));
  263. $model->setRelation('names', new Illuminate\Database\Eloquent\Collection(array(
  264. new EloquentModelStub(array('bar' => 'baz')), new EloquentModelStub(array('bam' => 'boom'))
  265. )));
  266. $model->setRelation('partner', new EloquentModelStub(array('name' => 'abby')));
  267. $array = $model->toArray();
  268. $this->assertTrue(is_array($array));
  269. $this->assertEquals('foo', $array['name']);
  270. $this->assertEquals('baz', $array['names'][0]['bar']);
  271. $this->assertEquals('boom', $array['names'][1]['bam']);
  272. $this->assertEquals('abby', $array['partner']['name']);
  273. $this->assertFalse(isset($array['password']));
  274. }
  275. public function testHiddenCanAlsoExcludeRelationships()
  276. {
  277. $model = new EloquentModelStub;
  278. $model->name = 'Taylor';
  279. $model->setRelation('foo', array('bar'));
  280. $model->setHidden(array('foo'));
  281. $array = $model->toArray();
  282. $this->assertEquals(array('name' => 'Taylor'), $array);
  283. }
  284. public function testToArraySnakeAttributes()
  285. {
  286. $model = new EloquentModelStub;
  287. $model->setRelation('namesList', new Illuminate\Database\Eloquent\Collection(array(
  288. new EloquentModelStub(array('bar' => 'baz')), new EloquentModelStub(array('bam' => 'boom'))
  289. )));
  290. $array = $model->toArray();
  291. $this->assertEquals('baz', $array['names_list'][0]['bar']);
  292. $this->assertEquals('boom', $array['names_list'][1]['bam']);
  293. $model = new EloquentModelCamelStub;
  294. $model->setRelation('namesList', new Illuminate\Database\Eloquent\Collection(array(
  295. new EloquentModelStub(array('bar' => 'baz')), new EloquentModelStub(array('bam' => 'boom'))
  296. )));
  297. $array = $model->toArray();
  298. $this->assertEquals('baz', $array['namesList'][0]['bar']);
  299. $this->assertEquals('boom', $array['namesList'][1]['bam']);
  300. }
  301. public function testToArrayUsesMutators()
  302. {
  303. $model = new EloquentModelStub;
  304. $model->list_items = array(1, 2, 3);
  305. $array = $model->toArray();
  306. $this->assertEquals(array(1, 2, 3), $array['list_items']);
  307. }
  308. public function testFillable()
  309. {
  310. $model = new EloquentModelStub;
  311. $model->fillable(array('name', 'age'));
  312. $model->fill(array('name' => 'foo', 'age' => 'bar'));
  313. $this->assertEquals('foo', $model->name);
  314. $this->assertEquals('bar', $model->age);
  315. }
  316. public function testUnderscorePropertiesAreNotFilled()
  317. {
  318. $model = new EloquentModelStub;
  319. $model->fill(array('_method' => 'PUT'));
  320. $this->assertEquals(array(), $model->getAttributes());
  321. }
  322. public function testGuarded()
  323. {
  324. $model = new EloquentModelStub;
  325. $model->guard(array('name', 'age'));
  326. $model->fill(array('name' => 'foo', 'age' => 'bar', 'foo' => 'bar'));
  327. $this->assertFalse(isset($model->name));
  328. $this->assertFalse(isset($model->age));
  329. $this->assertEquals('bar', $model->foo);
  330. }
  331. /**
  332. * @expectedException Illuminate\Database\Eloquent\MassAssignmentException
  333. */
  334. public function testGlobalGuarded()
  335. {
  336. $model = new EloquentModelStub;
  337. $model->guard(array('*'));
  338. $model->fill(array('name' => 'foo', 'age' => 'bar', 'votes' => 'baz'));
  339. }
  340. public function testHasOneCreatesProperRelation()
  341. {
  342. $model = new EloquentModelStub;
  343. $this->addMockConnection($model);
  344. $relation = $model->hasOne('EloquentModelSaveStub');
  345. $this->assertEquals('save_stub.eloquent_model_stub_id', $relation->getForeignKey());
  346. $model = new EloquentModelStub;
  347. $this->addMockConnection($model);
  348. $relation = $model->hasOne('EloquentModelSaveStub', 'foo');
  349. $this->assertEquals('save_stub.foo', $relation->getForeignKey());
  350. $this->assertTrue($relation->getParent() === $model);
  351. $this->assertTrue($relation->getQuery()->getModel() instanceof EloquentModelSaveStub);
  352. }
  353. public function testMorphOneCreatesProperRelation()
  354. {
  355. $model = new EloquentModelStub;
  356. $this->addMockConnection($model);
  357. $relation = $model->morphOne('EloquentModelSaveStub', 'morph');
  358. $this->assertEquals('save_stub.morph_id', $relation->getForeignKey());
  359. $this->assertEquals('save_stub.morph_type', $relation->getMorphType());
  360. $this->assertEquals('EloquentModelStub', $relation->getMorphClass());
  361. }
  362. public function testHasManyCreatesProperRelation()
  363. {
  364. $model = new EloquentModelStub;
  365. $this->addMockConnection($model);
  366. $relation = $model->hasMany('EloquentModelSaveStub');
  367. $this->assertEquals('save_stub.eloquent_model_stub_id', $relation->getForeignKey());
  368. $model = new EloquentModelStub;
  369. $this->addMockConnection($model);
  370. $relation = $model->hasMany('EloquentModelSaveStub', 'foo');
  371. $this->assertEquals('save_stub.foo', $relation->getForeignKey());
  372. $this->assertTrue($relation->getParent() === $model);
  373. $this->assertTrue($relation->getQuery()->getModel() instanceof EloquentModelSaveStub);
  374. }
  375. public function testMorphManyCreatesProperRelation()
  376. {
  377. $model = new EloquentModelStub;
  378. $this->addMockConnection($model);
  379. $relation = $model->morphMany('EloquentModelSaveStub', 'morph');
  380. $this->assertEquals('save_stub.morph_id', $relation->getForeignKey());
  381. $this->assertEquals('save_stub.morph_type', $relation->getMorphType());
  382. $this->assertEquals('EloquentModelStub', $relation->getMorphClass());
  383. }
  384. public function testBelongsToCreatesProperRelation()
  385. {
  386. $model = new EloquentModelStub;
  387. $this->addMockConnection($model);
  388. $relation = $model->belongsToStub();
  389. $this->assertEquals('belongs_to_stub_id', $relation->getForeignKey());
  390. $this->assertTrue($relation->getParent() === $model);
  391. $this->assertTrue($relation->getQuery()->getModel() instanceof EloquentModelSaveStub);
  392. $model = new EloquentModelStub;
  393. $this->addMockConnection($model);
  394. $relation = $model->belongsToExplicitKeyStub();
  395. $this->assertEquals('foo', $relation->getForeignKey());
  396. }
  397. public function testMorphToCreatesProperRelation()
  398. {
  399. $model = m::mock('Illuminate\Database\Eloquent\Model[belongsTo]');
  400. $model->foo_type = 'FooClass';
  401. $model->shouldReceive('belongsTo')->with('FooClass', 'foo_id');
  402. $relation = $model->morphTo('foo');
  403. $model = m::mock('EloquentModelStub[belongsTo]');
  404. $model->morph_to_stub_type = 'FooClass';
  405. $model->shouldReceive('belongsTo')->with('FooClass', 'morph_to_stub_id');
  406. $relation = $model->morphToStub();
  407. }
  408. public function testBelongsToManyCreatesProperRelation()
  409. {
  410. $model = new EloquentModelStub;
  411. $this->addMockConnection($model);
  412. $relation = $model->belongsToMany('EloquentModelSaveStub');
  413. $this->assertEquals('eloquent_model_save_stub_eloquent_model_stub.eloquent_model_stub_id', $relation->getForeignKey());
  414. $this->assertEquals('eloquent_model_save_stub_eloquent_model_stub.eloquent_model_save_stub_id', $relation->getOtherKey());
  415. $this->assertTrue($relation->getParent() === $model);
  416. $this->assertTrue($relation->getQuery()->getModel() instanceof EloquentModelSaveStub);
  417. $model = new EloquentModelStub;
  418. $this->addMockConnection($model);
  419. $relation = $model->belongsToMany('EloquentModelSaveStub', 'table', 'foreign', 'other');
  420. $this->assertEquals('table.foreign', $relation->getForeignKey());
  421. $this->assertEquals('table.other', $relation->getOtherKey());
  422. $this->assertTrue($relation->getParent() === $model);
  423. $this->assertTrue($relation->getQuery()->getModel() instanceof EloquentModelSaveStub);
  424. }
  425. public function testModelsAssumeTheirName()
  426. {
  427. $model = new EloquentModelWithoutTableStub;
  428. $this->assertEquals('eloquent_model_without_table_stubs', $model->getTable());
  429. require_once __DIR__.'/stubs/EloquentModelNamespacedStub.php';
  430. $namespacedModel = new Foo\Bar\EloquentModelNamespacedStub;
  431. $this->assertEquals('foo_bar_eloquent_model_namespaced_stubs', $namespacedModel->getTable());
  432. }
  433. public function testTheMutatorCacheIsPopulated()
  434. {
  435. $class = new EloquentModelStub;
  436. $this->assertEquals(array('list_items', 'password'), $class->getMutatedAttributes());
  437. }
  438. protected function addMockConnection($model)
  439. {
  440. $model->setConnectionResolver($resolver = m::mock('Illuminate\Database\ConnectionResolverInterface'));
  441. $resolver->shouldReceive('connection')->andReturn(m::mock('Illuminate\Database\Connection'));
  442. $model->getConnection()->shouldReceive('getQueryGrammar')->andReturn(m::mock('Illuminate\Database\Query\Grammars\Grammar'));
  443. $model->getConnection()->shouldReceive('getPostProcessor')->andReturn(m::mock('Illuminate\Database\Query\Processors\Processor'));
  444. }
  445. }
  446. class EloquentModelStub extends Illuminate\Database\Eloquent\Model {
  447. protected $table = 'stub';
  448. protected $guarded = array();
  449. public function getListItemsAttribute($value)
  450. {
  451. return json_decode($value, true);
  452. }
  453. public function setListItemsAttribute($value)
  454. {
  455. $this->attributes['list_items'] = json_encode($value);
  456. }
  457. public function getPasswordAttribute()
  458. {
  459. return '******';
  460. }
  461. public function setPasswordAttribute($value)
  462. {
  463. $this->attributes['password_hash'] = md5($value);
  464. }
  465. public function belongsToStub()
  466. {
  467. return $this->belongsTo('EloquentModelSaveStub');
  468. }
  469. public function morphToStub()
  470. {
  471. return $this->morphTo();
  472. }
  473. public function belongsToExplicitKeyStub()
  474. {
  475. return $this->belongsTo('EloquentModelSaveStub', 'foo');
  476. }
  477. }
  478. class EloquentModelCamelStub extends EloquentModelStub {
  479. public static $snakeAttributes = false;
  480. }
  481. class EloquentDateModelStub extends EloquentModelStub {
  482. protected $dates = array('created_at', 'updated_at');
  483. }
  484. class EloquentModelSaveStub extends Illuminate\Database\Eloquent\Model {
  485. protected $table = 'save_stub';
  486. protected $guarded = array();
  487. public function save() { $_SERVER['__eloquent.saved'] = true; }
  488. public function setIncrementing($value)
  489. {
  490. $this->incrementing = $value;
  491. }
  492. }
  493. class EloquentModelFindStub extends Illuminate\Database\Eloquent\Model {
  494. public function newQuery()
  495. {
  496. $mock = m::mock('Illuminate\Database\Eloquent\Builder');
  497. $mock->shouldReceive('find')->once()->with(1, array('*'))->andReturn('foo');
  498. return $mock;
  499. }
  500. }
  501. class EloquentModelFindManyStub extends Illuminate\Database\Eloquent\Model {
  502. public function newQuery()
  503. {
  504. $mock = m::mock('Illuminate\Database\Eloquent\Builder');
  505. $mock->shouldReceive('whereIn')->once()->with('id', array(1, 2))->andReturn($mock);
  506. $mock->shouldReceive('get')->once()->with(array('*'))->andReturn('foo');
  507. return $mock;
  508. }
  509. }
  510. class EloquentModelWithStub extends Illuminate\Database\Eloquent\Model {
  511. public function newQuery()
  512. {
  513. $mock = m::mock('Illuminate\Database\Eloquent\Builder');
  514. $mock->shouldReceive('with')->once()->with(array('foo', 'bar'))->andReturn('foo');
  515. return $mock;
  516. }
  517. }
  518. class EloquentModelWithoutTableStub extends Illuminate\Database\Eloquent\Model {}