今回は本編で苦戦した fixtrue を使ってのレコード追加方法を記していく。
したい事
E2E側からの操作でECCUBEのDBにレコードを追加したい。
今回は、dtb_calendarにレコードを追加をする。
【ECCUBE】【playwrite】店舗設定:個別設定のE2Eテストコード全体構成
実行手順
- EntityManagerを使い、dtb_calendarにレコードを追加
- ルート名の設定 + レコード作成結果を返す
- E2E側でECCUBE側に対してのHTTPリクエスト処理を作成
- テストコードを作成
1. EntityManagerを使い、dtb_calendarにレコードを追加
《場所》
tests/Eccube/Tests/Fixture/Api/Controller/FixtureController.php
/**
* Calendar オプジェクトを生成して返す.
* @return Calendar
*/
public function createCalendar()
{
// 新規カレンダーオブジェクトを作成
$Calendar = new Calendar();
// カレンダーを登録したい店舗を変数に格納
$tenant_a = 2;
$tenant = $this->entityManager->getRepository(BaseInfo::class)->find($tenant_a);
// レコードに値を設定し保存
$title = '年中無休で営業しております';
$Calendar
->setBaseInfo($tenant)
->setTitle($title)
->setHoliday(new \DateTime())
->setCreateDate(new \DateTime())
->setUpdateDate(new \DateTime());
$this->entityManager->persist($Calendar);
$this->entityManager->flush();
// 登録結果を返す
return $Calendar;
}
《疑問》
疑問:店舗情報を取得しているのはなぜか?
結論:レコード追加先の店舗を設定するため。
疑問:setBaseInfo()をEntity/Calendar.phpで探してもなかった。ではどこか?
結論:TenantTrait.phpに関数が存在する。
src/Eccube/Entity/Calendar.php
class Calendar extends AbstractEntity
{
use Traits\TenantTrait;
.....
}
src/Eccube/Entity/Traits/TenantTrait.php
/**
* テナント情報を設定する
*
* @param BaseInfo $baseInfo
* @return $this
*/
public function setBaseInfo(BaseInfo $baseInfo)
{
$this->baseInfo = $baseInfo;
return $this;
}
2. ルート名の設定 + レコード作成結果を返す
《場所》
tests/Eccube/Tests/Fixture/Generator.php
/**
* 定休日カレンダーの作成
*/
// ルート名は任意
#[Route(
'/calendar/generate_calendar',
name: 'generate_calendar',
methods: ['POST'],
)]
public function generateCalendarWithClass(Request $request, bool $baseOrderOnly = true): Response
{
// レコード作成
$Calendar = $this->generator->createCalendar();
// createCalendar()の実行結果をJSON形式で返す
return new Response(
$Calendar->toJSON(),
Response::HTTP_CREATED,
['Content-Type' => 'application/json']
);
}
#[Route]:アクセス名・期待したいるメゾット (GET? POST?)
3. postmanでカレンダーレコード作成関数の実行確認
(1)http://localhost:8080/fixture/get_mall_role にアクセスしAPIクッキーを作成
(2)http://localhost:8080/fixture/calendar/generate_calendar にアクセスしテストを実行
【ECCUBE】【POSTMAN】PostManを使いリクエストを実行
4. E2E側でECCUBE側に対してHTTPリクエストする処理を作成
《場所》
e2e-tests/fixtures/admin/tenant/individual_settings.fixture.ts
/**
* 定休日カレンダーのレコード作成
*/
// Promise<typeファイル->type名>
export const createCalendar = async (): Promise<Calendar> => {
// 新規HTTPリクエストする
const context = await request.newContext();
// GETでURLにアクセスー>リスポンスを返却
// APIクッキーの作成
await context.get(`/fixture/get_mall_role`);
// ECCUBE側(FixtureController.php)の指定ルートにPOST依頼をかけている
// 処理結果を変数に格納
const CalendarResponse = await context.post('/fixture/calendar/generate_calendar');
// 結果をJSONに変換
return await CalendarResponse.json();
}
5. テストコードを作成
《場所》
e2e-tests/spec/admin/tenant/individual_settings.spec.ts
test('定休日カレンダー設定_複数行_ページ遷移確認',
{tag: ["@tenant_owner_a"]},
async ({loginPage,page}) => {
// レコード
const ShopIndividualSettingsPage = new AdminShopIndividualSettingsPage(page);
......
// 10行のカレンダー作成
await ShopIndividualSettingsPage.createCalendar(10);
}
);
《場所》
e2e-tests/pages/admin/tenant/individual_settings.page.ts
export class AdminShopIndividualSettingsPage {
// 定休日レコード作成
async createCalendar(
record: number,
) {
for (let i = 0; i < record; i++) {
await createCalendar();
}
}
}
E2Eテストの実行
リスポンス情報と共に”1 passed (5.0s)”が返却されたため成功!!(^▽^)/

【EC-CUBE】【Playlight】E2Eテストを実行