diff --git a/test/end-to-end/pages/openbounty/activity.py b/test/end-to-end/pages/openbounty/activity.py new file mode 100644 index 0000000..bbee68f --- /dev/null +++ b/test/end-to-end/pages/openbounty/activity.py @@ -0,0 +1,28 @@ +from pages.base_page import BasePageObject +from pages.base_element import * +from tests import test_data +import logging + + +class ActivityDescription(BaseText): + + def __init__(self, driver, status, issue_title): + super(ActivityDescription, self).__init__(driver) + self.locator = self.Locator.xpath_selector( + '//div[@class="description"]/div[contains(.,"' + status + '")]/a[contains(.,"' + issue_title + '")]') + + +class ActivityPage(BasePageObject): + def __init__(self, driver): + super(ActivityPage, self).__init__(driver) + self.driver = driver + + + def get_activity_page(self): + self.driver.get(test_data.config['Common']['url'] + 'app#/activity') + + def check_activity_is_presented(self, status, issue_title): + logging.info('Check that activity "' + status + issue_title + '" is displayed') + ActivityDescription(self.driver, status, issue_title).find_element() + + diff --git a/test/end-to-end/pages/openbounty/bounties.py b/test/end-to-end/pages/openbounty/bounties.py index 24a47bc..bcde0a2 100644 --- a/test/end-to-end/pages/openbounty/bounties.py +++ b/test/end-to-end/pages/openbounty/bounties.py @@ -2,7 +2,6 @@ from pages.base_page import BasePageObject from pages.base_element import * from tests import test_data - class BountiesHeader(BaseText): def __init__(self, driver): @@ -36,6 +35,14 @@ class BountyFooters(BaseText): self.locator = self.Locator.css_selector('.open-bounty-item-content .footer-row') +class BountyClaimsAmount(BaseText): + + def __init__(self, driver, issue_title, claims_text): + super(BaseText, self).__init__(driver) + self.locator = self.Locator.xpath_selector( + '//div[@class="header"]/a[contains(.,"' + issue_title +'")]/../../div[@class="footer-row"]/span[contains(.,"' + claims_text + '")]') + + class BountiesPage(BasePageObject): def __init__(self, driver): super(BountiesPage, self).__init__(driver) @@ -51,3 +58,7 @@ class BountiesPage(BasePageObject): def get_bounties_page(self): self.driver.get(test_data.config['Common']['url'] + 'app') + def check_bounty_claims_amount(self, issue_title, claims_text): + logging.info('Check that bounty "' + issue_title + '" has "' + claims_text + '"') + BountyClaimsAmount(self.driver, issue_title, claims_text).find_element() + diff --git a/test/end-to-end/pages/thirdparty/github.py b/test/end-to-end/pages/thirdparty/github.py index 60333be..1261593 100644 --- a/test/end-to-end/pages/thirdparty/github.py +++ b/test/end-to-end/pages/thirdparty/github.py @@ -1,11 +1,8 @@ -import time, pytest +import time, pytest, git, os, shutil, logging from pages.base_element import * from pages.base_page import BasePageObject from tests import test_data -from git import Repo -import os -import shutil -import logging + class EmailEditbox(BaseEditBox): @@ -151,24 +148,41 @@ class ConfirmDeleteButton(BaseButton): super(ConfirmDeleteButton, self).__init__(driver) self.locator = self.Locator.xpath_selector("//button[text()[contains(.,'I understand the consequences, delete')]]") +class CompareAndPullRequest(BaseButton): + def __init__(self, driver): + super(CompareAndPullRequest, self).__init__(driver) + self.locator = self.Locator.css_selector(".RecentBranches a") + +class PrTitleEditBox(BaseEditBox): + def __init__(self, driver): + super(PrTitleEditBox, self).__init__(driver) + self.locator = self.Locator.id("pull_request_body") + +class SubmitNewPrButton(BaseButton): + def __init__(self, driver): + super(SubmitNewPrButton, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//button[contains(text(), " + "'Create pull request')]") + + class GithubPage(BasePageObject): def __init__(self, driver): super(GithubPage, self).__init__(driver) self.driver = driver + # sign in and installation related self.email_input = EmailEditbox(self.driver) self.password_input = PasswordEditbox(self.driver) self.sign_in_button = SignInButton(self.driver) - self.authorize_sob = AuthorizeStatusOpenBounty(self.driver) self.permission_type = PermissionTypeText(self.driver) - self.install_button = InstallButton(self.driver) self.organization_button = OrganizationButton(self.driver) self.all_repositories_button = AllRepositoriesButton(self.driver) self.integration_permissions_group = IntegrationPermissionsGroup(self.driver) + # issue related self.new_issue_button = NewIssueButton(self.driver) self.issue_title_input = IssueTitleEditBox(self.driver) self.labels_button = LabelsButton(self.driver) @@ -177,15 +191,23 @@ class GithubPage(BasePageObject): self.submit_new_issue_button = SubmitNewIssueButton(self.driver) self.contract_body = ContractBody(self.driver) self.issue_id = IssueId(self.driver) + + # repo forking self.fork_button = ForkButton(self.driver) self.header_in_fork_popup = HeaderInForkPopup(self.driver) self.user_account_in_fork_popup = UserAccountInForkPopup(self.driver) self.forked_repo_text = ForkedRepoText(self.driver) + # repo deleting self.delete_repo = DeleteRepo(self.driver) self.repo_name_confirm_delete = RepoNameBoxInPopup(self.driver) self.confirm_delete = ConfirmDeleteButton(self.driver) + # PR related + self.compare_and_pull_request = CompareAndPullRequest(self.driver) + self.pr_body = PrTitleEditBox(self.driver) + self.submit_new_pr_button = SubmitNewPrButton(self.driver) + def get_issues_page(self): self.driver.get(test_data.config['ORG']['gh_repo'] + 'issues') @@ -215,7 +237,7 @@ class GithubPage(BasePageObject): self.get_issues_page() self.new_issue_button.click() test_data.issue = dict() - test_data.issue['title'] = 'auto_test_bounty_%s' % self.time_now + test_data.issue['title'] = 'auto_test_bounty_%s' % test_data.date_time self.issue_title_input.send_keys(test_data.issue['title']) self.labels_button.click() self.bounty_label.click() @@ -245,24 +267,44 @@ class GithubPage(BasePageObject): pytest.fail('Contract is not deployed in %s minutes!' % str(wait/60)) #cloning via HTTPS - def clone_repo(self, initial_repo=None, username=None, repo_name=None, repo_path='git_repo'): - os.mkdir(repo_path) - os.chdir(repo_path) - test_data.local_repo_path = os.getcwd() + def clone_repo(self, initial_repo=None, username=None, repo_name=None, repo_folder='test_repo'): + os.mkdir(repo_folder) + os.chdir(repo_folder) + self.local_repo_path = os.getcwd() fork = 'https://github.com/%s/%s.git' % (username, repo_name) - logging.info(('Cloning from %s to %s' % (fork, repo_path))) - r = Repo.clone_from(fork, repo_path) - logging.info(('Successefully cloned to: %s' % test_data.local_repo_path)) + logging.info(('Cloning from %s to %s' % (fork, self.local_repo_path))) + repo = git.Repo.clone_from(fork, self.local_repo_path) + logging.info(('Successefully cloned to: %s' % self.local_repo_path)) logging.info('Set upstream to %s'% initial_repo) - upstream = r.create_remote('upstream', initial_repo) + upstream = repo.create_remote('upstream', initial_repo) upstream.fetch() assert upstream.exists() - r.heads.master.checkout() + repo.heads.master.checkout() + + + def create_pr_git(self, branch, file_to_modify = 'test'): + repo = git.Repo(self.local_repo_path) + logging.info(repo.git.status()) + logging.info(repo.git.pull('upstream', 'master')) + logging.info(repo.git.push('origin', 'master')) + logging.info(repo.git.fetch('--all')) + repo.git.checkout('-b',branch) + file = open(os.path.join(self.local_repo_path, file_to_modify), 'w') + file.write("Autotest change: %s \r \n" % test_data.date_time) + logging.info(repo.git.add('test')) + logging.info(repo.git.commit(m='Aut %s' % test_data.date_time)) + repo.git.push('origin', branch) + + def open_pr_github(self, keyword_comment): + self.get_url(test_data.config['DEV']['gh_forked_repo']) + self.compare_and_pull_request.click() + self.pr_body.send_keys(keyword_comment + ' #%s' % test_data.issue['id']) + self.submit_new_pr_button.click() def clean_repo_local_folder(self): - logging.info('Removing %s' % test_data.local_repo_path) - if test_data.local_repo_path: - shutil.rmtree(test_data.local_repo_path) + logging.info('Removing %s' % self.local_repo_path) + if self.local_repo_path: + shutil.rmtree(self.local_repo_path) def delete_fork(self): self.get_url(test_data.config['DEV']['gh_forked_repo'] + 'settings') @@ -271,6 +313,3 @@ class GithubPage(BasePageObject): self.confirm_delete.click() - - - diff --git a/test/end-to-end/tests/__init__.py b/test/end-to-end/tests/__init__.py index 5277395..9b9c49e 100644 --- a/test/end-to-end/tests/__init__.py +++ b/test/end-to-end/tests/__init__.py @@ -1,20 +1,24 @@ -import configparser -import os +import configparser, time, datetime, os class TestData(object): def __init__(self): + self.test_name = None self.config = configparser.ConfigParser() - # define here path to your config.ini file - # example - config_example.ini + # put config.ini to /test/end-to-end/tests folder (same directory where config_example.ini is placed + self.tests_path = os.path.abspath(os.path.dirname(__file__)) + self.config.read(os.path.join(self.tests_path, 'config.ini')) - self.config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'config.ini')) + #create unique identificator for PRs, issues ect + ts = time.time() + st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') + self.date_time = st # self.issue['title'] is set in GithubPage::create_new_bounty # self.issue['id'] is set in GithubPage::create_new_bounty - # self.local_repo_path is set in GithubPage::clone_repo + diff --git a/test/end-to-end/tests/basetestcase.py b/test/end-to-end/tests/basetestcase.py index dca667a..ac45091 100644 --- a/test/end-to-end/tests/basetestcase.py +++ b/test/end-to-end/tests/basetestcase.py @@ -1,4 +1,4 @@ -import pytest, sys +import pytest, sys, os from selenium import webdriver from selenium.common.exceptions import WebDriverException from tests.postconditions import remove_application, remove_installation @@ -52,8 +52,7 @@ class BaseTestCase: # Org Chrome options # cls.capabilities_org = webdriver.ChromeOptions() - # doesn't work on sauce env - # cls.capabilities_org.add_extension(path.abspath(test_data.config['Paths']['tests_absolute'] + 'resources/metamask3_12_0.crx')) + cls.capabilities_org.add_extension(os.path.join(test_data.tests_path, os.pardir, 'resources', 'metamask3_12_0.crx')) # # SauceLab capabilities @@ -116,9 +115,8 @@ class BaseTestCase: # Cloning repo to local git as Developer and set upstream to Organization (via HTTPS) cls.github_dev.clone_repo(test_data.config['ORG']['gh_repo'], - test_data.config['DEV']['gh_username'], - test_data.config['ORG']['gh_repo_name'], - 'git_repo') + test_data.config['DEV']['gh_username'], + test_data.config['ORG']['gh_repo_name']) cls.verify_no_errors(cls) diff --git a/test/end-to-end/tests/test_contracts.py b/test/end-to-end/tests/test_contracts.py index 17c66e2..ed81210 100644 --- a/test/end-to-end/tests/test_contracts.py +++ b/test/end-to-end/tests/test_contracts.py @@ -1,8 +1,9 @@ import pytest -from os import environ -from pages.openbounty.landing import LandingPage +# from os import environ +# from pages.openbounty.landing import LandingPage from pages.openbounty.bounties import BountiesPage -from pages.thirdparty.github import GithubPage +from pages.openbounty.activity import ActivityPage +# from pages.thirdparty.github import GithubPage from tests.basetestcase import BaseTestCase from tests import test_data @@ -10,18 +11,32 @@ from tests import test_data @pytest.mark.sanity class TestLogin(BaseTestCase): - def test_deploy_new_contract(self): + def test_deploy_new_contract(self): # Waiting for deployed contract; test_data.issue created here self.github_org.create_new_bounty() self.github_org.get_deployed_contract() # Navigate and check top bounty in "Open bounties" - bounties_page = BountiesPage(self.driver_org) + bounties_page = BountiesPage(self.driver_dev) bounties_page.get_bounties_page() titles = bounties_page.bounty_titles.find_elements() assert titles[0].text == test_data.issue['title'] + def test_new_claim(self): + self.github_dev.create_pr_git('test_branch_%s' % self.github_dev.time_now) + self.github_dev.open_pr_github('Fixes') + + # check new claim in "Open bounties" + bounties_page = BountiesPage(self.driver_dev) + bounties_page.get_bounties_page() + bounties_page.check_bounty_claims_amount(test_data.issue['title'], '1 open claim') + + # check new claim in "Activity" + activity_page = ActivityPage(self.driver_dev) + activity_page.get_activity_page() + activity_page.check_activity_is_presented('Submitted a claim for ', test_data.issue['title']) +