123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- import pytest
- from .supports import login
- from app import models
- from lxml import html
- from random import choice
- #
- # GET simple routes
- #
- def test_favicon(client):
- r = client.get('/favicon.ico')
- assert r.status_code == 200, f'status code: {r.status_code}'
- def test_home(client, test_user):
- # unauthorized access
- r = client.get('/')
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
-
- # authorized access
- login(client, test_user)
- r = client.get('/')
- # assert home page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'home' in title.lower(), f"Title: {title}. Should contain 'Home'"
- # assert links exist for every baangt element
- items = [link.text.lower() for link in page.xpath('//div[@id="item-list"]/a')]
- assert 'testruns' in items, "Item 'Testruns' is not in item list"
- assert 'test case sequences' in items, "Item 'Test Case Sequences' is not in list"
- assert 'test cases' in items, "Item 'Test Cases' is not in item list"
- assert 'test step sequences' in items, "Item 'Test Step Sequences' is not in item list"
- assert 'test steps' in items, "Item 'Test Steps' is not in item list"
- # assert item links are valid
- for link in page.xpath('//div[@id="item-list"]/a'):
- r = client.get(link.attrib['href'])
- assert r.status_code == 200, f'Accessing {link.attrib["href"]}. Status code: {r.status_code}'
- #
- # GET pages with baangt item lists
- #
- @pytest.mark.parametrize('count', [(1,2), (5,1)])
- def test_testruns(client, test_user, populate):
- url = '/testrun'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
-
- # authorized access
- login(client, test_user)
- r = client.get(url)
- # assert testrun page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'testruns' in title.lower(), f"Title: {title}. Should contain 'Testruns'"
- # common buttons
- assert bool(page.xpath('//a[@id="create-testrun"]')), "Button 'Create Testrun' does not exist"
- assert bool(page.xpath('//button[@id="import-testrun"]')), "Button 'Import Testrun' does not exist"
- # search field
- assert bool(page.xpath('//input[@id="filter"]')), "Search field does not exist"
- # testrun details
- # count
- divs = page.xpath(f'//div[contains(@class, "testrun-item")]')
- items = models.Testrun.query.all()
- assert len(divs) == len(items)
- # get random item
- item = choice(items)
- div = list(filter(lambda d: d.attrib.get('id') == f'item{item.uuid}', divs))
- assert bool(div), 'Page does not contain the item'
- div = div[0]
- assert bool(div.xpath('.//*[contains(@class, "btn-edit")]')), "utton 'Edit' absents"
- assert bool(div.xpath('.//*[contains(@class, "btn-update")]')), "Button 'Update' absents"
- assert bool(div.xpath('.//*[contains(@class, "btn-export")]')), "Button 'Export' absents"
- assert bool(div.xpath('.//*[contains(@class, "btn-run")]')), "Button 'Run' absents"
- assert bool(div.xpath('.//*[contains(@class, "btn-delete")]')), "Button 'Delete' absents"
- @pytest.mark.parametrize('count', [(1,1), (1,5)])
- def test_testcase_sequence(client, test_user, populate):
- url = '/testcase_sequence'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
-
- # authorized access
- login(client, test_user)
- r = client.get(url)
- # assert testcase_sequence page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'test case sequences' in title.lower(), f"Title: {title}. Should contain 'Test Case Sequences'"
- # common buttons
- assert bool(page.xpath('//a[@id="create-testcase_sequence"]')), "Button 'Create Test Case Sequence' does not exist"
- assert not bool(page.xpath('//button[@id="import-testrun"]')), "Button 'Import' should be hide"
- # search field
- assert bool(page.xpath('//input[@id="filter"]')), "Search field does not exist"
- # test case sequence details
- # count
- divs = page.xpath(f'//div[contains(@class, "testrun-item")]')
- items = models.TestCaseSequence.query.all()
- assert len(divs) == len(items)
- # get random item
- item = choice(items)
- div = list(filter(lambda d: d.attrib.get('id') == f'item{item.uuid}', divs))
- assert bool(div), 'Page does not contain the item'
- div = div[0]
- assert bool(div.xpath('.//*[contains(@class, "btn-edit")]')), "Button 'Edit' absents"
- assert not bool(div.xpath('.//*[contains(@class, "btn-update")]')), "Button 'Update' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-export")]')), "Button 'Export' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-run")]')), "Button 'Run' should be hide"
- assert bool(div.xpath('.//*[contains(@class, "btn-delete")]')), "Button 'Delete' absents"
- # datafile buttons
- assert bool(div.xpath('.//*[contains(@class, "btn-datafile-update")]')), "Datafile button 'Update' absents"
- assert bool(div.xpath('.//*[contains(@class, "btn-datafile-download")]')), "Datafile button 'Download' absents"
- @pytest.mark.parametrize('count', [(1,1), (1,5)])
- def test_testcase(client, test_user, populate):
- url = '/testcase'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
-
- # authorized access
- login(client, test_user)
- r = client.get(url)
- # assert testcase_sequence page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'test case' in title.lower(), f"Title: {title}. Should contain 'Test Cases'"
- # common buttons
- assert bool(page.xpath('//a[@id="create-testcase"]')), "Button 'Create Test Case' does not exist"
- assert not bool(page.xpath('//button[@id="import-testrun"]')), "Button 'Import' should be hide"
- # search field
- assert bool(page.xpath('//input[@id="filter"]')), "Search field does not exist"
- # test case details
- # count
- divs = page.xpath(f'//div[contains(@class, "testrun-item")]')
- items = models.TestCase.query.all()
- assert len(divs) == len(items)
- # get random item
- item = choice(items)
- div = list(filter(lambda d: d.attrib.get('id') == f'item{item.uuid}', divs))
- assert bool(div), 'Page does not contain the item'
- div = div[0]
- assert bool(div.xpath('.//*[contains(@class, "btn-edit")]')), "Button 'Edit' absents"
- assert not bool(div.xpath('.//*[contains(@class, "btn-update")]')), "Button 'Update' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-export")]')), "Button 'Export' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-run")]')), "Button 'Run' should be hide"
- assert bool(div.xpath('.//*[contains(@class, "btn-delete")]')), "Button 'Delete' absents"
- @pytest.mark.parametrize('count', [(1,1), (2,5)])
- def test_teststep_sequence(client, test_user, populate):
- url = '/teststep_sequence'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
-
- # authorized access
- login(client, test_user)
- r = client.get(url)
- # assert testcase_sequence page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'test step sequences' in title.lower(), f"Title: {title}. Should contain 'Test Step Sequences'"
- # common buttons
- assert bool(page.xpath('//a[@id="create-teststep_sequence"]')), "Button 'Create Test Step Sequence' does not exist"
- assert not bool(page.xpath('//button[@id="import-testrun"]')), "Button 'Import' should be hide"
- # search field
- assert bool(page.xpath('//input[@id="filter"]')), "Search field does not exist"
- # test step sequence details
- # count
- divs = page.xpath(f'//div[contains(@class, "testrun-item")]')
- items = models.TestStepSequence.query.all()
- assert len(divs) == len(items)
- # get random item
- item = choice(items)
- div = list(filter(lambda d: d.attrib.get('id') == f'item{item.uuid}', divs))
- assert bool(div), 'Page does not contain the item'
- div = div[0]
- assert bool(div.xpath('.//*[contains(@class, "btn-edit")]')), "Button 'Edit' absents"
- assert not bool(div.xpath('.//*[contains(@class, "btn-update")]')), "Button 'Update' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-export")]')), "Button 'Export' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-run")]')), "Button 'Run' should be hide"
- assert bool(div.xpath('.//*[contains(@class, "btn-delete")]')), "Button 'Delete' absents"
- @pytest.mark.parametrize('count', [(1,1), (2,5)])
- def test_teststep(client, test_user, populate):
- url = '/teststep'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
- # authorized access
- login(client, test_user)
- r = client.get(url)
- # assert testcase_sequence page rendered
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- page = html.fromstring(r.data)
- title = page.xpath('./head/title')[0].text.strip()
- assert 'test steps' in title.lower(), f"Title: {title}. Should contain 'Test Steps'"
- # common buttons
- assert bool(page.xpath('//a[@id="create-teststep"]')), "Button 'Create Test Step' does not exist"
- assert not bool(page.xpath('//button[@id="import-testrun"]')), "Button 'Import' should be hide"
- # search field
- assert bool(page.xpath('//input[@id="filter"]')), "Search field does not exist"
- # test step details
- divs = page.xpath(f'//div[contains(@class, "testrun-item")]')
- items = models.TestStepExecution.query.all()
- assert len(divs) == len(items)
- # get random item
- item = choice(items)
- div = list(filter(lambda d: d.attrib.get('id') == f'item{item.uuid}', divs))
- assert bool(div), 'Page does not contain the item'
- div = div[0]
- assert bool(div.xpath('.//*[contains(@class, "btn-edit")]')), "Button 'Edit' absents"
- assert not bool(div.xpath('.//*[contains(@class, "btn-update")]')), "Button 'Update' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-export")]')), "Button 'Export' should be hide"
- assert not bool(div.xpath('.//*[contains(@class, "btn-run")]')), "Button 'Run' should be hide"
- assert bool(div.xpath('.//*[contains(@class, "btn-delete")]')), "Button 'Delete' absents"
- def test_fake_item(client, test_user):
- url = '/fakeitem'
- # unauthorized access
- r = client.get(url)
- assert r.status_code == 302, f'Unauthorized access. Status code: {r.status_code}'
- # assert redirection url
- page = html.fromstring(r.data)
- assert '/login?' in page.xpath('//a')[0].attrib.get('href'), 'Unauthorized access: wrong redirection'
- # authorized access
- login(client, test_user)
- r = client.get(url, follow_redirects=True)
- assert r.status_code == 200, f'Authorized access. Status code: {r.status_code}'
- # assert warning message
- page = html.fromstring(r.data)
- flash_area = page.xpath('//div[@id="flash-area"]')
- assert bool(flash_area), 'Flash Messages absent'
- assert bool(flash_area[0].xpath('./div[contains(@class, "alert-warning")]')), 'Warning message is absent'
|