From d3e2ba8f47e20f2f573fdd78112b24284479dedf Mon Sep 17 00:00:00 2001 From: Noah Halstead Date: Mon, 12 Oct 2020 19:17:59 -0400 Subject: [PATCH] Added Tests and Migrations --- phpunit.xml.dist | 13 +++ tests/AggregateTest.php | 104 ++++++++++++++++++ tests/TestCase.php | 28 +++++ .../2020_10_11_000000_create_genres_table.php | 32 ++++++ .../2020_10_12_000000_create_books_table.php | 34 ++++++ 5 files changed, 211 insertions(+) create mode 100644 phpunit.xml.dist create mode 100644 tests/AggregateTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/database/migrations/2020_10_11_000000_create_genres_table.php create mode 100644 tests/database/migrations/2020_10_12_000000_create_books_table.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..6e62529 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,13 @@ + + + + + src/ + + + + + ./tests/ + + + diff --git a/tests/AggregateTest.php b/tests/AggregateTest.php new file mode 100644 index 0000000..0b41bcc --- /dev/null +++ b/tests/AggregateTest.php @@ -0,0 +1,104 @@ +insert([ + ["name" => "Fiction"], + ["name" => "Science Fiction"], + ["name" => "Action Adventure"], + ]); + + DB::table('books')->insert([ + ["title" => "Catching Fire", "genre_id" => 1], + ["title" => "The Hunger Games", "genre_id" => 1], + ["title" => "Nineteen Eighty-Four", "genre_id" => 2], + ["title" => "The Martian", "genre_id" => 2], + ["title" => "Treasure Island", "genre_id" => 3], + ["title" => "Hatchet", "genre_id" => 3], + ]); + } + + public function testCheckDangling() + { + $all = Genre::all(); + + foreach($all as $genre) { + $this->assertEquals(2, $genre->countTransferable()); + } + } + + public function testRejectDeleteWhileContainsDangling() + { + + $category = Genre::find(2); + + $this->assertEquals(2, $category->books()->count()); + $this->expectException(DanglingRelationships::class); + $category->delete(); + } + + public function testDeleteAfterTransferDanglingDryRun() + { + $newCategory = Genre::find(1); + $category = Genre::find(2); + + $this->assertEquals(2, $category->countTransferable()); + + $changed = $category->transferTo($newCategory, true); + $this->assertEquals(2, $changed); + + $this->assertEquals(4, $newCategory->countTransferable()); + $this->assertEquals(2, $category->countTransferable()); + } + + public function testDeleteAfterTransferDangling() + { + $newCategory = Genre::find(1); + $category = Genre::find(2); + + $this->assertEquals(2, $category->countTransferable()); + + $changed = $category->transferTo($newCategory); + $this->assertEquals(2, $changed); + + $this->assertEquals(4, $newCategory->countTransferable()); + $this->assertEquals(0, $category->countTransferable()); + + $category->delete(); + } + +} + +class Book extends Model +{ + public function genre() + { + return $this->belongsTo(Genre::class); + } +} + +class Genre extends Model implements NoDanglingRelationships +{ + use TransferableRelationship; + + protected $transferable = [ + "books" + ]; + + public function books() + { + return $this->hasMany(Book::class); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..b7a0bdc --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,28 @@ +loadMigrationsFrom(__DIR__ . '/database/migrations'); + + $this->artisan('migrate'); + } + + protected function getEnvironmentSetUp($app) + { + $app['config']->set('database.default', 'testbench'); + + $app['config']->set('database.connections.testbench', [ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + } +} diff --git a/tests/database/migrations/2020_10_11_000000_create_genres_table.php b/tests/database/migrations/2020_10_11_000000_create_genres_table.php new file mode 100644 index 0000000..c6eb045 --- /dev/null +++ b/tests/database/migrations/2020_10_11_000000_create_genres_table.php @@ -0,0 +1,32 @@ +increments("id"); + $table->string("name"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists("genres"); + } +} diff --git a/tests/database/migrations/2020_10_12_000000_create_books_table.php b/tests/database/migrations/2020_10_12_000000_create_books_table.php new file mode 100644 index 0000000..ce5a725 --- /dev/null +++ b/tests/database/migrations/2020_10_12_000000_create_books_table.php @@ -0,0 +1,34 @@ +increments("id"); + $table->string("title"); + $table->integer("genre_id")->unsigned(); + $table->foreign("genre_id")->references("id")->on("genres"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists("books"); + } +}