複数データ削除テストの正常処理完了時については作成できましたので、続いてエラー時のテストを行っていきます。
今回の目的
複数削除仕様についてテストを作成し、問題なく処理できることを確認する
なぜやるか
テスト処理によって問題なく動作することを担保するため
やりたいこと
未選択状態で削除実施時にエラーとなっていること
上限超過データは削除されないこと
所有者のいる書籍は削除しようとしても失敗すること
やったこと
postデータなしで削除を行い、バリデーションエラーとなることを確認する
上限超過データは削除されていないことを確認する
所有者ありの書籍を削除してエラー結果を確認する
他者の所有書籍情報が消せないことを確認する
実施内容
書籍情報削除エラー時のテストを行う
削除書籍を選択せずにpostする
まずは何も選択せずに削除処理を実施した場合をテストします。
# ~/tests/Feature/BookdataTest.php
// 複数削除エラー、postデータなし
public function test_bookControll_ng_someDeleteNotEntry(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 送信フォームパス
$formpath = 'book/somedelete';
// 削除データ
$deletedata = ;
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasErrors(); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('book'); // bookビューであること
$this->assertEquals('削除する本が選択されていません',
session('errors')->first('deletebook')); // エラメッセージを確認
}
削除データとして空データを設定しpost送信を行います。
バリデーションによりエラーとなるので、リダイレクトされてエラーメッセージが表示されていることを確認します。
上限超過データ受付時の処理を確認する
次は上限を指定してあるので、超過時の処理ができていることを確認します。
# ~/tests/Feature/BookdataTest.php
// 複数削除エラー、上限超過処理
public function test_bookControll_ng_someDeleteLimitNumber(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
$count = 20;// 上限設定
// faker 自動生成
$delete_bookdatas = factory(Bookdata::class, $count+1)->create();
// 送信フォームパス
$formpath = 'book/somedelete';
// 削除データ
$deletedata = ['select_books' => range(1, 20)];
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('書籍削除結果'); // 登録結果ページが出力されていること
// 編集ISBN番号結果確認
for ($i = 0; $i < $count+1; $i++){
if ($i < $count){ // 上限数まで結果表示されること
$response->assertSeeText($delete_bookdatas[$i]->title);
// タイトルが反映されていること
} else { // 上限超過データは扱われていないこと
$response->assertDontSeeText($delete_bookdatas[$i]->title);
// タイトルが反映されていないこと
}
}
}
上限+1件の書籍を登録しておき、削除を行います。
超過分は処理が行われないので、結果として表示されていないことを確認できれば完了です。
所有者がいる書籍は削除できないことを確認する
最後は、所有者がいる場合は書籍自体は削除できないことを確認します。
# ~/tests/Feature/BookdataTest.php
// 複数削除エラー、所有者あり
public function test_bookControll_ng_someDeleteHaveProperty(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// faker 自動生成
$delete_bookdata = factory(Property::class)->create();
// 送信フォームパス
$formpath = 'book/somedelete';
// 削除データ
$deletedata = ['select_books' => [$delete_bookdata->bookdata_id]];
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('書籍削除結果'); // 登録結果ページが出力されていること
$response->assertSeeText($delete_bookdata->bookdata->title); // タイトルが反映されていること
$response->assertSeeText('所有者がいるため削除できません'); // 処理結果が反映されていること
}
初めにユーザーを作成しておきログインをしておきます。
その後factoryで所有者ありの書籍を生成します。ここでユーザーidを指定していないので、新しいユーザーで所有者あり書籍が作成されます。
後は、この本を削除しようとすれば、最初にログインしたユーザー以外で所有者がいるので、エラーとなって結果が出力されていることを確認しています。
所有書籍削除エラー時のテストを行う
次は所有している本の一覧から所有状態を解除するパターンに対してのテストです。
削除書籍を選択せずにpostする
こちらも、何も選択せずにpost送信した場合から確認します。
# ~/tests/Feature/PropertyTest.php
// 複数削除エラー、postデータなし
public function test_propertyControll_ng_someDeleteNotEntry(){
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 送信フォームパス
$formpath = 'property/somedelete';
// 削除データ
$deletedata = ;
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasErrors(); // エラーメッセージがあること
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('property'); // propertyビューであること
$this->assertEquals('所有書籍から解除する本が選択されていません',
session('errors')->first('deleteproperty')); // エラメッセージを確認
}
書籍情報削除とほぼ同一です。bookからpropertyに変更しています。
上限超過データ受付時の処理を確認する
こちらも書籍情報同様に上限指定があるので、処理ができていることを確認します。
# ~/tests/Feature/PropertyTest.php
// 複数削除エラー、上限超過処理
public function test_propertyControll_ng_someDeleteLimitNumber(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
$count = 20;// 上限設定
// faker 自動生成
$delete_propertydatas = factory(Property::class, $count+1)->create([
'user_id' => $user->id,
]);
// 送信フォームパス
$formpath = 'property/somedelete';
// 削除データ
$deletedata = ['select_books' => range(1, 20)];
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(200); // 200ステータスであること
$response->assertSeeText('所有書籍情報解除結果'); // 登録結果ページが出力されていること
// 編集ISBN番号結果確認
for ($i = 0; $i < $count+1; $i++){
if ($count > $i){ // 上限数まで結果表示されること
$response->assertSeeText($delete_propertydatas[$i]->bookdata->title);
// タイトルが反映されていること
} else { // 上限超過データは扱われていないこと
$response->assertDontSeeText($delete_propertydatas[$i]->bookdata->title);
// タイトルが反映されていないこと
}
}
}
ログインユーザー自身の所有書籍を削除する必要が有るので、factoryにて所有書籍作成時にユーザーidがログインユーザーとなるように指定しています。
あとは書籍情報と同様に削除処理と結果を確認しています。
所有者以外のデータを削除しようとする
最後は、ログインユーザー以外の所有書籍情報を削除します。他のユーザー情報なので、削除できないことを確認します。
# ~/tests/Feature/PropertyTest.php
// 複数削除エラー、他者データ削除
public function test_bookControll_ng_someDeleteOtherHaveProperty(){
//// ユーザー生成
$user = factory(User::class)->create(); // ユーザーを作成
$this->actingAs($user); // ログイン済み
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// faker 自動生成
$delete_bookdata = factory(Property::class)->create();
// 送信フォームパス
$formpath = 'property/somedelete';
// 削除データ
$deletedata = ['select_books' => [$delete_bookdata->id]];
//// 削除
$response = $this->from($formpath)->post($formpath, $deletedata); // 削除実施
$response->assertSessionHasNoErrors(); // エラーメッセージがないこと
$response->assertStatus(500); // 500ステータスであること
}
ログインユーザーを作成しておき、factoryにて所有者情報ありの書籍情報を生成します。このとき、ユーザーidを指定していないので、新規にユーザーも作成されています。
そして、この情報を削除しようとすると、他人のデータの為消せないのでエラーとなっていることを確認しています。
以上で複数削除時のエラーテストは完了です。
書籍情報をまとめて削除する機能については以上で完了です。