PageRenderTime 52ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/Database/DatabaseEloquentModelTest.php

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