From e3c1da9d134bd5337d78c78f6d88b3ac162976d9 Mon Sep 17 00:00:00 2001 From: FreneticScribbler Date: Mon, 11 May 2020 23:04:13 +0100 Subject: [PATCH] Start on new tests --- PyRIGS/tests/base.py | 6 +++ PyRIGS/tests/regions.py | 2 +- RIGS/templates/event_table.html | 10 ++-- RIGS/templates/index.html | 4 +- RIGS/tests/pages.py | 54 ++++++++++++++++++++++ RIGS/tests/regions.py | 12 +++++ RIGS/tests/test_functional.py | 14 ------ RIGS/tests/test_rigs.py | 66 +++++++++++++++++++++++++++ assets/templates/asset_embed.html | 3 +- assets/templates/asset_list.html | 2 +- assets/templates/base_assets.html | 14 +++--- assets/templates/cable_type_list.html | 14 +++--- versioning/migrations/__init__.py | 0 13 files changed, 163 insertions(+), 38 deletions(-) create mode 100644 RIGS/tests/pages.py create mode 100644 RIGS/tests/regions.py create mode 100644 RIGS/tests/test_rigs.py create mode 100644 versioning/migrations/__init__.py diff --git a/PyRIGS/tests/base.py b/PyRIGS/tests/base.py index da7f4eb5..67430ef4 100644 --- a/PyRIGS/tests/base.py +++ b/PyRIGS/tests/base.py @@ -3,7 +3,13 @@ from selenium import webdriver from RIGS import models as rigsmodels from . import pages import os +import pytz +from datetime import date, time, datetime, timedelta +from django.conf import settings +def create_datetime(year, month, day, hour, min): + tz = pytz.timezone(settings.TIME_ZONE) + return tz.localize(datetime(year, month, day, hour, min)).astimezone(pytz.utc) def create_browser(): options = webdriver.ChromeOptions() diff --git a/PyRIGS/tests/regions.py b/PyRIGS/tests/regions.py index 562976b5..773c92c3 100644 --- a/PyRIGS/tests/regions.py +++ b/PyRIGS/tests/regions.py @@ -32,12 +32,12 @@ class BootstrapSelectElement(Region): def toggle(self): original_state = self.is_open - return self.find_element(*self._main_button_locator).click() option_box = self.find_element(*self._option_box_locator) if original_state: self.wait.until(expected_conditions.invisibility_of_element_located(option_box)) else: self.wait.until(expected_conditions.visibility_of_element_located(option_box)) + return self.find_element(*self._main_button_locator).click() def open(self): if not self.is_open: diff --git a/RIGS/templates/event_table.html b/RIGS/templates/event_table.html index 87122808..bbafdb28 100644 --- a/RIGS/templates/event_table.html +++ b/RIGS/templates/event_table.html @@ -11,11 +11,11 @@ {% for event in events %} - + - {{ event.pk }} + {{ event.pk }} - +
{{ event.start_date|date:"D d/m/Y" }}
{% if event.end_date and event.end_date != event.start_date %}
{{ event.end_date|date:"D d/m/Y" }}
@@ -45,7 +45,7 @@ {% endif %} - +

{{ event.name }} @@ -71,7 +71,7 @@ {% include 'partials/event_status.html' %} - + {% if event.mic %}
{% if perms.RIGS.view_profile %} diff --git a/RIGS/templates/index.html b/RIGS/templates/index.html index c446e1ba..7d12d0f7 100644 --- a/RIGS/templates/index.html +++ b/RIGS/templates/index.html @@ -34,8 +34,8 @@

Quick Links

- TEC Forum - TEC Wiki + TEC Forum + TEC Wiki {% if perms.RIGS.view_event %} Price List {% endif %} diff --git a/RIGS/tests/pages.py b/RIGS/tests/pages.py new file mode 100644 index 00000000..5e06e877 --- /dev/null +++ b/RIGS/tests/pages.py @@ -0,0 +1,54 @@ +from pypom import Page, Region +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions +from selenium.webdriver import Chrome +from django.urls import reverse +from PyRIGS.tests import regions +from PyRIGS.tests.pages import BasePage, FormPage +from selenium.common.exceptions import NoSuchElementException + +class Index(BasePage): + URL_TEMPLATE = reverse('index') + + +class Rigboard(BasePage): + URL_TEMPLATE = reverse('rigboard') + + _add_item_selector = (By.CSS_SELECTOR, 'a.btn:nth-child(2)') + _event_row_locator = (By.ID, 'event_row') + + def add(self): + self.find_element(*self._add_item_selector).click() + + class EventListRow(Region): + _event_number_locator = (By.ID, "event_number") + _event_dates_locator = (By.ID, "event_dates") + _event_details_locator = (By.ID, "event_details") + _event_mic_locator = (By.ID, "event_mic") + + @property + def id(self): + return self.find_element(*self._event_number_locator).text + + @property + def dates(self): + return self.find_element(*self._event_dates_locator).text + + @property + def details(self): + return self.find_element(*self._event_details_locator).text + + @property + def mic(self): + return self.find_element(*self._event_mic_locator).text + + @property + def events(self): + return [self.EventListRow(self, i) for i in self.find_elements(*self._event_row_locator)] + + +class GenericList(BasePage): + _search_selector = (By.CSS_SELECTOR, 'div.input-group:nth-child(2) > input:nth-child(1)') + _search_go_selector = (By.ID, 'id_search') + _add_item_selector = (By.CSS_SELECTOR, '.btn-success') + diff --git a/RIGS/tests/regions.py b/RIGS/tests/regions.py new file mode 100644 index 00000000..aec64bcf --- /dev/null +++ b/RIGS/tests/regions.py @@ -0,0 +1,12 @@ +from pypom import Region +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions +from selenium.webdriver.remote.webelement import WebElement +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support.select import Select +import datetime + + +class Header(Region): + def find_link(self, link_text): + return self.driver.find_element_by_partial_link_text(link_text) diff --git a/RIGS/tests/test_functional.py b/RIGS/tests/test_functional.py index 086a36a2..0d0db6d1 100644 --- a/RIGS/tests/test_functional.py +++ b/RIGS/tests/test_functional.py @@ -64,19 +64,6 @@ class EventTest(LiveServerTestCase): self.assertEqual(self.live_server_url + n, self.browser.current_url) - def testRigboardButtons(self): - # Requests address - self.browser.get(self.live_server_url + '/rigboard/') - # Gets redirected to login - self.authenticate('/rigboard/') - - # Completes and comes back to rigboard - # Clicks add new - self.browser.find_element_by_partial_link_text("New").click() - self.assertEqual( - self.live_server_url + '/event/create/', self.browser.current_url) - self.browser.get(self.live_server_url + '/rigboard/') - def testRigCreate(self): # Requests address self.browser.get(self.live_server_url + '/event/create/') @@ -1061,7 +1048,6 @@ class TECEventAuthorisationTest(TestCase): self.assertEqual(self.event.auth_request_to, 'client@functional.test') self.assertIsNotNone(self.event.auth_request_at) - class SearchTest(LiveServerTestCase): def setUp(self): self.profile = models.Profile( diff --git a/RIGS/tests/test_rigs.py b/RIGS/tests/test_rigs.py new file mode 100644 index 00000000..dda892e2 --- /dev/null +++ b/RIGS/tests/test_rigs.py @@ -0,0 +1,66 @@ +from . import pages +from django.core.management import call_command +from django.test import TestCase +from django.test.utils import override_settings +from django.urls import reverse +from urllib.parse import urlparse +from PyRIGS.tests.base import BaseTest, AutoLoginTest +from RIGS import models, urls +from reversion import revisions as reversion +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support.ui import WebDriverWait +from PyRIGS.tests.base import animation_is_finished +from PyRIGS.tests import base +from RIGS.tests import regions +from datetime import date, time, datetime, timedelta +from django.utils import timezone + + +class TestRigboard(AutoLoginTest): + def setUp(self): + super().setUp() + client = models.Person.objects.create(name='Duplicate Test Person', email='duplicate@functional.test') + self.vatrate = models.VatRate.objects.create(start_at='2014-03-05', rate=0.20, comment='test1') + self.testEvent = models.Event.objects.create(name="TE E1", status=models.Event.PROVISIONAL, + start_date=date.today() + timedelta(days=6), + description="start future no end", + purchase_order='TESTPO', + person=client, + auth_request_by=self.profile, + auth_request_at=base.create_datetime(2015, 0o6, 0o4, 10, 00), + auth_request_to="some@email.address") + self.testEvent2 = models.Event.objects.create(name="TE E2", status=models.Event.PROVISIONAL, + start_date=date.today() + timedelta(days=8), + description="start future no end, later", + purchase_order='TESTPO', + person=client, + auth_request_by=self.profile, + auth_request_at=base.create_datetime(2015, 0o6, 0o4, 10, 00), + auth_request_to="some@email.address") + + self.page = pages.Rigboard(self.driver, self.live_server_url).open() + + def test_buttons(self): + header = regions.Header(self.page, self.driver.find_element(By.CSS_SELECTOR, '.navbar')) + # TODO Switch to checking reversed links (difficult because of arguments) + header.find_link("Rigboard").click() + self.assertEqual( + self.live_server_url + '/rigboard/', self.driver.current_url) + header.find_link("Archive").click() + self.assertEqual( + self.live_server_url + '/event/archive/', self.driver.current_url) + # TODO - This fails for some reason + # header.find_link("New").click() + # self.assertEqual( + # self.live_server_url + '/event/create/', self.driver.current_url) + + def test_event_order(self): + self.assertIn(self.testEvent.start_date.strftime('%a %d/%m/%Y'), self.page.events[0].dates) + self.assertIn(self.testEvent2.start_date.strftime('%a %d/%m/%Y'), self.page.events[1].dates) + + def test_add_button(self): + self.page.add() + self.assertIn('create', self.driver.current_url) + # Ideally get a response object to assert 200 on diff --git a/assets/templates/asset_embed.html b/assets/templates/asset_embed.html index 2d98a541..beb8538f 100644 --- a/assets/templates/asset_embed.html +++ b/assets/templates/asset_embed.html @@ -22,6 +22,7 @@ {{ object.status }}

+
{% if object.serial_number %}
Serial Number:
{{ object.serial_number }}
@@ -30,7 +31,7 @@
Comments:
{{ object.comments|linebreaksbr }}
{% endif %} - +
diff --git a/assets/templates/asset_list.html b/assets/templates/asset_list.html index 687e6339..fbf93b70 100644 --- a/assets/templates/asset_list.html +++ b/assets/templates/asset_list.html @@ -39,7 +39,7 @@
{% include 'partials/asset_list_table.html' %}
diff --git a/assets/templates/base_assets.html b/assets/templates/base_assets.html index 2c256f28..06555280 100644 --- a/assets/templates/base_assets.html +++ b/assets/templates/base_assets.html @@ -5,7 +5,7 @@ {% endblock %} {% block titleheader %} - RIGS + RIGS Assets {% endblock %} @@ -13,23 +13,23 @@ diff --git a/assets/templates/cable_type_list.html b/assets/templates/cable_type_list.html index 74e97407..34f69f8f 100644 --- a/assets/templates/cable_type_list.html +++ b/assets/templates/cable_type_list.html @@ -11,21 +11,21 @@ - - - - + + + + {% for item in object_list %} - + {% endfor %} diff --git a/versioning/migrations/__init__.py b/versioning/migrations/__init__.py new file mode 100644 index 00000000..e69de29b
Cable TypeCircuitsCoresQuick LinksCable TypeCircuitsCoresQuick Links
{{ item }}{{ item }} {{ item.circuits }} {{ item.cores }} - View - Edit + View + Edit