Fippiyのプログラム学習内容アウトプットBlog

日々の学習内容をアウトプットして振り返りを実施する。

Laravel開発、複数削除処理に対応する【4】複数削除エラー時テストを作成する

複数データ削除テストの正常処理完了時については作成できましたので、続いてエラー時のテストを行っていきます。

今回の目的

複数削除仕様についてテストを作成し、問題なく処理できることを確認する

なぜやるか

テスト処理によって問題なく動作することを担保するため

やりたいこと

未選択状態で削除実施時にエラーとなっていること

上限超過データは削除されないこと

所有者のいる書籍は削除しようとしても失敗すること

やったこと

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を指定していないので、新規にユーザーも作成されています。

そして、この情報を削除しようとすると、他人のデータの為消せないのでエラーとなっていることを確認しています。

 

以上で複数削除時のエラーテストは完了です。

書籍情報をまとめて削除する機能については以上で完了です。