From a41ed7df66498c7e3c1016d9aac01818e1aca08a Mon Sep 17 00:00:00 2001 From: geekan Date: Mon, 25 Dec 2023 16:41:09 +0800 Subject: [PATCH] refine test code --- tests/metagpt/actions/test_action.py | 9 +++- tests/metagpt/actions/test_action_node.py | 50 ++++++++++++++++++- tests/metagpt/actions/test_action_output.py | 53 --------------------- 3 files changed, 56 insertions(+), 56 deletions(-) delete mode 100644 tests/metagpt/actions/test_action_output.py diff --git a/tests/metagpt/actions/test_action.py b/tests/metagpt/actions/test_action.py index 9775630cc..f750b5e6f 100644 --- a/tests/metagpt/actions/test_action.py +++ b/tests/metagpt/actions/test_action.py @@ -5,9 +5,16 @@ @Author : alexanderwu @File : test_action.py """ -from metagpt.actions import Action, WritePRD, WriteTest +from metagpt.actions import Action, ActionType, WritePRD, WriteTest def test_action_repr(): actions = [Action(), WriteTest(), WritePRD()] assert "WriteTest" in str(actions) + + +def test_action_type(): + assert ActionType.WRITE_PRD.value == WritePRD + assert ActionType.WRITE_TEST.value == WriteTest + assert ActionType.WRITE_PRD.name == "WRITE_PRD" + assert ActionType.WRITE_TEST.name == "WRITE_TEST" diff --git a/tests/metagpt/actions/test_action_node.py b/tests/metagpt/actions/test_action_node.py index 5bafe2bf2..92d8a1bbc 100644 --- a/tests/metagpt/actions/test_action_node.py +++ b/tests/metagpt/actions/test_action_node.py @@ -5,6 +5,8 @@ @Author : alexanderwu @File : test_action_node.py """ +from typing import List, Tuple + import pytest from metagpt.actions import Action @@ -29,7 +31,7 @@ async def test_debate_two_roles(): team = Team(investment=10.0, env=env, roles=[biden, trump]) history = await team.run(idea="Topic: climate change. Under 80 words per message.", send_to="Biden", n_round=3) - assert "BidenSay" in history + assert "Biden" in history @pytest.mark.asyncio @@ -39,7 +41,7 @@ async def test_debate_one_role_in_env(): env = Environment(desc="US election live broadcast") team = Team(investment=10.0, env=env, roles=[biden]) history = await team.run(idea="Topic: climate change. Under 80 words per message.", send_to="Biden", n_round=3) - assert "Debate" in history + assert "Biden" in history @pytest.mark.asyncio @@ -86,3 +88,47 @@ async def test_action_node_two_layer(): assert node_b in root.children.values() json_template = root.compile(context="123", schema="json", mode="auto") assert "i-a" in json_template + + +t_dict = { + "Required Python third-party packages": '"""\nflask==1.1.2\npygame==2.0.1\n"""\n', + "Required Other language third-party packages": '"""\nNo third-party packages required for other languages.\n"""\n', + "Full API spec": '"""\nopenapi: 3.0.0\ninfo:\n title: Web Snake Game API\n version: 1.0.0\npaths:\n /game:\n get:\n summary: Get the current game state\n responses:\n \'200\':\n description: A JSON object of the game state\n post:\n summary: Send a command to the game\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n command:\n type: string\n responses:\n \'200\':\n description: A JSON object of the updated game state\n"""\n', + "Logic Analysis": [ + ["app.py", "Main entry point for the Flask application. Handles HTTP requests and responses."], + ["game.py", "Contains the Game and Snake classes. Handles the game logic."], + ["static/js/script.js", "Handles user interactions and updates the game UI."], + ["static/css/styles.css", "Defines the styles for the game UI."], + ["templates/index.html", "The main page of the web application. Displays the game UI."], + ], + "Task list": ["game.py", "app.py", "static/css/styles.css", "static/js/script.js", "templates/index.html"], + "Shared Knowledge": "\"\"\"\n'game.py' contains the Game and Snake classes which are responsible for the game logic. The Game class uses an instance of the Snake class.\n\n'app.py' is the main entry point for the Flask application. It creates an instance of the Game class and handles HTTP requests and responses.\n\n'static/js/script.js' is responsible for handling user interactions and updating the game UI based on the game state returned by 'app.py'.\n\n'static/css/styles.css' defines the styles for the game UI.\n\n'templates/index.html' is the main page of the web application. It displays the game UI and loads 'static/js/script.js' and 'static/css/styles.css'.\n\"\"\"\n", + "Anything UNCLEAR": "We need clarification on how the high score should be stored. Should it persist across sessions (stored in a database or a file) or should it reset every time the game is restarted? Also, should the game speed increase as the snake grows, or should it remain constant throughout the game?", +} + +WRITE_TASKS_OUTPUT_MAPPING = { + "Required Python third-party packages": (str, ...), + "Required Other language third-party packages": (str, ...), + "Full API spec": (str, ...), + "Logic Analysis": (List[Tuple[str, str]], ...), + "Task list": (List[str], ...), + "Shared Knowledge": (str, ...), + "Anything UNCLEAR": (str, ...), +} + + +def test_create_model_class(): + test_class = ActionNode.create_model_class("test_class", WRITE_TASKS_OUTPUT_MAPPING) + assert test_class.__name__ == "test_class" + + +def test_create_model_class_with_mapping(): + t = ActionNode.create_model_class("test_class_1", WRITE_TASKS_OUTPUT_MAPPING) + t1 = t(**t_dict) + value = t1.dict()["Task list"] + assert value == ["game.py", "app.py", "static/css/styles.css", "static/js/script.js", "templates/index.html"] + + +if __name__ == "__main__": + test_create_model_class() + test_create_model_class_with_mapping() diff --git a/tests/metagpt/actions/test_action_output.py b/tests/metagpt/actions/test_action_output.py deleted file mode 100644 index f1765cb03..000000000 --- a/tests/metagpt/actions/test_action_output.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 -""" -@Time : 2023/7/11 10:49 -@Author : chengmaoyu -@File : test_action_output -""" -from typing import List, Tuple - -from metagpt.actions.action_node import ActionNode - -t_dict = { - "Required Python third-party packages": '"""\nflask==1.1.2\npygame==2.0.1\n"""\n', - "Required Other language third-party packages": '"""\nNo third-party packages required for other languages.\n"""\n', - "Full API spec": '"""\nopenapi: 3.0.0\ninfo:\n title: Web Snake Game API\n version: 1.0.0\npaths:\n /game:\n get:\n summary: Get the current game state\n responses:\n \'200\':\n description: A JSON object of the game state\n post:\n summary: Send a command to the game\n requestBody:\n required: true\n content:\n application/json:\n schema:\n type: object\n properties:\n command:\n type: string\n responses:\n \'200\':\n description: A JSON object of the updated game state\n"""\n', - "Logic Analysis": [ - ["app.py", "Main entry point for the Flask application. Handles HTTP requests and responses."], - ["game.py", "Contains the Game and Snake classes. Handles the game logic."], - ["static/js/script.js", "Handles user interactions and updates the game UI."], - ["static/css/styles.css", "Defines the styles for the game UI."], - ["templates/index.html", "The main page of the web application. Displays the game UI."], - ], - "Task list": ["game.py", "app.py", "static/css/styles.css", "static/js/script.js", "templates/index.html"], - "Shared Knowledge": "\"\"\"\n'game.py' contains the Game and Snake classes which are responsible for the game logic. The Game class uses an instance of the Snake class.\n\n'app.py' is the main entry point for the Flask application. It creates an instance of the Game class and handles HTTP requests and responses.\n\n'static/js/script.js' is responsible for handling user interactions and updating the game UI based on the game state returned by 'app.py'.\n\n'static/css/styles.css' defines the styles for the game UI.\n\n'templates/index.html' is the main page of the web application. It displays the game UI and loads 'static/js/script.js' and 'static/css/styles.css'.\n\"\"\"\n", - "Anything UNCLEAR": "We need clarification on how the high score should be stored. Should it persist across sessions (stored in a database or a file) or should it reset every time the game is restarted? Also, should the game speed increase as the snake grows, or should it remain constant throughout the game?", -} - -WRITE_TASKS_OUTPUT_MAPPING = { - "Required Python third-party packages": (str, ...), - "Required Other language third-party packages": (str, ...), - "Full API spec": (str, ...), - "Logic Analysis": (List[Tuple[str, str]], ...), - "Task list": (List[str], ...), - "Shared Knowledge": (str, ...), - "Anything UNCLEAR": (str, ...), -} - - -def test_create_model_class(): - test_class = ActionNode.create_model_class("test_class", WRITE_TASKS_OUTPUT_MAPPING) - assert test_class.__name__ == "test_class" - - -def test_create_model_class_with_mapping(): - t = ActionNode.create_model_class("test_class_1", WRITE_TASKS_OUTPUT_MAPPING) - t1 = t(**t_dict) - value = t1.dict()["Task list"] - assert value == ["game.py", "app.py", "static/css/styles.css", "static/js/script.js", "templates/index.html"] - - -if __name__ == "__main__": - test_create_model_class() - test_create_model_class_with_mapping()