diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 9f42f99..74c899b 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -13,14 +13,14 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.2', '7.3', '7.4'] + php-versions: ['7.3', '7.4', '8.0'] steps: - name: Setup PHP Action - uses: shivammathur/setup-php@1.8.2 + uses: shivammathur/setup-php@v2 with: extensions: intl php-version: "${{ matrix.php-versions }}" - coverage: pcov + coverage: xdebug - name: Shutdown Ubuntu MySQL (SUDO) run: sudo service mysql stop - name: Setup MySQL @@ -50,7 +50,7 @@ jobs: run: | composer require --dev infection/infection vendor/bin/infection - - if: matrix.php-versions == '7.2' + - if: matrix.php-versions == '7.3' name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: @@ -59,4 +59,4 @@ jobs: flags: tests name: codecov-umbrella yml: ./codecov.yml - fail_ci_if_error: true \ No newline at end of file + fail_ci_if_error: true diff --git a/composer.json b/composer.json index 5b564d6..95263f0 100644 --- a/composer.json +++ b/composer.json @@ -18,13 +18,13 @@ } ], "require": { - "php": "^7.2" + "php": "^7.3 || ^8.0" }, "require-dev": { "codeigniter4/codeigniter4-standard": "^1.0.1", - "codeigniter4/framework": "^4.0.3", + "codeigniter4/framework": "^4.1", "phpstan/phpstan": "^0.12.14", - "phpunit/phpunit": "^8", + "phpunit/phpunit": "^9", "squizlabs/php_codesniffer": "^3.1" }, "config": { diff --git a/phpstan.neon b/phpstan.neon index a2f2615..84e2739 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -2,7 +2,8 @@ includes: - vendor/phpstan/phpstan/conf/bleedingEdge.neon parameters: - bootstrap: bootstrap.php + bootstrapFiles: + - bootstrap.php inferPrivatePropertyTypeFromConstructor: true checkMissingIterableValueType: false excludes_analyse: @@ -15,4 +16,3 @@ parameters: - '#Call to an undefined static method Config\\Services::albumRepository\(\)#' - '#Call to an undefined static method Config\\Services::trackRepository\(\)#' - '#Call to an undefined static method Config\\Services::albumTrackSummary\(\)#' - - '#Call to protected method builder\(\) of class CodeIgniter\\Model.#' \ No newline at end of file diff --git a/src/Controllers/Album.php b/src/Controllers/Album.php index 0ef7dc2..76604ae 100644 --- a/src/Controllers/Album.php +++ b/src/Controllers/Album.php @@ -9,6 +9,9 @@ class Album extends BaseController { + /** @var \CodeIgniter\HTTP\IncomingRequest */ + protected $request; + /** @var AlbumRepository */ private $repository; diff --git a/src/Controllers/Track.php b/src/Controllers/Track.php index b1673a8..bad46cd 100644 --- a/src/Controllers/Track.php +++ b/src/Controllers/Track.php @@ -10,6 +10,9 @@ class Track extends BaseController { + /** @var \CodeIgniter\HTTP\IncomingRequest */ + protected $request; + /** @var AlbumRepository */ private $albumRepository; diff --git a/src/Infrastructure/Persistence/DMLPersistence.php b/src/Infrastructure/Persistence/DMLPersistence.php index 69e5943..a972bec 100644 --- a/src/Infrastructure/Persistence/DMLPersistence.php +++ b/src/Infrastructure/Persistence/DMLPersistence.php @@ -1,5 +1,6 @@ model instanceof Model && $this->model->save(new $this->model->returnType($data)); + try + { + return $this->model instanceof Model && $this->model->save(new $this->model->returnType($data)); + } + catch (DataException $e) + { + return false; + } } } diff --git a/test/Controller/AlbumTest.php b/test/Controller/AlbumTest.php index 47a9cd6..42f65de 100644 --- a/test/Controller/AlbumTest.php +++ b/test/Controller/AlbumTest.php @@ -2,8 +2,9 @@ use Album\Controllers\Album; use Album\Database\Seeds\AlbumSeeder; -use CodeIgniter\Test\CIDatabaseTestCase; -use CodeIgniter\Test\ControllerTester; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\ControllerTestTrait; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Database; use Config\Services; @@ -11,9 +12,9 @@ * @runTestsInSeparateProcesses * @preserveGlobalState disabled */ -class AlbumTest extends CIDatabaseTestCase +class AlbumTest extends CIUnitTestCase { - use ControllerTester; + use DatabaseTestTrait, ControllerTestTrait; protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; @@ -44,7 +45,7 @@ public function testIndexAlbumHasData() public function testIndexSearchAlbumFound() { $request = Services::request(); - $request->setMethod('get'); + $request = $request->withMethod('get'); $request->setGlobal('get', [ 'keyword' => 'Sheila', ]); @@ -59,7 +60,7 @@ public function testIndexSearchAlbumFound() public function testIndexSearchAlbumNotFound() { $request = Services::request(); - $request->setMethod('get'); + $request = $request->withMethod('get'); $request->setGlobal('get', [ 'keyword' => 'Siti', ]); @@ -82,28 +83,19 @@ public function testAddAlbum() public function testAddAlbumInvalidData() { $request = Services::request(null, false); - $request->setMethod('post'); + $request = $request->withMethod('post'); - $result = $this->withRequest($request) - ->controller(Album::class) - ->execute('add'); - $this->assertTrue($result->isRedirect()); + $this->withRequest($request) + ->controller(Album::class) + ->execute('add'); - $request = Services::request(null, false); - $request->setMethod('get'); - - $result = $this->withRequest($request) - ->controller(Album::class) - ->execute('add'); - $this->assertTrue($result->isOK()); - $this->assertTrue($result->see('The artist field is required.')); - $this->assertTrue($result->see('The title field is required.')); + $this->seeNumRecords(1, 'album', []); } public function testAddAlbumValidData() { $request = Services::request(); - $request->setMethod('post'); + $request = $request->withMethod('post'); $request->setGlobal('post', [ 'artist' => 'Siti Nurhaliza', 'title' => 'Anugrah Aidilfitri', @@ -135,28 +127,19 @@ public function testEditExistenceAlbum() public function testEditAlbumInvalidData() { $request = Services::request(null, false); - $request->setMethod('post'); + $request = $request->withMethod('post'); $result = $this->withRequest($request) ->controller(Album::class) ->execute('edit', 1); $this->assertTrue($result->isRedirect()); - - $request = Services::request(null, false); - $request->setMethod('get'); - - $result = $this->withRequest($request) - ->controller(Album::class) - ->execute('edit', 1); - $this->assertTrue($result->isOK()); - $this->assertTrue($result->see('The artist field is required.')); - $this->assertTrue($result->see('The title field is required.')); + $this->assertNotEquals('http://localhost:8080/index.php/album', $result->getRedirectUrl()); } public function testEditAlbumValidData() { $request = Services::request(); - $request->setMethod('post'); + $request = $request->withMethod('post'); $request->setGlobal('post', [ 'id' => 1, 'artist' => 'Siti Nurhaliza', @@ -168,6 +151,7 @@ public function testEditAlbumValidData() ->execute('edit', 1); $this->assertTrue($result->isRedirect()); + $this->assertEquals('http://localhost:8080/index.php/album', $result->getRedirectUrl()); } public function testDeleteUnexistenceAlbum() diff --git a/test/Controller/AlbumTrackSummaryTest.php b/test/Controller/AlbumTrackSummaryTest.php index a45586c..8752436 100644 --- a/test/Controller/AlbumTrackSummaryTest.php +++ b/test/Controller/AlbumTrackSummaryTest.php @@ -3,13 +3,18 @@ use Album\Controllers\AlbumTrackSummary; use Album\Database\Seeds\AlbumSeeder; use Album\Database\Seeds\TrackSeeder; -use CodeIgniter\Test\CIDatabaseTestCase; -use CodeIgniter\Test\ControllerTester; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\ControllerTestTrait; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Database; -class AlbumTrackSummaryTest extends CIDatabaseTestCase +/** + * @runTestsInSeparateProcesses + * @preserveGlobalState disabled + */ +class AlbumTrackSummaryTest extends CIUnitTestCase { - use ControllerTester; + use ControllerTestTrait, DatabaseTestTrait; protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; @@ -37,6 +42,6 @@ public function testTotalSongSummaryHasData() ->execute('totalsong'); $this->assertTrue($result->isOK()); - $this->assertRegExp('/Sheila On 7<\/td>\s{0,}\n\s{0,}1<\/td>/', $result->getBody()); + $this->assertMatchesRegularExpression('/Sheila On 7<\/td>\s{0,}\n\s{0,}1<\/td>/', $result->getBody()); } } diff --git a/test/Controller/TrackTest.php b/test/Controller/TrackTest.php index 1eabbb5..4ad7685 100644 --- a/test/Controller/TrackTest.php +++ b/test/Controller/TrackTest.php @@ -3,8 +3,9 @@ use Album\Controllers\Track; use Album\Database\Seeds\AlbumSeeder; use Album\Database\Seeds\TrackSeeder; -use CodeIgniter\Test\CIDatabaseTestCase; -use CodeIgniter\Test\ControllerTester; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\ControllerTestTrait; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Database; use Config\Services; @@ -12,9 +13,9 @@ * @runTestsInSeparateProcesses * @preserveGlobalState disabled */ -class TrackTest extends CIDatabaseTestCase +class TrackTest extends CIUnitTestCase { - use ControllerTester; + use DatabaseTestTrait, ControllerTestTrait; protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; @@ -56,7 +57,7 @@ public function testIndexTrackHasData() public function testIndexSearchTrackFound() { $request = Services::request(); - $request->setMethod('get'); + $request = $request->withMethod('get'); $request->setGlobal('get', [ 'keyword' => 'kisah', ]); @@ -71,7 +72,7 @@ public function testIndexSearchTrackFound() public function testIndexSearchTrackNotFound() { $request = Services::request(); - $request->setMethod('get'); + $request = $request->withMethod('get'); $request->setGlobal('get', [ 'keyword' => 'Purnama', ]); @@ -102,28 +103,19 @@ public function testAddTrack() public function testAddTrackInvalidData() { $request = Services::request(null, false); - $request->setMethod('post'); + $request = $request->withMethod('post'); $result = $this->withRequest($request) ->controller(Track::class) ->execute('add', 1); $this->assertTrue($result->isRedirect()); - - $request = Services::request(null, false); - $request->setMethod('get'); - - $result = $this->withRequest($request) - ->controller(Track::class) - ->execute('add', 1); - $this->assertTrue($result->isOK()); - $this->assertTrue($result->see('The title field is required.')); - $this->assertTrue($result->see('The author field is required.')); + $this->seeNumRecords(1, 'track', []); } public function testAddTrackValidData() { $request = Services::request(); - $request->setMethod('post'); + $request = $request->withMethod('post'); $request->setGlobal('post', [ 'album_id' => 1, 'title' => 'Sahabat Sejati', @@ -156,28 +148,19 @@ public function testEditExistenceTrack() public function testEditTrackInvalidData() { $request = Services::request(null, false); - $request->setMethod('post'); + $request = $request->withMethod('post'); $result = $this->withRequest($request) ->controller(Track::class) ->execute('edit', 1, 1); $this->assertTrue($result->isRedirect()); - - $request = Services::request(null, false); - $request->setMethod('get'); - - $result = $this->withRequest($request) - ->controller(Track::class) - ->execute('edit', 1, 1); - $this->assertTrue($result->isOK()); - $this->assertTrue($result->see('The title field is required.')); - $this->assertTrue($result->see('The author field is required.')); + $this->assertNotEquals('http://localhost:8080/index.php/album-track/1', $result->getRedirectUrl()); } public function testEditTrackValidData() { $request = Services::request(); - $request->setMethod('post'); + $request = $request->withMethod('post'); $request->setGlobal('post', [ 'id' => 1, 'album_id' => 1, @@ -190,6 +173,7 @@ public function testEditTrackValidData() ->execute('edit', 1, 1); $this->assertTrue($result->isRedirect()); + $this->assertEquals('http://localhost:8080/index.php/album-track/1', $result->getRedirectUrl()); } public function testDeleteUnexistenceTrack() diff --git a/test/Database/Infrastructure/Persistence/Album/SQLAlbumRepositoryTest.php b/test/Database/Infrastructure/Persistence/Album/SQLAlbumRepositoryTest.php index 18bac6f..bdafacb 100644 --- a/test/Database/Infrastructure/Persistence/Album/SQLAlbumRepositoryTest.php +++ b/test/Database/Infrastructure/Persistence/Album/SQLAlbumRepositoryTest.php @@ -3,11 +3,14 @@ use Album\Database\Seeds\AlbumSeeder; use Album\Domain\Album\Album; use Album\Domain\Album\AlbumNotFoundException; -use CodeIgniter\Test\CIDatabaseTestCase; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Services; -class SQLAlbumRepositoryTest extends CIDatabaseTestCase +class SQLAlbumRepositoryTest extends CIUnitTestCase { + use DatabaseTestTrait; + protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; protected $seed = AlbumSeeder::class; diff --git a/test/Database/Infrastructure/Persistence/AlbumTrackSummary/SQLAlbumTrackSummaryRepositoryTest.php b/test/Database/Infrastructure/Persistence/AlbumTrackSummary/SQLAlbumTrackSummaryRepositoryTest.php index b2a633a..4d1ab63 100644 --- a/test/Database/Infrastructure/Persistence/AlbumTrackSummary/SQLAlbumTrackSummaryRepositoryTest.php +++ b/test/Database/Infrastructure/Persistence/AlbumTrackSummary/SQLAlbumTrackSummaryRepositoryTest.php @@ -2,11 +2,14 @@ use Album\Database\Seeds\AlbumSeeder; use Album\Database\Seeds\TrackSeeder; -use CodeIgniter\Test\CIDatabaseTestCase; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Services; -class SQLAlbumTrackSummaryRepositoryTest extends CIDatabaseTestCase +class SQLAlbumTrackSummaryRepositoryTest extends CIUnitTestCase { + use DatabaseTestTrait; + protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; protected $seed = [ diff --git a/test/Database/Infrastructure/Persistence/Track/SQLTrackRepositoryTest.php b/test/Database/Infrastructure/Persistence/Track/SQLTrackRepositoryTest.php index 22917fc..084756d 100644 --- a/test/Database/Infrastructure/Persistence/Track/SQLTrackRepositoryTest.php +++ b/test/Database/Infrastructure/Persistence/Track/SQLTrackRepositoryTest.php @@ -5,11 +5,14 @@ use Album\Domain\Album\Album; use Album\Domain\Track\Track; use Album\Domain\Track\TrackNotFoundException; -use CodeIgniter\Test\CIDatabaseTestCase; +use CodeIgniter\Test\CIUnitTestCase; +use CodeIgniter\Test\DatabaseTestTrait; use Config\Services; -class SQLTrackRepositoryTest extends CIDatabaseTestCase +class SQLTrackRepositoryTest extends CIUnitTestCase { + use DatabaseTestTrait; + protected $basePath = __DIR__ . '/../src/Database/'; protected $namespace = 'Album'; protected $seed = [