From 518dee77301d70c503c44017dbb2781049b89695 Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Tue, 5 Apr 2016 00:03:09 +1000 Subject: [PATCH] Write MorphOne model test Refs #1868 --- .../plugins/database/tester/models/Author.php | 3 + .../plugins/database/tester/models/Meta.php | 24 +++ .../plugins/database/tester/models/Post.php | 3 + .../tester/updates/create_meta_table.php | 32 ++++ .../database/tester/updates/version.yaml | 1 + .../unit/plugins/database/HasOneModelTest.php | 2 +- .../plugins/database/MorphOneModelTest.php | 156 ++++++++++++++++++ 7 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/plugins/database/tester/models/Meta.php create mode 100644 tests/fixtures/plugins/database/tester/updates/create_meta_table.php create mode 100644 tests/unit/plugins/database/MorphOneModelTest.php diff --git a/tests/fixtures/plugins/database/tester/models/Author.php b/tests/fixtures/plugins/database/tester/models/Author.php index 7379eb6a1..ec084f3c6 100644 --- a/tests/fixtures/plugins/database/tester/models/Author.php +++ b/tests/fixtures/plugins/database/tester/models/Author.php @@ -39,6 +39,9 @@ class Author extends Model 'event_log' => ['Database\Tester\Models\EventLog', 'name' => 'related', 'delete' => true, 'softDelete' => true], ]; + public $morphOne = [ + 'meta' => ['Database\Tester\Models\Meta', 'name' => 'taggable'], + ]; } class SoftDeleteAuthor extends Author diff --git a/tests/fixtures/plugins/database/tester/models/Meta.php b/tests/fixtures/plugins/database/tester/models/Meta.php new file mode 100644 index 000000000..2abd6853e --- /dev/null +++ b/tests/fixtures/plugins/database/tester/models/Meta.php @@ -0,0 +1,24 @@ + [] + ]; + + public $fillable = [ + 'meta_title', + 'meta_description', + 'meta_keywords', + 'canonical_url', + 'redirect_url', + 'robot_index', + 'robot_follow' + ]; +} diff --git a/tests/fixtures/plugins/database/tester/models/Post.php b/tests/fixtures/plugins/database/tester/models/Post.php index 86603810d..f583f303f 100644 --- a/tests/fixtures/plugins/database/tester/models/Post.php +++ b/tests/fixtures/plugins/database/tester/models/Post.php @@ -31,6 +31,9 @@ class Post extends Model 'event_log' => ['Database\Tester\Models\EventLog', 'name' => 'related', 'delete' => true, 'softDelete' => true], ]; + public $morphOne = [ + 'meta' => ['Database\Tester\Models\Meta', 'name' => 'taggable'], + ]; } class NullablePost extends Post diff --git a/tests/fixtures/plugins/database/tester/updates/create_meta_table.php b/tests/fixtures/plugins/database/tester/updates/create_meta_table.php new file mode 100644 index 000000000..3d942798c --- /dev/null +++ b/tests/fixtures/plugins/database/tester/updates/create_meta_table.php @@ -0,0 +1,32 @@ +engine = 'InnoDB'; + $table->increments('id')->unsigned(); + $table->integer('taggable_id')->unsigned()->index()->nullable(); + $table->string('taggable_type')->nullable(); + $table->string('meta_title')->nullable(); + $table->string('meta_description')->nullable(); + $table->string('meta_keywords')->nullable(); + $table->string('canonical_url')->nullable(); + $table->string('redirect_url')->nullable(); + $table->string('robot_index')->nullable(); + $table->string('robot_follow')->nullable(); + }); + } + + public function down() + { + Schema::dropIfExists('database_tester_meta'); + } + +} diff --git a/tests/fixtures/plugins/database/tester/updates/version.yaml b/tests/fixtures/plugins/database/tester/updates/version.yaml index 4dfc4ff9f..613fc5337 100644 --- a/tests/fixtures/plugins/database/tester/updates/version.yaml +++ b/tests/fixtures/plugins/database/tester/updates/version.yaml @@ -8,3 +8,4 @@ - create_roles_table.php - create_users_table.php - create_event_log_table.php + - create_meta_table.php diff --git a/tests/unit/plugins/database/HasOneModelTest.php b/tests/unit/plugins/database/HasOneModelTest.php index f1cb34b45..02251902b 100644 --- a/tests/unit/plugins/database/HasOneModelTest.php +++ b/tests/unit/plugins/database/HasOneModelTest.php @@ -104,4 +104,4 @@ class HasOneModelTest extends PluginTestCase $this->assertNull($phone->author_id); $this->assertNull($author->phone); } -} \ No newline at end of file +} diff --git a/tests/unit/plugins/database/MorphOneModelTest.php b/tests/unit/plugins/database/MorphOneModelTest.php new file mode 100644 index 000000000..d8cb43ca3 --- /dev/null +++ b/tests/unit/plugins/database/MorphOneModelTest.php @@ -0,0 +1,156 @@ +runPluginRefreshCommand('Database.Tester'); + } + + public function testSetRelationValue() + { + Model::unguard(); + $post = Post::create(['title' => "First post", 'description' => "Yay!!"]); + $author = Author::create(['name' => 'Stevie', 'email' => 'stevie@email.tld']); + $meta1 = Meta::create([ + 'meta_title' => 'Question', + 'meta_description' => 'Industry', + 'meta_keywords' => 'major', + 'canonical_url' => 'http://google.com/search/jobs', + 'redirect_url' => 'http://google.com', + 'robot_index' => 'index', + 'robot_follow' => 'follow', + ]); + $meta2 = Meta::create([ + 'meta_title' => 'Comment', + 'meta_description' => 'Social', + 'meta_keywords' => 'startup', + 'canonical_url' => 'http://facebook.com/search/users', + 'redirect_url' => 'http://facebook.com', + 'robot_index' => 'index', + 'robot_follow' => 'follow', + ]); + $meta3 = Meta::make([ + 'meta_title' => 'Answer', + 'meta_description' => 'Employment', + 'meta_keywords' => 'minor', + 'canonical_url' => 'http://yahoo.com/search/stats', + 'redirect_url' => 'http://yahoo.com', + 'robot_index' => 'index', + 'robot_follow' => 'follow', + ]); + Model::reguard(); + + // Set by Model object + $post->meta = $meta1; + $post->save(); + $this->assertEquals($post->id, $meta1->taggable_id); + $this->assertEquals(get_class($post), $meta1->taggable_type); + $this->assertEquals('Question', $post->meta->meta_title); + + // Set by primary key + $metaId = $meta2->id; + $author->meta = $metaId; + $author->save(); + $meta2 = Meta::find($metaId); + $this->assertEquals($author->id, $meta2->taggable_id); + $this->assertEquals(get_class($author), $meta2->taggable_type); + $this->assertEquals('Comment', $author->meta->meta_title); + + // Nullify + $author->meta = null; + $author->save(); + $meta = Meta::find($metaId); + $this->assertNull($meta->taggable_type); + $this->assertNull($meta->taggable_id); + $this->assertNull($meta->taggable); + + // Deferred in memory + $author->meta = $meta3; + $this->assertEquals('Answer', $author->meta->meta_title); + $this->assertEquals($author->id, $meta3->taggable_id); + } + + public function testGetRelationValue() + { + Model::unguard(); + $author = Author::create(['name' => 'Stevie']); + $meta = Meta::create([ + 'taggable_id' => $author->id, + 'taggable_type' => get_class($author), + 'meta_title' => 'Question', + 'meta_description' => 'Industry', + 'meta_keywords' => 'major', + 'canonical_url' => 'http://google.com/search/jobs', + 'redirect_url' => 'http://google.com', + 'robot_index' => 'index', + 'robot_follow' => 'follow', + ]); + Model::reguard(); + + $this->assertEquals($meta->id, $author->getRelationValue('meta')); + } + + public function testDeferredBinding() + { + $sessionKey = uniqid('session_key', true); + + Model::unguard(); + $author = Author::create(['name' => 'Stevie']); + $meta = Meta::create([ + 'meta_title' => 'Comment', + 'meta_description' => 'Social', + 'meta_keywords' => 'startup', + 'canonical_url' => 'http://facebook.com/search/users', + 'redirect_url' => 'http://facebook.com', + 'robot_index' => 'index', + 'robot_follow' => 'follow', + ]); + Model::reguard(); + + $metaId = $meta->id; + + // Deferred add + $author->meta()->add($meta, $sessionKey); + $this->assertNull($meta->taggable_id); + $this->assertNull($author->meta); + + $this->assertEquals(0, $author->meta()->count()); + $this->assertEquals(1, $author->meta()->withDeferred($sessionKey)->count()); + + // Commit deferred + $author->save(null, $sessionKey); + $meta = Meta::find($metaId); + $this->assertEquals(1, $author->meta()->count()); + $this->assertEquals($author->id, $meta->taggable_id); + $this->assertEquals('Comment', $author->meta->meta_title); + + // New session + $sessionKey = uniqid('session_key', true); + + // Deferred remove + $author->meta()->remove($meta, $sessionKey); + $this->assertEquals(1, $author->meta()->count()); + $this->assertEquals(0, $author->meta()->withDeferred($sessionKey)->count()); + $this->assertEquals($author->id, $meta->taggable_id); + $this->assertEquals('Comment', $author->meta->meta_title); + + // Commit deferred + $author->save(null, $sessionKey); + $meta = Meta::find($metaId); + $this->assertEquals(0, $author->meta()->count()); + $this->assertNull($meta->taggable_id); + $this->assertNull($author->meta); + } +}