【ECCUBE】【Playwrite】fixtrueを使ってDBにレコードを追加する方法

今回は本編で苦戦した fixtrue を使ってのレコード追加方法を記していく。

したい事

E2E側からの操作でECCUBEのDBにレコードを追加したい。
今回は、dtb_calendarにレコードを追加をする。

【ECCUBE】【playwrite】店舗設定:個別設定のE2Eテストコード全体構成

実行手順

  1. EntityManagerを使い、dtb_calendarにレコードを追加
  2. ルート名の設定 + レコード作成結果を返す
  3. E2E側でECCUBE側に対してのHTTPリクエスト処理を作成
  4. テストコードを作成

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テストを実行

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール