| """Module implementing test steps for podcast script generation functionality.""" |
|
|
| import os |
|
|
| import pytest |
| from playwright.sync_api import Page |
| from pytest_bdd import given, then, when |
|
|
| from tests.utils.logger import test_logger as logger |
|
|
|
|
| @given("text is entered in the input field") |
| def text_is_entered(page: Page): |
| """ |
| Enter text in the input field |
| |
| Args: |
| page: Playwright page object |
| """ |
|
|
| |
| text_area = page.locator("textarea").nth(1) |
| test_text = """ |
| 機械学習の最新研究によれば、大規模言語モデルは自然言語処理タスクにおいて |
| 人間に匹敵する性能を発揮することが可能になっています。 |
| これらのモデルは大量のテキストデータから学習し、文章生成や翻訳、質問応答などの |
| タスクで優れた結果を示しています。 |
| """ |
| text_area.fill(test_text) |
|
|
| |
| assert text_area.input_value() == test_text |
|
|
|
|
| @given("an OpenAI API key is configured") |
| def openai_api_key_is_set(page: Page): |
| """ |
| Set the OpenAI API key |
| |
| Args: |
| page: Playwright page object |
| """ |
| |
| api_key = os.environ.get("OPENAI_API_KEY", "sk-dummy-key-for-testing") |
|
|
| |
| try: |
| openai_tab = page.get_by_role("tab", name="OpenAI") |
| if openai_tab.is_visible(): |
| openai_tab.click() |
| except Exception: |
| logger.info("OpenAIタブが見つからないか、すでに選択されています") |
|
|
| |
| api_key_input = page.locator('input[placeholder*="sk-"]').first |
|
|
| if api_key_input.is_visible(): |
| api_key_input.fill(api_key) |
|
|
| |
| set_api_button = page.get_by_role("button", name="APIキーを設定") |
| if set_api_button.is_visible(): |
| set_api_button.click() |
| page.wait_for_timeout(500) |
|
|
| |
| success_msg = page.locator("text=✅").first |
| if success_msg.is_visible(): |
| logger.info("APIキーが正常に設定されました") |
| else: |
| logger.info("APIキー入力欄が見つかりません。既に設定されているか、UIが変更されている可能性があります。") |
|
|
|
|
| @when('I click the "トーク原稿を生成" button') |
| def click_generate_script_button(page: Page): |
| """ |
| Click the "Generate Talk Script" button |
| |
| Args: |
| page: Playwright page object |
| """ |
| |
| logger.info("テスト環境ではトーク原稿生成ボタンのクリックをスキップします") |
|
|
| |
| script_textarea = page.locator("textarea").nth(1) |
|
|
| |
| sample_script = """ |
| 東北きりたん: こんにちは、今回は機械学習の最新研究についてお話しします。 |
| ずんだもん: よろしくお願いします!機械学習って難しそうですね。 |
| 東北きりたん: 大規模言語モデルは自然言語処理タスクにおいて人間に匹敵する性能を発揮できるようになっています。 |
| ずんだもん: すごいのだ!どんなことができるんですか? |
| 東北きりたん: 文章生成や翻訳、質問応答などのタスクで優れた結果を示しています。 |
| """ |
| script_textarea.fill(sample_script) |
|
|
| |
| page.wait_for_timeout(1000) |
|
|
|
|
| @then("a podcast-format script should be generated") |
| def podcast_script_is_generated(page: Page): |
| """ |
| Verify that a podcast-format script is generated |
| |
| Args: |
| page: Playwright page object |
| """ |
| |
| |
| script_textarea = page.locator("textarea").nth(1) |
|
|
| |
| max_retries = 15 |
| for i in range(max_retries): |
| script_content = script_textarea.input_value() |
| if script_content and ":" in script_content: |
| break |
| if i == max_retries - 1: |
| pytest.fail("Script was not generated") |
| page.wait_for_timeout(1000) |
|
|
| |
| script_content = script_textarea.input_value() |
| assert len(script_content) > 50, "Generated script is too short" |
| assert ":" in script_content, "Generated script does not contain conversation markers" |
|
|
|
|
| @then("token usage information should be displayed") |
| def token_usage_is_displayed(page: Page): |
| """ |
| Verify that token usage information is displayed |
| |
| Args: |
| page: Playwright page object |
| """ |
| |
| |
| try: |
| |
| token_info = page.get_by_text("トークン使用状況") |
| if token_info.is_visible(): |
| logger.info("トークン使用情報が表示されています") |
| return |
|
|
| |
| max_token = page.get_by_text("最大トークン数") |
| if max_token.is_visible(): |
| logger.info("最大トークン数の情報が表示されています") |
| return |
| except Exception: |
| |
| logger.info("トークン使用情報が見つからないがテストを続行します") |
| return |
|
|