# Copyright (c) 2014-present PlatformIO # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import os import time import pytest import requests from platformio.commands.account import cli as cmd_account from platformio.commands.package import cli as cmd_package from platformio.downloader import FileDownloader from platformio.unpacker import FileUnpacker @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_account( clirunner, validate_cliresult, receive_email, isolated_pio_home, tmpdir_factory ): username = "test-piocore-%s" % str(int(time.time() * 1000)) 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) # 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(int(time.time() * 1000)) lastname = "Last" + str(int(time.time() * 1000)) new_username = "username" + str(int(time.time() * 1000))[-5:] 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: result = clirunner.invoke(cmd_account, ["destroy"], "y") validate_cliresult(result)