propertyテーブルが関係するテストを実装しています。
編集エラーテストの前にバリデーション未設定について解決を行いましたので、いよいよ編集エラー時のテストを実施していきます。
今回の目的
Propertyテーブルに関連する設定で、想定されるエラーに対しての動作が正常にできていることを確認する
なぜやるか
バリデーションなどエラーに対しての処理が正常に行えている担保をとるため
やりたいこと
- 想定されるエラーに対してのエラー表示がされていることを確認する
- リダイレクト処理が正常にできていることを確認する
やったこと
- 本人であることを確認した上で所有書籍情報を削除できるようにする
- 未登録レコードを削除するテストをする
- 他人の所有書籍が削除できないことをテストする
実施内容
所有書籍情報削除のコードを見直す
ユーザに関係なく削除できてしまうことを解決させる
前回記事にて他人の所有書籍が書き換えできてしまうといった内容がありましたが、削除についても同様に対処が必要と分かりました。
フォームの構造上は削除できないのですが、テストにより無理矢理post送信すると実行できてしまっているので、対策します。
# ~/app/Http/Controllers/PropertyController.php
public function destroy($id)
{
// 削除レコード取得
$delete_book = Property::find($id);
// 本人の場合のみ削除実施
if ($delete_book['user_id'] == Auth::user()->id){
// レコード削除
$delete_book->delete();
}
return redirect('/property');
}
if文を追加して、削除レコードとログインユーザーが同じであることを確認して削除としました。
この一文がいままではなかったので、フォームで受け付けられたidはすべて削除対象となっていました。
対策はこれで完了です、テストを順に作成していきます。
削除時のエラーテストを実装する
未登録idを削除する
未登録のレコードはそもそも削除できませんが、テストとして確認しておきます。
# ~/tests/Feature/PropertyTest.php
// 未登録id削除
public function test_propertyControll_ng_notIdDelete()
{
// property 自動生成 // 関連 user,bookdataも作成
factory(Property::class)->create();
// ユーザーログイン
$user = User::first(); // 作成済みユーザー情報取得
$this->actingAs($user); // 選択ユーザーでログイン
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 編集パス
$propertypath = 'property/2'; // 書籍編集パス(存在しないID)
//// 削除
$response = $this->from($propertypath)->post($propertypath, [
'_method' => 'DELETE',
]); // 削除実施
$response->assertStatus(302); // 302ステータスであること
}
propertyレコード及び関連の書籍情報、ユーザー情報を作成した上で、まだ作成していないレコードを強制的に指定して削除しています。エラーとなりますが、エラーが出力されていることを確認しています。
他人の所有書籍を削除する
最初に処理を追加した他人ユーザーの所有書籍削除をガードしたので、正しく動作することを確認します。
//他人の所有書籍を削除する
public function test_propertySomeControll_ng_otherUserDataDelete()
{
// 設定
$usernumber = 2;// ユーザー数
$booknumber = 10;// 所有書籍数
// ユーザー情報
factory(User::class, $usernumber)->create(); // 複数ユーザー作成
$user = User::find(1); // ユーザー情報取得
$this->actingAs($user); // 選択ユーザーでログイン
$this->assertTrue(Auth::check()); // Auth認証済であることを確認
// 所有書籍情報登録
// 複数ユーザー分の所有書籍情報
for ($usercount = 1; $usercount <= $usernumber; $usercount++) {
// 各ユーザーに対して複数書籍所持情報を作成
for ($i = 1; $i <= $booknumber; $i++) {
$propertydata = factory(Property::class)->create([
'user_id' => $usercount,
]);
}
}
//// 編集パス
$propertypath = 'property/11'; // 書籍編集パス
//// 登録
$deletepropertydata = [
'id' => 11,
'_method' => 'DELETE',
]; // タイトルを編集
$response = $this->from($propertypath)->post($propertypath, $deletepropertydata);
// 本情報削除
$response->assertStatus(302); // リダイレクト
$response->assertRedirect('property'); // index表示
// 登録されていることの確認(indexページ)
$response = $this->get('property'); // indexへアクセス
$response->assertStatus(200); // 200ステータスであること
$response->assertViewIs('property.index'); // indexビューであること
$savebook = Property::find(11);
$response->assertDontSeeText($savebook->bookdata->title);
// 登録タイトルが表示されていないこと
}
編集エラーテストでも利用したコードを利用して、削除テストに関しても複数ユーザーのデータをまずは準備しました。
2ユーザー作成し、ユーザー毎に10件の所有書籍を準備しました。
ユーザー1でログインし、ユーザー2の所有書籍であるpropertyレコード11を削除しています。
削除情報をpost送信しますが、先程のアクションでidがアンマッチする為、リダイレクトします。
リダイレクトは編集ページに遷移するはずですが、ログインユーザーが異なる為、表示はされず、propertyページに遷移します。
他人の所有書籍が表示されないことを確認する
そして、ログインユーザー自身の所有書籍が表示されるので、他人の所有書籍が表示されていないというパターンを最後に確認しています。
以上で削除時のエラーテストは完了です。