From 405dcda8247cdfbd66c9a93b78faa683693b7aa7 Mon Sep 17 00:00:00 2001 From: ShahRustam Date: Thu, 11 Jun 2020 16:02:38 +0300 Subject: [PATCH] Feature/update account tests (#3556) * update account tests * change second user * refactoring * clean * fix tests email receiving * fix --- tests/commands/test_account_org_team.py | 949 +++++++++++------------- tests/conftest.py | 4 +- 2 files changed, 441 insertions(+), 512 deletions(-) diff --git a/tests/commands/test_account_org_team.py b/tests/commands/test_account_org_team.py index a7711ee2..cc97b33f 100644 --- a/tests/commands/test_account_org_team.py +++ b/tests/commands/test_account_org_team.py @@ -26,16 +26,29 @@ from platformio.commands.team import cli as cmd_team from platformio.downloader import FileDownloader from platformio.unpacker import FileUnpacker -pytestmark = pytest.mark.skip() - - -@pytest.mark.skipif( - not os.environ.get("TEST_EMAIL_LOGIN"), +pytestmark = pytest.mark.skipif( + not (os.environ.get("TEST_EMAIL_LOGIN") and os.environ.get("TEST_EMAIL_PASSWORD")), reason="requires TEST_EMAIL_LOGIN, TEST_EMAIL_PASSWORD environ variables", -) # pylint:disable=too-many-arguments -def test_account( - clirunner, validate_cliresult, receive_email, isolated_pio_home, tmpdir_factory -): +) + +username = None +email = None +firstname = None +lastname = None +password = None + +orgname = None +display_name = None +second_username = None + +teamname = None +team_description = None + + +def test_prepare(): + global username, splited_email, email, firstname, lastname + global password, orgname, display_name, second_username, teamname, team_description + username = "test-piocore-%s" % str(random.randint(0, 100000)) splited_email = os.environ.get("TEST_EMAIL_LOGIN").split("@") email = "%s+%s@%s" % (splited_email[0], username, splited_email[1]) @@ -43,522 +56,436 @@ def test_account( lastname = "User" password = "Qwerty123!" - # pio account register - result = clirunner.invoke( - cmd_account, - [ - "register", - "-u", - username, - "-e", - email, - "-p", - password, - "--firstname", - firstname, - "--lastname", - lastname, - ], - ) - validate_cliresult(result) - - # email verification - result = receive_email(email) - link = ( - result.split("Click on the link below to start this process.")[1] - .split("This link will expire within 12 hours.")[0] - .strip() - ) - session = requests.Session() - result = session.get(link).text - link = result.split(' 0 - assert result.exception - assert "You are not authorized! Please log in to PIO Account" in str( - result.exception - ) - - os.environ["PLATFORMIO_AUTH_TOKEN"] = token - - result = clirunner.invoke( - cmd_account, ["token", "--password", password, "--json-output"], - ) - validate_cliresult(result) - json_result = json.loads(result.output.strip()) - assert json_result - assert json_result.get("status") == "success" - assert json_result.get("result") == token - - os.environ.pop("PLATFORMIO_AUTH_TOKEN") - - result = clirunner.invoke( - cmd_account, ["login", "-u", username, "-p", password], - ) - validate_cliresult(result) - - # pio account password - new_password = "Testpassword123" - result = clirunner.invoke( - cmd_account, - ["password", "--old-password", password, "--new-password", new_password,], - ) - validate_cliresult(result) - assert "Password successfully changed!" in result.output - - clirunner.invoke(cmd_account, ["logout"]) - - result = clirunner.invoke( - cmd_account, ["login", "-u", username, "-p", new_password], - ) - validate_cliresult(result) - - result = clirunner.invoke( - cmd_account, - ["password", "--old-password", new_password, "--new-password", password,], - ) - validate_cliresult(result) - - # pio account update - firstname = "First " + str(random.randint(0, 100000)) - lastname = "Last" + str(random.randint(0, 100000)) - - new_username = "username" + str(random.randint(0, 100000)) - new_email = "%s+new-%s@%s" % (splited_email[0], username, splited_email[1]) - result = clirunner.invoke( - cmd_account, - [ - "update", - "--current-password", - password, - "--firstname", - firstname, - "--lastname", - lastname, - "--username", - new_username, - "--email", - new_email, - ], - ) - validate_cliresult(result) - assert "Profile successfully updated!" in result.output - assert ( - "Please check your mail to verify your new email address and re-login. " - in result.output - ) - - result = receive_email(new_email) - link = ( - result.split("Click on the link below to start this process.")[1] - .split("This link will expire within 12 hours.")[0] - .strip() - ) - session = requests.Session() - result = session.get(link).text - link = result.split(' 0 - assert result.exception - assert "You are not authorized! Please log in to PIO Account" in str( - result.exception - ) - - result = clirunner.invoke( - cmd_account, ["login", "-u", new_username, "-p", password], - ) - validate_cliresult(result) - - # pio account destroy with linked resource - - package_url = "https://github.com/bblanchon/ArduinoJson/archive/v6.11.0.tar.gz" - - tmp_dir = tmpdir_factory.mktemp("package") - fd = FileDownloader(package_url, str(tmp_dir)) - pkg_dir = tmp_dir.mkdir("raw_package") - fd.start(with_progress=False, silent=True) - with FileUnpacker(fd.get_filepath()) as unpacker: - unpacker.unpack(str(pkg_dir), with_progress=False, silent=True) - - result = clirunner.invoke(cmd_package, ["publish", str(pkg_dir)],) - validate_cliresult(result) - try: - result = receive_email(new_email) - assert "Congrats" in result - assert "was published" in result - except: # pylint:disable=bare-except - pass - - result = clirunner.invoke(cmd_account, ["destroy"], "y") - assert result.exit_code != 0 - assert ( - "We can not destroy the %s account due to 1 linked resources from registry" - % username - ) - - result = clirunner.invoke(cmd_package, ["unpublish", "ArduinoJson"],) - validate_cliresult(result) - finally: - clirunner.invoke(cmd_account, ["destroy"], "y") - - -@pytest.mark.skipif( - not os.environ.get("TEST_EMAIL_LOGIN"), - reason="requires TEST_EMAIL_LOGIN, TEST_EMAIL_PASSWORD environ variables", -) # pylint:disable=too-many-arguments -def test_org(clirunner, validate_cliresult, receive_email, isolated_pio_home): - username = "test-piocore-%s" % str(random.randint(0, 100000)) - splited_email = os.environ.get("TEST_EMAIL_LOGIN").split("@") - email = "%s+%s@%s" % (splited_email[0], username, splited_email[1]) - firstname = "Test" - lastname = "User" - password = "Qwerty123!" - - # pio account register - result = clirunner.invoke( - cmd_account, - [ - "register", - "-u", - username, - "-e", - email, - "-p", - password, - "--firstname", - firstname, - "--lastname", - lastname, - ], - ) - validate_cliresult(result) - - # email verification - result = receive_email(email) - link = ( - result.split("Click on the link below to start this process.")[1] - .split("This link will expire within 12 hours.")[0] - .strip() - ) - session = requests.Session() - result = session.get(link).text - link = result.split(' 0 + assert result.exception + assert "You are not authorized! Please log in to PIO Account" in str( + result.exception + ) + + os.environ["PLATFORMIO_AUTH_TOKEN"] = token + + result = clirunner.invoke( + cmd_account, ["token", "--password", password, "--json-output"], + ) + validate_cliresult(result) + json_result = json.loads(result.output.strip()) + assert json_result + assert json_result.get("status") == "success" + assert json_result.get("result") == token + + os.environ.pop("PLATFORMIO_AUTH_TOKEN") + + result = clirunner.invoke(cmd_account, ["login", "-u", username, "-p", password],) + validate_cliresult(result) + + +def test_account_change_password(clirunner, validate_cliresult, isolated_pio_home): + new_password = "Testpassword123" + result = clirunner.invoke( + cmd_account, + ["password", "--old-password", password, "--new-password", new_password,], + ) + validate_cliresult(result) + assert "Password successfully changed!" in result.output + + clirunner.invoke(cmd_account, ["logout"]) + + result = clirunner.invoke( + cmd_account, ["login", "-u", username, "-p", new_password], + ) + validate_cliresult(result) + + result = clirunner.invoke( + cmd_account, + ["password", "--old-password", new_password, "--new-password", password,], + ) + validate_cliresult(result) + + +def test_account_update( + clirunner, validate_cliresult, receive_email, isolated_pio_home +): + global username + global email + global firstname + global lastname + + firstname = "First " + str(random.randint(0, 100000)) + lastname = "Last" + str(random.randint(0, 100000)) + + username = "username" + str(random.randint(0, 100000)) + email = "%s+new-%s@%s" % (splited_email[0], username, splited_email[1]) + result = clirunner.invoke( + cmd_account, + [ + "update", + "--current-password", + password, + "--firstname", + firstname, + "--lastname", + lastname, + "--username", + username, + "--email", + email, + ], + ) + validate_cliresult(result) + assert "Profile successfully updated!" in result.output + assert ( + "Please check your mail to verify your new email address and re-login. " + in result.output + ) + + result = receive_email(email) + link = ( + result.split("Click on the link below to start this process.")[1] + .split("This link will expire within 12 hours.")[0] + .strip() + ) + session = requests.Session() + result = session.get(link).text + link = result.split(' 0 + assert result.exception + assert "You are not authorized! Please log in to PIO Account" in str( + result.exception + ) + + result = clirunner.invoke(cmd_account, ["login", "-u", username, "-p", password],) + validate_cliresult(result) + + +def test_account_destroy_with_linked_resources( + clirunner, validate_cliresult, receive_email, isolated_pio_home, tmpdir_factory +): + package_url = "https://github.com/bblanchon/ArduinoJson/archive/v6.11.0.tar.gz" + + tmp_dir = tmpdir_factory.mktemp("package") + fd = FileDownloader(package_url, str(tmp_dir)) + pkg_dir = tmp_dir.mkdir("raw_package") + fd.start(with_progress=False, silent=True) + with FileUnpacker(fd.get_filepath()) as unpacker: + unpacker.unpack(str(pkg_dir), with_progress=False, silent=True) + + result = clirunner.invoke(cmd_package, ["publish", str(pkg_dir)],) + validate_cliresult(result) try: - # pio team create - result = clirunner.invoke( - cmd_team, - [ - "create", - "%s:%s" % (orgname, teamname), - "--description", - team_description, + result = receive_email(email) + assert "Congrats" in result + assert "was published" in result + except: # pylint:disable=bare-except + pass + + result = clirunner.invoke(cmd_account, ["destroy"], "y") + assert result.exit_code != 0 + assert ( + "We can not destroy the %s account due to 1 linked resources from registry" + % username + ) + + result = clirunner.invoke(cmd_package, ["unpublish", "ArduinoJson"],) + validate_cliresult(result) + + +def test_org_create(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke( + cmd_org, ["create", "--email", email, "--displayname", display_name, orgname], + ) + validate_cliresult(result) + + +def test_org_list(clirunner, validate_cliresult, isolated_pio_home): + # pio org list + result = clirunner.invoke(cmd_org, ["list", "--json-output"]) + validate_cliresult(result) + json_result = json.loads(result.output.strip()) + assert json_result == [ + { + "orgname": orgname, + "displayname": display_name, + "email": email, + "owners": [ + {"username": username, "firstname": firstname, "lastname": lastname} ], - ) - validate_cliresult(result) + } + ] - # pio team list - result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) - validate_cliresult(result) - json_result = json.loads(result.output.strip()) - for item in json_result: - del item["id"] - assert json_result == [ - {"name": teamname, "description": team_description, "members": []} - ] - # pio team add (member) - result = clirunner.invoke( - cmd_team, ["add", "%s:%s" % (orgname, teamname), second_username], - ) - validate_cliresult(result) +def test_org_add_owner(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke(cmd_org, ["add", orgname, second_username]) + validate_cliresult(result) - result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) - validate_cliresult(result) - assert second_username in result.output + result = clirunner.invoke(cmd_org, ["list", "--json-output"]) + validate_cliresult(result) + assert second_username in result.output - # pio team remove (member) - result = clirunner.invoke( - cmd_team, ["remove", "%s:%s" % (orgname, teamname), second_username], - ) - validate_cliresult(result) - result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) - validate_cliresult(result) - assert second_username not in result.output +def test_org_remove_owner(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke(cmd_org, ["remove", orgname, second_username]) + validate_cliresult(result) - # pio team update - new_teamname = "new-" + str(random.randint(0, 100000)) - newteam_description = "Updated Description" - result = clirunner.invoke( - cmd_team, - [ - "update", - "%s:%s" % (orgname, teamname), - "--name", - new_teamname, - "--description", - newteam_description, + result = clirunner.invoke(cmd_org, ["list", "--json-output"]) + validate_cliresult(result) + assert second_username not in result.output + + +def test_org_update(clirunner, validate_cliresult, isolated_pio_home): + new_orgname = "neworg-piocore-%s" % str(random.randint(0, 100000)) + new_display_name = "Test Org for PIO Core" + + result = clirunner.invoke( + cmd_org, + [ + "update", + orgname, + "--new-orgname", + new_orgname, + "--displayname", + new_display_name, + ], + ) + validate_cliresult(result) + + result = clirunner.invoke(cmd_org, ["list", "--json-output"]) + validate_cliresult(result) + json_result = json.loads(result.output.strip()) + assert json_result == [ + { + "orgname": new_orgname, + "displayname": new_display_name, + "email": email, + "owners": [ + {"username": username, "firstname": firstname, "lastname": lastname} ], - ) - validate_cliresult(result) + } + ] - result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) - validate_cliresult(result) - json_result = json.loads(result.output.strip()) - for item in json_result: - del item["id"] - assert json_result == [ - {"name": new_teamname, "description": newteam_description, "members": []} - ] + result = clirunner.invoke( + cmd_org, + [ + "update", + new_orgname, + "--new-orgname", + orgname, + "--displayname", + display_name, + ], + ) + validate_cliresult(result) - result = clirunner.invoke( - cmd_team, - [ - "update", - "%s:%s" % (orgname, new_teamname), - "--name", - teamname, - "--description", - team_description, - ], - ) - validate_cliresult(result) - finally: - clirunner.invoke(cmd_team, ["destroy", "%s:%s" % (orgname, teamname)], "y") - clirunner.invoke(cmd_org, ["destroy", orgname], "y") - clirunner.invoke(cmd_account, ["destroy"], "y") + +def test_team_create(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke( + cmd_team, + ["create", "%s:%s" % (orgname, teamname), "--description", team_description,], + ) + validate_cliresult(result) + + +def test_team_list(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) + validate_cliresult(result) + json_result = json.loads(result.output.strip()) + for item in json_result: + del item["id"] + assert json_result == [ + {"name": teamname, "description": team_description, "members": []} + ] + + +def test_team_add_member(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke( + cmd_team, ["add", "%s:%s" % (orgname, teamname), second_username], + ) + validate_cliresult(result) + + result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) + validate_cliresult(result) + assert second_username in result.output + + +def test_team_remove(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke( + cmd_team, ["remove", "%s:%s" % (orgname, teamname), second_username], + ) + validate_cliresult(result) + + result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) + validate_cliresult(result) + assert second_username not in result.output + + +def test_team_update(clirunner, validate_cliresult, receive_email, isolated_pio_home): + new_teamname = "new-" + str(random.randint(0, 100000)) + newteam_description = "Updated Description" + result = clirunner.invoke( + cmd_team, + [ + "update", + "%s:%s" % (orgname, teamname), + "--name", + new_teamname, + "--description", + newteam_description, + ], + ) + validate_cliresult(result) + + result = clirunner.invoke(cmd_team, ["list", "%s" % orgname, "--json-output"],) + validate_cliresult(result) + json_result = json.loads(result.output.strip()) + for item in json_result: + del item["id"] + assert json_result == [ + {"name": new_teamname, "description": newteam_description, "members": []} + ] + + result = clirunner.invoke( + cmd_team, + [ + "update", + "%s:%s" % (orgname, new_teamname), + "--name", + teamname, + "--description", + team_description, + ], + ) + validate_cliresult(result) + + +def test_cleanup(clirunner, validate_cliresult, receive_email, isolated_pio_home): + result = clirunner.invoke(cmd_team, ["destroy", "%s:%s" % (orgname, teamname)], "y") + validate_cliresult(result) + result = clirunner.invoke(cmd_org, ["destroy", orgname], "y") + validate_cliresult(result) + result = clirunner.invoke(cmd_account, ["destroy"], "y") + validate_cliresult(result) diff --git a/tests/conftest.py b/tests/conftest.py index 9fa3578b..eda52184 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -79,7 +79,9 @@ def receive_email(): # pylint:disable=redefined-outer-name, too-many-locals server.select("INBOX") _, mails = server.search(None, "ALL") for index in mails[0].split(): - _, data = server.fetch(index, "(RFC822)") + status, data = server.fetch(index, "(RFC822)") + if status != "OK" or not data or not isinstance(data[0], tuple): + continue msg = email.message_from_string( data[0][1].decode("ASCII", errors="surrogateescape") )