From 4f6d2333c0f9b67564f0f10ecfbb2447a0fb7560 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 18:01:15 +0100 Subject: [PATCH 01/36] Add VatRate model tests --- PyRIGS/settings.py | 14 +++++++------- RIGS/test_models.py | 17 +++++++++++++++++ RIGS/tests.py | 3 --- 3 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 RIGS/test_models.py delete mode 100644 RIGS/tests.py diff --git a/PyRIGS/settings.py b/PyRIGS/settings.py index 8c6d78b6..f3976222 100644 --- a/PyRIGS/settings.py +++ b/PyRIGS/settings.py @@ -73,13 +73,13 @@ DATABASES = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, - 'legacy': { - 'ENGINE': 'django.db.backends.mysql', - 'HOST': 'alfie.codedinternet.com', - 'NAME': 'tec_rigs', - 'USER': 'tec_rigs', - 'PASSWORD': 'xMNb(b+Giu]&', - } + # 'legacy': { + # 'ENGINE': 'django.db.backends.mysql', + # 'HOST': 'alfie.codedinternet.com', + # 'NAME': 'tec_rigs', + # 'USER': 'tec_rigs', + # 'PASSWORD': 'xMNb(b+Giu]&', + # } } # User system diff --git a/RIGS/test_models.py b/RIGS/test_models.py new file mode 100644 index 00000000..dfc0824f --- /dev/null +++ b/RIGS/test_models.py @@ -0,0 +1,17 @@ +from django.test import TestCase +from RIGS import models + +class VatRateTestCase(TestCase): + def setUp(self): + models.VatRate.objects.create(start_at='2014-03-01',rate=0.20,comment='test1') + models.VatRate.objects.create(start_at='2016-03-01',rate=0.15,comment='test2') + + def test_find_correct(self): + r = models.VatRate.objects.find_rate('2015-03-01') + self.assertEqual(r.comment, 'test1') + r = models.VatRate.objects.find_rate('2016-03-01') + self.assertEqual(r.comment, 'test2') + + def test_percent_correct(self): + r = models.VatRate.objects.get(rate=0.20) + self.assertEqual(r.as_percent, 20) \ No newline at end of file diff --git a/RIGS/tests.py b/RIGS/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/RIGS/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. From 22f33013ec5aefa87b266ba61a6043ab38658dfe Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 18:44:45 +0100 Subject: [PATCH 02/36] Add events and check count/rig_count --- RIGS/test_models.py | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index dfc0824f..b0ea0d76 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -1,5 +1,6 @@ from django.test import TestCase from RIGS import models +from datetime import date, timedelta class VatRateTestCase(TestCase): def setUp(self): @@ -14,4 +15,46 @@ class VatRateTestCase(TestCase): def test_percent_correct(self): r = models.VatRate.objects.get(rate=0.20) - self.assertEqual(r.as_percent, 20) \ No newline at end of file + self.assertEqual(r.as_percent, 20) + +class EventTestCase(TestCase): + def setUp(self): + self.vatrate = models.VatRate.objects.create(start_at='2014-03-01',rate=0.20,comment='test1') + self.person = models.Person.objects.create(name="TE P1") + self.organisation = models.Organisation.objects.create(name="TE O1") + self.venue = models.Venue.objects.create(name="TE V1") + self.profile = models.Profile.objects.create(username="testuser1", email="1@test.com") + + # produce 7 normal events + models.Event.objects.create(name="TE E1", start_date=date.today() + timedelta(days=6), description="start future no end") + models.Event.objects.create(name="TE E2", start_date=date.today(), description="start today no end") + models.Event.objects.create(name="TE E3", start_date=date.today(), end_date=date.today(), description="start today with end") + models.Event.objects.create(name="TE E4", start_date='2014-03-20', description="start past no end") + models.Event.objects.create(name="TE E5", start_date='2014-03-20', end_date='2014-03-21', description="start past with end") + models.Event.objects.create(name="TE E6", start_date=date.today()-timedelta(days=2), end_date=date.today()+timedelta(days=2), description="start past, end future") + models.Event.objects.create(name="TE E7", start_date=date.today()+timedelta(days=2), end_date=date.today()+timedelta(days=2), description="start + end in future") + + # 2 cancelled + models.Event.objects.create(name="TE E8", start_date=date.today()+timedelta(days=2), end_date=date.today()+timedelta(days=2), status=models.Event.CANCELLED, description="cancelled in future") + models.Event.objects.create(name="TE E9", start_date=date.today()-timedelta(days=1), end_date=date.today()+timedelta(days=2), status=models.Event.CANCELLED, description="cancelled and started") + + # 5 dry hire + models.Event.objects.create(name="TE E10", start_date=date.today(), dry_hire=True, description="dryhire today") + models.Event.objects.create(name="TE E11", start_date=date.today(), dry_hire=True, checked_in_by=self.profile, description="dryhire today, checked in") + models.Event.objects.create(name="TE E12", start_date=date.today()-timedelta(days=1), dry_hire=True, description="dryhire past") + models.Event.objects.create(name="TE E13", start_date=date.today()-timedelta(days=1), dry_hire=True, checked_in_by=self.profile, description="dryhire past checked in") + models.Event.objects.create(name="TE E14", start_date=date.today(), dry_hire=True, status=models.Event.CANCELLED, description="dryhire today cancelled") + + # 4 non rig + models.Event.objects.create(name="TE E15", start_date=date.today(), is_rig=False, description="non rig today") + models.Event.objects.create(name="TE E16", start_date=date.today()+timedelta(days=1), is_rig=False, description="non rig tomorrow") + models.Event.objects.create(name="TE E17", start_date=date.today()-timedelta(days=1), is_rig=False, description="non rig yesterday") + models.Event.objects.create(name="TE E18", start_date=date.today(), is_rig=False, status=models.Event.CANCELLED, description="non rig today cancelled") + + def test_count(self): + # Santiy check we have the expected events created + self.assertEqual(models.Event.objects.count(), 18, "Incorrect number of events, check setup") + + def test_rig_count(self): + # by my count this is 7 + self.assertEqual(models.Event.objects.rig_count(), 7) \ No newline at end of file From ca015c4f94b0a3031f9ff5b4296f9a8b5a9684d9 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 19:05:09 +0100 Subject: [PATCH 03/36] Add current event events test: FAILING. --- RIGS/test_models.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index b0ea0d76..dff35b45 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -26,7 +26,7 @@ class EventTestCase(TestCase): self.profile = models.Profile.objects.create(username="testuser1", email="1@test.com") # produce 7 normal events - models.Event.objects.create(name="TE E1", start_date=date.today() + timedelta(days=6), description="start future no end") + models.Event.objects.create(name="TE E1", start_date=date.today() + timedelta(days=6), description="start future no end") models.Event.objects.create(name="TE E2", start_date=date.today(), description="start today no end") models.Event.objects.create(name="TE E3", start_date=date.today(), end_date=date.today(), description="start today with end") models.Event.objects.create(name="TE E4", start_date='2014-03-20', description="start past no end") @@ -57,4 +57,13 @@ class EventTestCase(TestCase): def test_rig_count(self): # by my count this is 7 - self.assertEqual(models.Event.objects.rig_count(), 7) \ No newline at end of file + self.assertEqual(models.Event.objects.rig_count(), 7) + + def test_current_events(self): + # by my count 7 + 4 + 1 + current_events = models.Event.objects.current_events() + # for event in current_events: + # print event + self.assertEqual(len(current_events), 7+4+1) + self.assertIn(models.Event.objects.get(name="TE E12"), current_events) + \ No newline at end of file From 23bf81fb8f6e48e0b839c1c0ec01b7c100dc5df4 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 21:56:39 +0100 Subject: [PATCH 04/36] Add reverse relation tests. Add status tests. --- RIGS/test_models.py | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index dff35b45..e763fdcb 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -19,10 +19,7 @@ class VatRateTestCase(TestCase): class EventTestCase(TestCase): def setUp(self): - self.vatrate = models.VatRate.objects.create(start_at='2014-03-01',rate=0.20,comment='test1') - self.person = models.Person.objects.create(name="TE P1") - self.organisation = models.Organisation.objects.create(name="TE O1") - self.venue = models.Venue.objects.create(name="TE V1") + self.vatrate = models.VatRate.objects.create(start_at='2014-03-05',rate=0.20,comment='test1') self.profile = models.Profile.objects.create(username="testuser1", email="1@test.com") # produce 7 normal events @@ -66,4 +63,41 @@ class EventTestCase(TestCase): # print event self.assertEqual(len(current_events), 7+4+1) self.assertIn(models.Event.objects.get(name="TE E12"), current_events) - \ No newline at end of file + + def test_related_venue(self): + v1 = models.Venue.objects.create(name="TE V1") + v2 = models.Venue.objects.create(name="TE V2") + events = models.Event.objects.all() + for event in events[:2]: + event.venue = v1 + event.save() + for event in events[3:4]: + event.venue = v2 + event.save() + + events = models.Event.objects.all() + self.assertItemsEqual(events[:2], v1.latest_events) + self.assertItemsEqual(events[3:4], v2.latest_events) + + def test_related_vatrate(self): + self.assertEqual(self.vatrate, models.Event.objects.all()[0].vat_rate) + + def test_cancelled_property(self): + event = models.Event.objects.all()[0] + event.status = models.Event.CANCELLED + event.save() + event = models.Event.objects.all()[0] + self.assertEqual(event.status, models.Event.CANCELLED) + self.assertTrue(event.cancelled) + event.status = models.Event.PROVISIONAL + event.save() + + def test_confirmed_property(self): + event = models.Event.objects.all()[0] + event.status = models.Event.CONFIRMED + event.save() + event = models.Event.objects.all()[0] + self.assertEqual(event.status, models.Event.CONFIRMED) + self.assertTrue(event.confirmed) + event.status = models.Event.PROVISIONAL + event.save() \ No newline at end of file From e2ab112f7b14d0e9cb1af38374ee6e0381e3064b Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 22:00:35 +0100 Subject: [PATCH 05/36] Add person, organisation related tests --- RIGS/test_models.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index e763fdcb..2ce7fde2 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -82,6 +82,38 @@ class EventTestCase(TestCase): def test_related_vatrate(self): self.assertEqual(self.vatrate, models.Event.objects.all()[0].vat_rate) + def test_related_person(self): + p1 = models.Person.objects.create(name="TE P1") + p2 = models.Person.objects.create(name="TE P2") + + events = models.Event.objects.all() + for event in events[:2]: + event.person = p1 + event.save() + for event in events[3:4]: + event.person = p2 + event.save() + + events = models.Event.objects.all() + self.assertItemsEqual(events[:2], p1.latest_events) + self.assertItemsEqual(events[3:4], p2.latest_events) + + def test_related_organisation(self): + o1 = models.Organisation.objects.create(name="TE O1") + o2 = models.Organisation.objects.create(name="TE O2") + + events = models.Event.objects.all() + for event in events[:2]: + event.organisation = o1 + event.save() + for event in events[3:4]: + event.organisation = o2 + event.save() + + events = models.Event.objects.all() + self.assertItemsEqual(events[:2], o1.latest_events) + self.assertItemsEqual(events[3:4], o2.latest_events) + def test_cancelled_property(self): event = models.Event.objects.all()[0] event.status = models.Event.CANCELLED From 29edd92c09bc106578626c6d13abfbe8202e6fc9 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 22:06:56 +0100 Subject: [PATCH 06/36] Add person <-> organisations --- RIGS/test_models.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 2ce7fde2..658b0985 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -114,6 +114,41 @@ class EventTestCase(TestCase): self.assertItemsEqual(events[:2], o1.latest_events) self.assertItemsEqual(events[3:4], o2.latest_events) + def test_organisation_person_join(self): + p1 = models.Person.objects.create(name="TE P1") + p2 = models.Person.objects.create(name="TE P2") + o1 = models.Organisation.objects.create(name="TE O1") + o2 = models.Organisation.objects.create(name="TE O2") + + events = models.Event.objects.all() + # p1 in o1 + o2, p2 in o1 + for event in events[:2]: + event.person = p1 + event.organisation = o1 + event.save() + for event in events[3:4]: + event.person = p1 + event.organisation = o2 + event.save() + for event in events[5:7]: + event.person = p2 + event.organisation = o1 + event.save() + + events = models.Event.objects.all() + + # Check person's organisations + self.assertIn(o1, p1.organisations) + self.assertIn(o2, p1.organisations) + self.assertIn(o1, p2.organisations) + self.assertNotIn(o2, p2.organisations) + + # Check organisation's persons + self.assertIn(p1, o1.persons) + self.assertIn(p2, o1.persons) + self.assertIn(p1, o2.persons) + self.assertNotIn(p2, o2.persons) + def test_cancelled_property(self): event = models.Event.objects.all()[0] event.status = models.Event.CANCELLED From b0b438250e6ed6b67665261499cfcf545188ec93 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 22:13:31 +0100 Subject: [PATCH 07/36] Add item total cost test --- RIGS/test_models.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 658b0985..0d926f6e 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -167,4 +167,19 @@ class EventTestCase(TestCase): self.assertEqual(event.status, models.Event.CONFIRMED) self.assertTrue(event.confirmed) event.status = models.Event.PROVISIONAL - event.save() \ No newline at end of file + event.save() + +class EventItemTestCase(TestCase): + def setUp(self): + self.e1 = models.Event.objects.create(name="TI E1", start_date=date.today()) + self.e2 = models.Event.objects.create(name="TI E2", start_date=date.today()) + + def test_item_cost(self): + item = models.EventItem.objects.create(event=self.e1, name="TI I1", quantity=1, cost=1.00, order=1) + self.assertEqual(item.total_cost, 1.00) + + item.cost = 2.50 + self.assertEqual(item.total_cost, 2.50) + + item.quantity = 4 + self.assertEqual(item.total_cost, 10.00) \ No newline at end of file From f8ced4c169383f5295798463e3dc43a6de1e2fa9 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 31 Mar 2015 23:43:06 +0100 Subject: [PATCH 08/36] Add item ordering test --- RIGS/test_models.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 0d926f6e..d6eb0eca 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -182,4 +182,15 @@ class EventItemTestCase(TestCase): self.assertEqual(item.total_cost, 2.50) item.quantity = 4 - self.assertEqual(item.total_cost, 10.00) \ No newline at end of file + self.assertEqual(item.total_cost, 10.00) + + # need to tidy up + item.delete() + + def test_item_order(self): + i1 = models.EventItem.objects.create(event=self.e1, name="TI I1", quantity=1, cost=1.00, order=1) + i2 = models.EventItem.objects.create(event=self.e1, name="TI I2", quantity=1, cost=1.00, order=2) + + items = self.e1.items.all() + self.assertListEqual([i1, i2], list(items)) + \ No newline at end of file From 4a8da696862d44e5401b96644f77facaca69d0d3 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Wed, 1 Apr 2015 17:09:06 +0100 Subject: [PATCH 09/36] Add event pricing tests --- RIGS/test_models.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index d6eb0eca..5bee2c55 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -1,6 +1,7 @@ from django.test import TestCase from RIGS import models from datetime import date, timedelta +from decimal import * class VatRateTestCase(TestCase): def setUp(self): @@ -193,4 +194,35 @@ class EventItemTestCase(TestCase): items = self.e1.items.all() self.assertListEqual([i1, i2], list(items)) - \ No newline at end of file + +class EventPricingTestCase(TestCase): + def setUp(self): + models.VatRate.objects.create(rate=0.20, comment="TP V1", start_at='2013-01-01') + models.VatRate.objects.create(rate=0.10, comment="TP V2", start_at=date.today()-timedelta(days=1)) + self.e1 = models.Event.objects.create(name="TP E1", start_date=date.today()-timedelta(days=2)) + self.e2 = models.Event.objects.create(name="TP E2", start_date=date.today()) + + # Create some items E1, total 70.40 + # Create some items E2, total 381.20 + self.i1 = models.EventItem.objects.create(event=self.e1, name="TP I1", quantity=1, cost=50.00, order=1) + self.i2 = models.EventItem.objects.create(event=self.e1, name="TP I2", quantity=2, cost=3.20, order=2) + self.i3 = models.EventItem.objects.create(event=self.e1, name="TP I3", quantity=7, cost=2.00, order=3) + self.i4 = models.EventItem.objects.create(event=self.e2, name="TP I4", quantity=2, cost=190.60, order=1) + + # Decimal type is needed here as that is what is returned from the model. + # Using anything else results in a failure due to floating point arritmetic + def test_sum_totals(self): + self.assertEqual(self.e1.sum_total, Decimal('70.40')) + self.assertEqual(self.e2.sum_total, Decimal('381.20')) + + def test_vat_rate(self): + self.assertEqual(self.e1.vat_rate.rate, Decimal('0.20')) + self.assertEqual(self.e2.vat_rate.rate, Decimal('0.10')) + + def test_vat_ammount(self): + self.assertEqual(self.e1.vat, Decimal('14.08')) + self.assertEqual(self.e2.vat, Decimal('38.12')) + + def test_grand_total(self): + self.assertEqual(self.e1.total, Decimal('84.48')) + self.assertEqual(self.e2.total, Decimal('419.32')) From 86ba1b4780fe277669b96c4eb64c75be264cd6dd Mon Sep 17 00:00:00 2001 From: Tom Price Date: Wed, 1 Apr 2015 17:26:06 +0100 Subject: [PATCH 10/36] Start work on some funational tests --- RIGS/test_functional.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 RIGS/test_functional.py diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py new file mode 100644 index 00000000..aa851bf0 --- /dev/null +++ b/RIGS/test_functional.py @@ -0,0 +1,13 @@ +from django.test import LiveServerTestCase + +from selenium import webdriver + +class UserRegistrationTest(LiveServerTestCase): + def setUp(self): + self.browser = webdriver.Firefox() + + def tearDown(self): + self.browser.quit() + + def test_false(self): + self.assertFail("Finish me") \ No newline at end of file From a23a04920adc380d46ee7bc784962a13f0093086 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Wed, 1 Apr 2015 17:40:28 +0100 Subject: [PATCH 11/36] Add conditional to analytics code. --- templates/analytics.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/analytics.html b/templates/analytics.html index 6d24c701..f69cda29 100644 --- a/templates/analytics.html +++ b/templates/analytics.html @@ -1,3 +1,4 @@ +{% if not debug %} \ No newline at end of file + +{% endif %} \ No newline at end of file From defa1f9af42436d38c6a01b3f3c1a48309c8505b Mon Sep 17 00:00:00 2001 From: Tom Price Date: Wed, 1 Apr 2015 18:32:08 +0100 Subject: [PATCH 12/36] Add user registration test --- RIGS/test_functional.py | 103 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 3 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index aa851bf0..89d1fb7d 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -1,6 +1,8 @@ from django.test import LiveServerTestCase - +from django.core import mail from selenium import webdriver +from selenium.webdriver.common.keys import Keys +import re class UserRegistrationTest(LiveServerTestCase): def setUp(self): @@ -9,5 +11,100 @@ class UserRegistrationTest(LiveServerTestCase): def tearDown(self): self.browser.quit() - def test_false(self): - self.assertFail("Finish me") \ No newline at end of file + def test_registration(self): + # Navigate to the registration page + self.browser.get(self.live_server_url + '/user/register/') + title_text = self.browser.find_element_by_tag_name('h3').text + self.assertIn("User Registration", title_text) + + # Check the form invites correctly + username = self.browser.find_element_by_id('id_username') + self.assertEqual(username.get_attribute('placeholder'), 'Username') + email = self.browser.find_element_by_id('id_email') + self.assertEqual(email.get_attribute('placeholder'), 'E-mail') + self.assertEqual(email.get_attribute('type'), 'email') # If this is correct we don't need to test it later + password1 = self.browser.find_element_by_id('id_password1') + self.assertEqual(password1.get_attribute('placeholder'), 'Password') + self.assertEqual(password1.get_attribute('type'), 'password') + password2 = self.browser.find_element_by_id('id_password2') + self.assertEqual(password2.get_attribute('placeholder'), 'Password (again)') + self.assertEqual(password2.get_attribute('type'), 'password') + first_name = self.browser.find_element_by_id('id_first_name') + self.assertEqual(first_name.get_attribute('placeholder'), 'First name') + last_name = self.browser.find_element_by_id('id_last_name') + self.assertEqual(last_name.get_attribute('placeholder'), 'Last name') + initials = self.browser.find_element_by_id('id_initials') + self.assertEqual(initials.get_attribute('placeholder'), 'Initials') + phone = self.browser.find_element_by_id('id_phone') + self.assertEqual(phone.get_attribute('placeholder'), 'Phone') + + # Fill the form out incorrectly + username.send_keys('TestUsername') + email.send_keys('test@example.com') + password1.send_keys('correcthorsebatterystaple') + password2.send_keys('correcthorsebatterystapleerror') # deliberate mistake + first_name.send_keys('John') + last_name.send_keys('Smith') + initials.send_keys('JS') + phone.send_keys('0123456789') + + # Submit incorrect form + submit = self.browser.find_element_by_xpath("//input[@type='submit']") + submit.click() + # Restablish error fields + password1 = self.browser.find_element_by_id('id_password1') + password2 = self.browser.find_element_by_id('id_password2') + + # Read what the error is + alert = self.browser.find_element_by_css_selector('div.alert-danger').text + self.assertIn("password fields didn't match", alert) + + # Passwords should be empty + self.assertEqual(password1.get_attribute('value'), '') + self.assertEqual(password2.get_attribute('value'), '') + + # Correct error + password1.send_keys('correcthorsebatterystaple') + password2.send_keys('correcthorsebatterystaple') + + # Submit again + password2.send_keys(Keys.ENTER) + + # Check we have a success message + alert = self.browser.find_element_by_css_selector('div.alert-success').text + self.assertIn('register', alert) + self.assertIn('email', alert) + + # Check Email + self.assertEqual(len(mail.outbox), 1) + email = mail.outbox[0] + self.assertIn(email.subject, 'TestUsername activation required') + urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.message) + self.assertEqual(len(urls), 2) + + mail.outbox = [] # empty this for later + + # Follow link + self.browser.get(urls[1]) # go to the second link + + # Complete registration + title_text = self.browser.find_element_by_tag_name('h2') + self.assertIn('Complete', title_text) + + # Test login + self.browser.get(self.live_server_url + '/user/login') + username = self.browser.find_element_by_id('id_username') + self.assertEqual(username.get_attribute('placeholder'), 'Username') + password = self.browser.find_element_by_id('id_password') + self.assertEqual(password.get_attribute('placeholder'), 'Password') + self.assertEqual(password.get_attribute('type'), 'password') + + username.send_keys('TestUsername') + password.send_keys('correcthorsebatterystaple') + password.send_keys(Keys.ENTER) + + # Check we are logged in + udd = self.browser.find_element_by_id('userdropdown') + self.assertIn('Hi John', udd) + + # All is well From e2b352557c9b3293d7ba4e6280641152ba89b867 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 22:57:17 +0100 Subject: [PATCH 13/36] Change the way current events are tested --- RIGS/test_models.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 5bee2c55..2a7eead8 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -20,30 +20,34 @@ class VatRateTestCase(TestCase): class EventTestCase(TestCase): def setUp(self): + self.all_events = set(range(1, 18)) + self.current_events = (1, 2, 3, 6, 7, 8, 10, 12, 14, 15, 16, 18) + self.not_current_events = set(self.all_events) - set(self.current_events) + self.vatrate = models.VatRate.objects.create(start_at='2014-03-05',rate=0.20,comment='test1') self.profile = models.Profile.objects.create(username="testuser1", email="1@test.com") - # produce 7 normal events + # produce 7 normal events - 5 current models.Event.objects.create(name="TE E1", start_date=date.today() + timedelta(days=6), description="start future no end") models.Event.objects.create(name="TE E2", start_date=date.today(), description="start today no end") - models.Event.objects.create(name="TE E3", start_date=date.today(), end_date=date.today(), description="start today with end") + models.Event.objects.create(name="TE E3", start_date=date.today(), end_date=date.today(), description="start today with end today") models.Event.objects.create(name="TE E4", start_date='2014-03-20', description="start past no end") - models.Event.objects.create(name="TE E5", start_date='2014-03-20', end_date='2014-03-21', description="start past with end") + models.Event.objects.create(name="TE E5", start_date='2014-03-20', end_date='2014-03-21', description="start past with end past") models.Event.objects.create(name="TE E6", start_date=date.today()-timedelta(days=2), end_date=date.today()+timedelta(days=2), description="start past, end future") models.Event.objects.create(name="TE E7", start_date=date.today()+timedelta(days=2), end_date=date.today()+timedelta(days=2), description="start + end in future") - # 2 cancelled + # 2 cancelled - 1 current models.Event.objects.create(name="TE E8", start_date=date.today()+timedelta(days=2), end_date=date.today()+timedelta(days=2), status=models.Event.CANCELLED, description="cancelled in future") models.Event.objects.create(name="TE E9", start_date=date.today()-timedelta(days=1), end_date=date.today()+timedelta(days=2), status=models.Event.CANCELLED, description="cancelled and started") - # 5 dry hire + # 5 dry hire - 3 current models.Event.objects.create(name="TE E10", start_date=date.today(), dry_hire=True, description="dryhire today") models.Event.objects.create(name="TE E11", start_date=date.today(), dry_hire=True, checked_in_by=self.profile, description="dryhire today, checked in") - models.Event.objects.create(name="TE E12", start_date=date.today()-timedelta(days=1), dry_hire=True, description="dryhire past") + models.Event.objects.create(name="TE E12", start_date=date.today()-timedelta(days=1), dry_hire=True, checked_in_by=None, description="dryhire past") models.Event.objects.create(name="TE E13", start_date=date.today()-timedelta(days=1), dry_hire=True, checked_in_by=self.profile, description="dryhire past checked in") models.Event.objects.create(name="TE E14", start_date=date.today(), dry_hire=True, status=models.Event.CANCELLED, description="dryhire today cancelled") - # 4 non rig + # 4 non rig - 3 current models.Event.objects.create(name="TE E15", start_date=date.today(), is_rig=False, description="non rig today") models.Event.objects.create(name="TE E16", start_date=date.today()+timedelta(days=1), is_rig=False, description="non rig tomorrow") models.Event.objects.create(name="TE E17", start_date=date.today()-timedelta(days=1), is_rig=False, description="non rig yesterday") @@ -58,12 +62,10 @@ class EventTestCase(TestCase): self.assertEqual(models.Event.objects.rig_count(), 7) def test_current_events(self): - # by my count 7 + 4 + 1 current_events = models.Event.objects.current_events() - # for event in current_events: - # print event - self.assertEqual(len(current_events), 7+4+1) - self.assertIn(models.Event.objects.get(name="TE E12"), current_events) + self.assertEqual(len(current_events), len(self.current_events)) + for eid in self.current_events: + self.assertIn(models.Event.objects.get(name="TE E%d"%eid), current_events) def test_related_venue(self): v1 = models.Venue.objects.create(name="TE V1") From ec424f2db31aa3e3519886c68c26f3d8ecfdf1fa Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 23:01:52 +0100 Subject: [PATCH 14/36] Fix for incorrect logic in current dry hires Non booked dryhires never show up in the past even if not checked in. --- RIGS/test_models.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index 2a7eead8..d493e373 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -43,8 +43,8 @@ class EventTestCase(TestCase): # 5 dry hire - 3 current models.Event.objects.create(name="TE E10", start_date=date.today(), dry_hire=True, description="dryhire today") models.Event.objects.create(name="TE E11", start_date=date.today(), dry_hire=True, checked_in_by=self.profile, description="dryhire today, checked in") - models.Event.objects.create(name="TE E12", start_date=date.today()-timedelta(days=1), dry_hire=True, checked_in_by=None, description="dryhire past") - models.Event.objects.create(name="TE E13", start_date=date.today()-timedelta(days=1), dry_hire=True, checked_in_by=self.profile, description="dryhire past checked in") + models.Event.objects.create(name="TE E12", start_date=date.today()-timedelta(days=1), dry_hire=True, status=models.Event.BOOKED, description="dryhire past") + models.Event.objects.create(name="TE E13", start_date=date.today()-timedelta(days=2), dry_hire=True, checked_in_by=self.profile, description="dryhire past checked in") models.Event.objects.create(name="TE E14", start_date=date.today(), dry_hire=True, status=models.Event.CANCELLED, description="dryhire today cancelled") # 4 non rig - 3 current @@ -67,6 +67,9 @@ class EventTestCase(TestCase): for eid in self.current_events: self.assertIn(models.Event.objects.get(name="TE E%d"%eid), current_events) + for eid in self.not_current_events: + self.assertNotIn(models.Event.objects.get(name="TE E%d"%eid), current_events) + def test_related_venue(self): v1 = models.Venue.objects.create(name="TE V1") v2 = models.Venue.objects.create(name="TE V2") From ce0ac7f44b75c6cbb808162f7fa9fef871107314 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 23:04:29 +0100 Subject: [PATCH 15/36] Add missing dry hire 11. Suggest this logic gets looked at. Isn't broken, but not nessecarily correct. --- RIGS/test_models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RIGS/test_models.py b/RIGS/test_models.py index d493e373..5f94f9e3 100644 --- a/RIGS/test_models.py +++ b/RIGS/test_models.py @@ -21,7 +21,7 @@ class VatRateTestCase(TestCase): class EventTestCase(TestCase): def setUp(self): self.all_events = set(range(1, 18)) - self.current_events = (1, 2, 3, 6, 7, 8, 10, 12, 14, 15, 16, 18) + self.current_events = (1, 2, 3, 6, 7, 8, 10, 11, 12, 14, 15, 16, 18) self.not_current_events = set(self.all_events) - set(self.current_events) self.vatrate = models.VatRate.objects.create(start_at='2014-03-05',rate=0.20,comment='test1') @@ -59,7 +59,7 @@ class EventTestCase(TestCase): def test_rig_count(self): # by my count this is 7 - self.assertEqual(models.Event.objects.rig_count(), 7) + self.assertEqual(models.Event.objects.rig_count(), 8) def test_current_events(self): current_events = models.Event.objects.current_events() From 9c06f9f9f9ed540b7006229fb32b6fa170ad43d6 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 23:04:59 +0100 Subject: [PATCH 16/36] Remove uneeded linebreaks to make it easier to trace what is going on. --- RIGS/models.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/RIGS/models.py b/RIGS/models.py index ebd22970..a72255b3 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -207,14 +207,10 @@ class Venue(models.Model, RevisionMixin): class EventManager(models.Manager): def current_events(self): events = self.filter( - (models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, dry_hire=False) & ~models.Q( - status=Event.CANCELLED)) | # Starts after with no end - (models.Q(end_date__gte=datetime.date.today(), dry_hire=False) & ~models.Q( - status=Event.CANCELLED)) | # Ends after - (models.Q(dry_hire=True, start_date__gte=datetime.date.today()) & ~models.Q( - status=Event.CANCELLED)) | # Active dry hire - (models.Q(dry_hire=True, checked_in_by__isnull=True) & ( - models.Q(status=Event.BOOKED) | models.Q(status=Event.CONFIRMED))) | # Active dry hire GT + (models.Q(start_date__gte=datetime.date.today(), end_date__isnull=True, dry_hire=False) & ~models.Q(status=Event.CANCELLED)) | # Starts after with no end + (models.Q(end_date__gte=datetime.date.today(), dry_hire=False) & ~models.Q(status=Event.CANCELLED)) | # Ends after + (models.Q(dry_hire=True, start_date__gte=datetime.date.today()) & ~models.Q(status=Event.CANCELLED)) | # Active dry hire + (models.Q(dry_hire=True, checked_in_by__isnull=True) & (models.Q(status=Event.BOOKED) | models.Q(status=Event.CONFIRMED))) | # Active dry hire GT models.Q(status=Event.CANCELLED, start_date__gte=datetime.date.today()) # Canceled but not started ).order_by('start_date', 'end_date', 'start_time', 'end_time', 'meet_at').select_related('person', 'organisation', 'venue', 'mic') return events From ff304ef84eb45a4344cc2f9f5315db4195acc39a Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 23:24:28 +0100 Subject: [PATCH 17/36] Add logic needed for captcha checking --- RIGS/test_functional.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 89d1fb7d..ab0f1e2e 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -3,19 +3,23 @@ from django.core import mail from selenium import webdriver from selenium.webdriver.common.keys import Keys import re +import os class UserRegistrationTest(LiveServerTestCase): def setUp(self): self.browser = webdriver.Firefox() + os.environ['RECAPTCHA_TESTING'] = 'True' def tearDown(self): self.browser.quit() + os.environ['RECAPTCHA_TESTING'] = 'False' def test_registration(self): # Navigate to the registration page self.browser.get(self.live_server_url + '/user/register/') + self.browser.implicitly_wait(3) title_text = self.browser.find_element_by_tag_name('h3').text - self.assertIn("User Registration", title_text) + self.assertIn("User Registration", tilte_text) # Check the form invites correctly username = self.browser.find_element_by_id('id_username') @@ -37,6 +41,7 @@ class UserRegistrationTest(LiveServerTestCase): self.assertEqual(initials.get_attribute('placeholder'), 'Initials') phone = self.browser.find_element_by_id('id_phone') self.assertEqual(phone.get_attribute('placeholder'), 'Phone') + captcha = self.browser.find_element_by_id('g-recaptcha-response') # Fill the form out incorrectly username.send_keys('TestUsername') @@ -47,6 +52,7 @@ class UserRegistrationTest(LiveServerTestCase): last_name.send_keys('Smith') initials.send_keys('JS') phone.send_keys('0123456789') + captcha.send_keys('PASSED') # Submit incorrect form submit = self.browser.find_element_by_xpath("//input[@type='submit']") @@ -54,6 +60,7 @@ class UserRegistrationTest(LiveServerTestCase): # Restablish error fields password1 = self.browser.find_element_by_id('id_password1') password2 = self.browser.find_element_by_id('id_password2') + captcha = self.browser.find_element_by_id('g-recaptcha-response') # Read what the error is alert = self.browser.find_element_by_css_selector('div.alert-danger').text @@ -66,6 +73,7 @@ class UserRegistrationTest(LiveServerTestCase): # Correct error password1.send_keys('correcthorsebatterystaple') password2.send_keys('correcthorsebatterystaple') + captcha.send_keys('PASSED') # Submit again password2.send_keys(Keys.ENTER) @@ -98,10 +106,12 @@ class UserRegistrationTest(LiveServerTestCase): password = self.browser.find_element_by_id('id_password') self.assertEqual(password.get_attribute('placeholder'), 'Password') self.assertEqual(password.get_attribute('type'), 'password') + captcha = self.browser.find_element_by_id('g-recaptcha-response') username.send_keys('TestUsername') password.send_keys('correcthorsebatterystaple') password.send_keys(Keys.ENTER) + captcha.send_keys('PASSED') # Check we are logged in udd = self.browser.find_element_by_id('userdropdown') From b5910fb314127840281618c1b747f0c7f242cc29 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Sun, 31 May 2015 23:43:11 +0100 Subject: [PATCH 18/36] Workaround for captcha being hidden. Updated to a few new changes --- RIGS/test_functional.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index ab0f1e2e..706084cd 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -17,9 +17,9 @@ class UserRegistrationTest(LiveServerTestCase): def test_registration(self): # Navigate to the registration page self.browser.get(self.live_server_url + '/user/register/') - self.browser.implicitly_wait(3) + #self.browser.implicitly_wait(3) title_text = self.browser.find_element_by_tag_name('h3').text - self.assertIn("User Registration", tilte_text) + self.assertIn("User Registration", title_text) # Check the form invites correctly username = self.browser.find_element_by_id('id_username') @@ -31,7 +31,7 @@ class UserRegistrationTest(LiveServerTestCase): self.assertEqual(password1.get_attribute('placeholder'), 'Password') self.assertEqual(password1.get_attribute('type'), 'password') password2 = self.browser.find_element_by_id('id_password2') - self.assertEqual(password2.get_attribute('placeholder'), 'Password (again)') + self.assertEqual(password2.get_attribute('placeholder'), 'Password confirmation') self.assertEqual(password2.get_attribute('type'), 'password') first_name = self.browser.find_element_by_id('id_first_name') self.assertEqual(first_name.get_attribute('placeholder'), 'First name') @@ -41,7 +41,6 @@ class UserRegistrationTest(LiveServerTestCase): self.assertEqual(initials.get_attribute('placeholder'), 'Initials') phone = self.browser.find_element_by_id('id_phone') self.assertEqual(phone.get_attribute('placeholder'), 'Phone') - captcha = self.browser.find_element_by_id('g-recaptcha-response') # Fill the form out incorrectly username.send_keys('TestUsername') @@ -52,7 +51,7 @@ class UserRegistrationTest(LiveServerTestCase): last_name.send_keys('Smith') initials.send_keys('JS') phone.send_keys('0123456789') - captcha.send_keys('PASSED') + self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") # Submit incorrect form submit = self.browser.find_element_by_xpath("//input[@type='submit']") @@ -60,7 +59,6 @@ class UserRegistrationTest(LiveServerTestCase): # Restablish error fields password1 = self.browser.find_element_by_id('id_password1') password2 = self.browser.find_element_by_id('id_password2') - captcha = self.browser.find_element_by_id('g-recaptcha-response') # Read what the error is alert = self.browser.find_element_by_css_selector('div.alert-danger').text @@ -73,7 +71,7 @@ class UserRegistrationTest(LiveServerTestCase): # Correct error password1.send_keys('correcthorsebatterystaple') password2.send_keys('correcthorsebatterystaple') - captcha.send_keys('PASSED') + self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") # Submit again password2.send_keys(Keys.ENTER) @@ -86,7 +84,7 @@ class UserRegistrationTest(LiveServerTestCase): # Check Email self.assertEqual(len(mail.outbox), 1) email = mail.outbox[0] - self.assertIn(email.subject, 'TestUsername activation required') + self.assertIn('activation required', email.subject) urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.message) self.assertEqual(len(urls), 2) @@ -106,12 +104,11 @@ class UserRegistrationTest(LiveServerTestCase): password = self.browser.find_element_by_id('id_password') self.assertEqual(password.get_attribute('placeholder'), 'Password') self.assertEqual(password.get_attribute('type'), 'password') - captcha = self.browser.find_element_by_id('g-recaptcha-response') username.send_keys('TestUsername') password.send_keys('correcthorsebatterystaple') password.send_keys(Keys.ENTER) - captcha.send_keys('PASSED') + self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") # Check we are logged in udd = self.browser.find_element_by_id('userdropdown') From 4c2a181a333edeaf1e3b63f4ea2409279bd7c4a4 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 1 Jun 2015 00:03:59 +0100 Subject: [PATCH 19/36] Add event logic --- RIGS/test_functional.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 706084cd..706f2d1c 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -2,6 +2,7 @@ from django.test import LiveServerTestCase from django.core import mail from selenium import webdriver from selenium.webdriver.common.keys import Keys +from RIGS import models import re import os @@ -115,3 +116,39 @@ class UserRegistrationTest(LiveServerTestCase): self.assertIn('Hi John', udd) # All is well + +class EventTest(LiveServerTestCase): + def setUp(self): + self.profile = models.Profile(username="EventTest", first_name="Event", last_name="Test", initials="ETU") + self.profile.set_password("EventTestPassword") + self.profile.save() + + self.browser = webdriver.Firefox() + os.environ['RECAPTCHA_TESTING'] = 'True' + + def tearDown(self): + # self.browser.quit() + os.environ['RECAPTCHA_TESTING'] = 'False' + + def authenticate(self, n=None): + self.assertIn(self.live_server_url + '/user/login/', self.browser.current_url) + if n: + self.assertIn('?next=%s'%n, self.browser.current_url) + username = self.browser.find_element_by_id('id_username') + password = self.browser.find_element_by_id('id_password') + submit = self.browser.find_element_by_css_selector('input[type=submit]') + + username.send_keys("EventTest") + password.send_keys("EventTestPassword") + self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") + submit.click() + + 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 \ No newline at end of file From 812fdbc3f1e7f4439a247fe96c238570563f43c2 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 1 Jun 2015 00:38:39 +0100 Subject: [PATCH 20/36] Complete rigboard test. Add basic story for RigCreate Add start of RigCreate --- RIGS/test_functional.py | 58 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 706f2d1c..58b72f27 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -119,7 +119,7 @@ class UserRegistrationTest(LiveServerTestCase): class EventTest(LiveServerTestCase): def setUp(self): - self.profile = models.Profile(username="EventTest", first_name="Event", last_name="Test", initials="ETU") + self.profile = models.Profile(username="EventTest", first_name="Event", last_name="Test", initials="ETU", is_superuser=True) self.profile.set_password("EventTestPassword") self.profile.save() @@ -127,7 +127,7 @@ class EventTest(LiveServerTestCase): os.environ['RECAPTCHA_TESTING'] = 'True' def tearDown(self): - # self.browser.quit() + self.browser.quit() os.environ['RECAPTCHA_TESTING'] = 'False' def authenticate(self, n=None): @@ -151,4 +151,56 @@ class EventTest(LiveServerTestCase): # Gets redirected to login self.authenticate('/rigboard/') - # Completes and comes back to rigboard \ No newline at end of file + # 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/') + # Gets redirected to login and back + self.authenticate('/event/create/') + + # Check has slided up correctly - third save button hidden + save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') + self.assertFalse(save.is_displayed()) + + # Click Rig button + + # Slider expands and save button visible + + # Create new person + + # See new person selected + + # Change mind and add another + + # Was right the first time, change it back + + # Create organisation + + # See it is selected + + # Create veneue + + # See it selected + + # Set start date/time + + # Set end date/time + + # Add item + + # See new item appear + + # Attempt to save - missing title + + # See error and all data preserved + + # Set title + + # Save again + + # See redirected to success page From 000a7adfa21fec7a61ca31173f20ef9177f6f1e8 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 1 Jun 2015 01:13:14 +0100 Subject: [PATCH 21/36] Add script adding a person to test rig --- RIGS/test_functional.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 58b72f27..874bdbea 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -127,7 +127,7 @@ class EventTest(LiveServerTestCase): os.environ['RECAPTCHA_TESTING'] = 'True' def tearDown(self): - self.browser.quit() + # self.browser.quit() os.environ['RECAPTCHA_TESTING'] = 'False' def authenticate(self, n=None): @@ -168,12 +168,33 @@ class EventTest(LiveServerTestCase): self.assertFalse(save.is_displayed()) # Click Rig button + self.browser.find_element_by_xpath('//button[.="Rig"]').click() # Slider expands and save button visible + self.assertTrue(save.is_displayed()) + form = self.browser.find_element_by_tag_name('form') # Create new person + add_person_button = self.browser.find_element_by_xpath('//a[@data-target="#id_person" and contains(@href, "add")]') + add_person_button.click() + + # See modal has opened + modal = self.browser.find_element_by_id('modal') + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) + + # Fill person form out and submit + modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 1") + modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() + self.browser.implicitly_wait(3) # See new person selected + self.assertEqual("Test Person 1", form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + # and backend + person1 = models.Person.objects.get(name="Test Person 1") + option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person1.pk, int(option.get_attribute("value"))) # Change mind and add another From 07ca052b28a47bea06e7c80333f8a13c8c8ce4f1 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 1 Jun 2015 01:31:56 +0100 Subject: [PATCH 22/36] Add another person and flick between them a couple of times. --- RIGS/test_functional.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 874bdbea..001cc816 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -190,15 +190,38 @@ class EventTest(LiveServerTestCase): self.browser.implicitly_wait(3) # See new person selected - self.assertEqual("Test Person 1", form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) - # and backend person1 = models.Person.objects.get(name="Test Person 1") + self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + # and backend option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') self.assertEqual(person1.pk, int(option.get_attribute("value"))) # Change mind and add another + add_person_button.click() + + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) + + modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 2") + modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() + self.browser.implicitly_wait(3) + + person2 = models.Person.objects.get(name="Test Person 2") + self.assertEqual(person2.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + # Have to do this explcitly to force the wait for it to update + option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person2.pk, int(option.get_attribute("value"))) # Was right the first time, change it back + person_select = form.find_element_by_xpath('//button[@data-id="id_person"]') + person_select.send_keys(person1.name) + person_dropped = form.find_element_by_xpath('//ul[contains(@class, "inner selectpicker")]//span[contains(text(), "%s")]'%person1.name) + person_dropped.click() + + self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person1.pk, int(option.get_attribute("value"))) # Create organisation From faa678cbc0730b39daf17d9a53f06d6b7356a7ab Mon Sep 17 00:00:00 2001 From: Tom Price Date: Mon, 1 Jun 2015 01:47:18 +0100 Subject: [PATCH 23/36] Include editing a person when creating them. --- RIGS/test_functional.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 001cc816..f89cda3a 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -188,6 +188,7 @@ class EventTest(LiveServerTestCase): modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 1") modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) # See new person selected person1 = models.Person.objects.get(name="Test Person 1") @@ -206,6 +207,7 @@ class EventTest(LiveServerTestCase): modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 2") modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) person2 = models.Person.objects.get(name="Test Person 2") self.assertEqual(person2.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) @@ -223,6 +225,21 @@ class EventTest(LiveServerTestCase): option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') self.assertEqual(person1.pk, int(option.get_attribute("value"))) + # Edit Person 1 to have a better name + form.find_element_by_xpath('//a[@data-target="#id_person" and contains(@href, "%s/edit/")]'%person1.pk).click() + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Edit Person", modal.find_element_by_tag_name('h3').text) + name = modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]') + self.assertEqual(person1.name, name.get_attribute('value')) + name.send_keys(Keys.HOME) + name.send_keys('Rig ') + name.send_keys(Keys.ENTER) + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) + person1 = models.Person.objects.get(pk=person1.pk) + self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + # Create organisation # See it is selected From d8c2bd9260bd00b4a965b37ef41124ce09a91a56 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 2 Jun 2015 00:13:01 +0100 Subject: [PATCH 24/36] Fix OS X fails --- RIGS/test_functional.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index f89cda3a..69615bf9 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -127,7 +127,7 @@ class EventTest(LiveServerTestCase): os.environ['RECAPTCHA_TESTING'] = 'True' def tearDown(self): - # self.browser.quit() + self.browser.quit() os.environ['RECAPTCHA_TESTING'] = 'False' def authenticate(self, n=None): @@ -232,8 +232,8 @@ class EventTest(LiveServerTestCase): self.assertIn("Edit Person", modal.find_element_by_tag_name('h3').text) name = modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]') self.assertEqual(person1.name, name.get_attribute('value')) - name.send_keys(Keys.HOME) - name.send_keys('Rig ') + name.clear() + name.send_keys('Rig ' + person1.name) name.send_keys(Keys.ENTER) self.browser.implicitly_wait(3) self.assertFalse(modal.is_displayed()) From bd6d254557e3e20d08786c82c22c3dd6fed29352 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 2 Jun 2015 00:15:26 +0100 Subject: [PATCH 25/36] Fix PEP8 fails --- RIGS/test_functional.py | 445 ++++++++++++++++++++++------------------ 1 file changed, 240 insertions(+), 205 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 69615bf9..b5b967dd 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -6,262 +6,297 @@ from RIGS import models import re import os + class UserRegistrationTest(LiveServerTestCase): - def setUp(self): - self.browser = webdriver.Firefox() - os.environ['RECAPTCHA_TESTING'] = 'True' - def tearDown(self): - self.browser.quit() - os.environ['RECAPTCHA_TESTING'] = 'False' + def setUp(self): + self.browser = webdriver.Firefox() + os.environ['RECAPTCHA_TESTING'] = 'True' - def test_registration(self): - # Navigate to the registration page - self.browser.get(self.live_server_url + '/user/register/') - #self.browser.implicitly_wait(3) - title_text = self.browser.find_element_by_tag_name('h3').text - self.assertIn("User Registration", title_text) - - # Check the form invites correctly - username = self.browser.find_element_by_id('id_username') - self.assertEqual(username.get_attribute('placeholder'), 'Username') - email = self.browser.find_element_by_id('id_email') - self.assertEqual(email.get_attribute('placeholder'), 'E-mail') - self.assertEqual(email.get_attribute('type'), 'email') # If this is correct we don't need to test it later - password1 = self.browser.find_element_by_id('id_password1') - self.assertEqual(password1.get_attribute('placeholder'), 'Password') - self.assertEqual(password1.get_attribute('type'), 'password') - password2 = self.browser.find_element_by_id('id_password2') - self.assertEqual(password2.get_attribute('placeholder'), 'Password confirmation') - self.assertEqual(password2.get_attribute('type'), 'password') - first_name = self.browser.find_element_by_id('id_first_name') - self.assertEqual(first_name.get_attribute('placeholder'), 'First name') - last_name = self.browser.find_element_by_id('id_last_name') - self.assertEqual(last_name.get_attribute('placeholder'), 'Last name') - initials = self.browser.find_element_by_id('id_initials') - self.assertEqual(initials.get_attribute('placeholder'), 'Initials') - phone = self.browser.find_element_by_id('id_phone') - self.assertEqual(phone.get_attribute('placeholder'), 'Phone') - - # Fill the form out incorrectly - username.send_keys('TestUsername') - email.send_keys('test@example.com') - password1.send_keys('correcthorsebatterystaple') - password2.send_keys('correcthorsebatterystapleerror') # deliberate mistake - first_name.send_keys('John') - last_name.send_keys('Smith') - initials.send_keys('JS') - phone.send_keys('0123456789') - self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") + def tearDown(self): + self.browser.quit() + os.environ['RECAPTCHA_TESTING'] = 'False' - # Submit incorrect form - submit = self.browser.find_element_by_xpath("//input[@type='submit']") - submit.click() - # Restablish error fields - password1 = self.browser.find_element_by_id('id_password1') - password2 = self.browser.find_element_by_id('id_password2') + def test_registration(self): + # Navigate to the registration page + self.browser.get(self.live_server_url + '/user/register/') + # self.browser.implicitly_wait(3) + title_text = self.browser.find_element_by_tag_name('h3').text + self.assertIn("User Registration", title_text) - # Read what the error is - alert = self.browser.find_element_by_css_selector('div.alert-danger').text - self.assertIn("password fields didn't match", alert) + # Check the form invites correctly + username = self.browser.find_element_by_id('id_username') + self.assertEqual(username.get_attribute('placeholder'), 'Username') + email = self.browser.find_element_by_id('id_email') + self.assertEqual(email.get_attribute('placeholder'), 'E-mail') + # If this is correct we don't need to test it later + self.assertEqual(email.get_attribute('type'), 'email') + password1 = self.browser.find_element_by_id('id_password1') + self.assertEqual(password1.get_attribute('placeholder'), 'Password') + self.assertEqual(password1.get_attribute('type'), 'password') + password2 = self.browser.find_element_by_id('id_password2') + self.assertEqual( + password2.get_attribute('placeholder'), 'Password confirmation') + self.assertEqual(password2.get_attribute('type'), 'password') + first_name = self.browser.find_element_by_id('id_first_name') + self.assertEqual(first_name.get_attribute('placeholder'), 'First name') + last_name = self.browser.find_element_by_id('id_last_name') + self.assertEqual(last_name.get_attribute('placeholder'), 'Last name') + initials = self.browser.find_element_by_id('id_initials') + self.assertEqual(initials.get_attribute('placeholder'), 'Initials') + phone = self.browser.find_element_by_id('id_phone') + self.assertEqual(phone.get_attribute('placeholder'), 'Phone') - # Passwords should be empty - self.assertEqual(password1.get_attribute('value'), '') - self.assertEqual(password2.get_attribute('value'), '') + # Fill the form out incorrectly + username.send_keys('TestUsername') + email.send_keys('test@example.com') + password1.send_keys('correcthorsebatterystaple') + # deliberate mistake + password2.send_keys('correcthorsebatterystapleerror') + first_name.send_keys('John') + last_name.send_keys('Smith') + initials.send_keys('JS') + phone.send_keys('0123456789') + self.browser.execute_script( + "return jQuery('#g-recaptcha-response').val('PASSED')") - # Correct error - password1.send_keys('correcthorsebatterystaple') - password2.send_keys('correcthorsebatterystaple') - self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") + # Submit incorrect form + submit = self.browser.find_element_by_xpath("//input[@type='submit']") + submit.click() + # Restablish error fields + password1 = self.browser.find_element_by_id('id_password1') + password2 = self.browser.find_element_by_id('id_password2') - # Submit again - password2.send_keys(Keys.ENTER) + # Read what the error is + alert = self.browser.find_element_by_css_selector( + 'div.alert-danger').text + self.assertIn("password fields didn't match", alert) - # Check we have a success message - alert = self.browser.find_element_by_css_selector('div.alert-success').text - self.assertIn('register', alert) - self.assertIn('email', alert) + # Passwords should be empty + self.assertEqual(password1.get_attribute('value'), '') + self.assertEqual(password2.get_attribute('value'), '') - # Check Email - self.assertEqual(len(mail.outbox), 1) - email = mail.outbox[0] - self.assertIn('activation required', email.subject) - urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.message) - self.assertEqual(len(urls), 2) + # Correct error + password1.send_keys('correcthorsebatterystaple') + password2.send_keys('correcthorsebatterystaple') + self.browser.execute_script( + "return jQuery('#g-recaptcha-response').val('PASSED')") - mail.outbox = [] # empty this for later + # Submit again + password2.send_keys(Keys.ENTER) - # Follow link - self.browser.get(urls[1]) # go to the second link + # Check we have a success message + alert = self.browser.find_element_by_css_selector( + 'div.alert-success').text + self.assertIn('register', alert) + self.assertIn('email', alert) - # Complete registration - title_text = self.browser.find_element_by_tag_name('h2') - self.assertIn('Complete', title_text) + # Check Email + self.assertEqual(len(mail.outbox), 1) + email = mail.outbox[0] + self.assertIn('activation required', email.subject) + urls = re.findall( + 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.message) + self.assertEqual(len(urls), 2) - # Test login - self.browser.get(self.live_server_url + '/user/login') - username = self.browser.find_element_by_id('id_username') - self.assertEqual(username.get_attribute('placeholder'), 'Username') - password = self.browser.find_element_by_id('id_password') - self.assertEqual(password.get_attribute('placeholder'), 'Password') - self.assertEqual(password.get_attribute('type'), 'password') + mail.outbox = [] # empty this for later - username.send_keys('TestUsername') - password.send_keys('correcthorsebatterystaple') - password.send_keys(Keys.ENTER) - self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") + # Follow link + self.browser.get(urls[1]) # go to the second link - # Check we are logged in - udd = self.browser.find_element_by_id('userdropdown') - self.assertIn('Hi John', udd) + # Complete registration + title_text = self.browser.find_element_by_tag_name('h2') + self.assertIn('Complete', title_text) + + # Test login + self.browser.get(self.live_server_url + '/user/login') + username = self.browser.find_element_by_id('id_username') + self.assertEqual(username.get_attribute('placeholder'), 'Username') + password = self.browser.find_element_by_id('id_password') + self.assertEqual(password.get_attribute('placeholder'), 'Password') + self.assertEqual(password.get_attribute('type'), 'password') + + username.send_keys('TestUsername') + password.send_keys('correcthorsebatterystaple') + password.send_keys(Keys.ENTER) + self.browser.execute_script( + "return jQuery('#g-recaptcha-response').val('PASSED')") + + # Check we are logged in + udd = self.browser.find_element_by_id('userdropdown') + self.assertIn('Hi John', udd) + + # All is well - # All is well class EventTest(LiveServerTestCase): - def setUp(self): - self.profile = models.Profile(username="EventTest", first_name="Event", last_name="Test", initials="ETU", is_superuser=True) - self.profile.set_password("EventTestPassword") - self.profile.save() - self.browser = webdriver.Firefox() - os.environ['RECAPTCHA_TESTING'] = 'True' + def setUp(self): + self.profile = models.Profile( + username="EventTest", first_name="Event", last_name="Test", initials="ETU", is_superuser=True) + self.profile.set_password("EventTestPassword") + self.profile.save() - def tearDown(self): - self.browser.quit() - os.environ['RECAPTCHA_TESTING'] = 'False' + self.browser = webdriver.Firefox() + os.environ['RECAPTCHA_TESTING'] = 'True' - def authenticate(self, n=None): - self.assertIn(self.live_server_url + '/user/login/', self.browser.current_url) - if n: - self.assertIn('?next=%s'%n, self.browser.current_url) - username = self.browser.find_element_by_id('id_username') - password = self.browser.find_element_by_id('id_password') - submit = self.browser.find_element_by_css_selector('input[type=submit]') + def tearDown(self): + self.browser.quit() + os.environ['RECAPTCHA_TESTING'] = 'False' - username.send_keys("EventTest") - password.send_keys("EventTestPassword") - self.browser.execute_script("return jQuery('#g-recaptcha-response').val('PASSED')") - submit.click() + def authenticate(self, n=None): + self.assertIn( + self.live_server_url + '/user/login/', self.browser.current_url) + if n: + self.assertIn('?next=%s' % n, self.browser.current_url) + username = self.browser.find_element_by_id('id_username') + password = self.browser.find_element_by_id('id_password') + submit = self.browser.find_element_by_css_selector( + 'input[type=submit]') - self.assertEqual(self.live_server_url + n, self.browser.current_url) + username.send_keys("EventTest") + password.send_keys("EventTestPassword") + self.browser.execute_script( + "return jQuery('#g-recaptcha-response').val('PASSED')") + submit.click() - def testRigboardButtons(self): - # Requests address - self.browser.get(self.live_server_url + '/rigboard/') - # Gets redirected to login - self.authenticate('/rigboard/') + self.assertEqual(self.live_server_url + n, self.browser.current_url) - # 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 testRigboardButtons(self): + # Requests address + self.browser.get(self.live_server_url + '/rigboard/') + # Gets redirected to login + self.authenticate('/rigboard/') - def testRigCreate(self): - # Requests address - self.browser.get(self.live_server_url + '/event/create/') - # Gets redirected to login and back - self.authenticate('/event/create/') + # 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/') - # Check has slided up correctly - third save button hidden - save = self.browser.find_element_by_xpath('(//button[@type="submit"])[3]') - self.assertFalse(save.is_displayed()) + def testRigCreate(self): + # Requests address + self.browser.get(self.live_server_url + '/event/create/') + # Gets redirected to login and back + self.authenticate('/event/create/') - # Click Rig button - self.browser.find_element_by_xpath('//button[.="Rig"]').click() + # Check has slided up correctly - third save button hidden + save = self.browser.find_element_by_xpath( + '(//button[@type="submit"])[3]') + self.assertFalse(save.is_displayed()) - # Slider expands and save button visible - self.assertTrue(save.is_displayed()) - form = self.browser.find_element_by_tag_name('form') + # Click Rig button + self.browser.find_element_by_xpath('//button[.="Rig"]').click() - # Create new person - add_person_button = self.browser.find_element_by_xpath('//a[@data-target="#id_person" and contains(@href, "add")]') - add_person_button.click() + # Slider expands and save button visible + self.assertTrue(save.is_displayed()) + form = self.browser.find_element_by_tag_name('form') - # See modal has opened - modal = self.browser.find_element_by_id('modal') - self.browser.implicitly_wait(3) - self.assertTrue(modal.is_displayed()) - self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) + # Create new person + add_person_button = self.browser.find_element_by_xpath( + '//a[@data-target="#id_person" and contains(@href, "add")]') + add_person_button.click() - # Fill person form out and submit - modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 1") - modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() - self.browser.implicitly_wait(3) - self.assertFalse(modal.is_displayed()) + # See modal has opened + modal = self.browser.find_element_by_id('modal') + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) - # See new person selected - person1 = models.Person.objects.get(name="Test Person 1") - self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) - # and backend - option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') - self.assertEqual(person1.pk, int(option.get_attribute("value"))) + # Fill person form out and submit + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 1") + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@type="submit"]').click() + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) - # Change mind and add another - add_person_button.click() + # See new person selected + person1 = models.Person.objects.get(name="Test Person 1") + self.assertEqual(person1.name, form.find_element_by_xpath( + '//button[@data-id="id_person"]/span').text) + # and backend + option = form.find_element_by_xpath( + '//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person1.pk, int(option.get_attribute("value"))) - self.browser.implicitly_wait(3) - self.assertTrue(modal.is_displayed()) - self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) + # Change mind and add another + add_person_button.click() - modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 2") - modal.find_element_by_xpath('//div[@id="modal"]//input[@type="submit"]').click() - self.browser.implicitly_wait(3) - self.assertFalse(modal.is_displayed()) + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) - person2 = models.Person.objects.get(name="Test Person 2") - self.assertEqual(person2.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) - # Have to do this explcitly to force the wait for it to update - option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') - self.assertEqual(person2.pk, int(option.get_attribute("value"))) + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 2") + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@type="submit"]').click() + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) - # Was right the first time, change it back - person_select = form.find_element_by_xpath('//button[@data-id="id_person"]') - person_select.send_keys(person1.name) - person_dropped = form.find_element_by_xpath('//ul[contains(@class, "inner selectpicker")]//span[contains(text(), "%s")]'%person1.name) - person_dropped.click() + person2 = models.Person.objects.get(name="Test Person 2") + self.assertEqual(person2.name, form.find_element_by_xpath( + '//button[@data-id="id_person"]/span').text) + # Have to do this explcitly to force the wait for it to update + option = form.find_element_by_xpath( + '//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person2.pk, int(option.get_attribute("value"))) - self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) - option = form.find_element_by_xpath('//select[@id="id_person"]//option[@selected="selected"]') - self.assertEqual(person1.pk, int(option.get_attribute("value"))) + # Was right the first time, change it back + person_select = form.find_element_by_xpath( + '//button[@data-id="id_person"]') + person_select.send_keys(person1.name) + person_dropped = form.find_element_by_xpath( + '//ul[contains(@class, "inner selectpicker")]//span[contains(text(), "%s")]' % person1.name) + person_dropped.click() - # Edit Person 1 to have a better name - form.find_element_by_xpath('//a[@data-target="#id_person" and contains(@href, "%s/edit/")]'%person1.pk).click() - self.browser.implicitly_wait(3) - self.assertTrue(modal.is_displayed()) - self.assertIn("Edit Person", modal.find_element_by_tag_name('h3').text) - name = modal.find_element_by_xpath('//div[@id="modal"]//input[@id="id_name"]') - self.assertEqual(person1.name, name.get_attribute('value')) - name.clear() - name.send_keys('Rig ' + person1.name) - name.send_keys(Keys.ENTER) - self.browser.implicitly_wait(3) - self.assertFalse(modal.is_displayed()) - person1 = models.Person.objects.get(pk=person1.pk) - self.assertEqual(person1.name, form.find_element_by_xpath('//button[@data-id="id_person"]/span').text) + self.assertEqual(person1.name, form.find_element_by_xpath( + '//button[@data-id="id_person"]/span').text) + option = form.find_element_by_xpath( + '//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person1.pk, int(option.get_attribute("value"))) - # Create organisation + # Edit Person 1 to have a better name + form.find_element_by_xpath( + '//a[@data-target="#id_person" and contains(@href, "%s/edit/")]' % person1.pk).click() + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Edit Person", modal.find_element_by_tag_name('h3').text) + name = modal.find_element_by_xpath( + '//div[@id="modal"]//input[@id="id_name"]') + self.assertEqual(person1.name, name.get_attribute('value')) + name.clear() + name.send_keys('Rig ' + person1.name) + name.send_keys(Keys.ENTER) + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) + person1 = models.Person.objects.get(pk=person1.pk) + self.assertEqual(person1.name, form.find_element_by_xpath( + '//button[@data-id="id_person"]/span').text) - # See it is selected + # Create organisation - # Create veneue + # See it is selected - # See it selected + # Create veneue - # Set start date/time + # See it selected - # Set end date/time + # Set start date/time - # Add item + # Set end date/time - # See new item appear + # Add item - # Attempt to save - missing title + # See new item appear - # See error and all data preserved + # Attempt to save - missing title - # Set title + # See error and all data preserved - # Save again + # Set title - # See redirected to success page + # Save again + + # See redirected to success page From 85e827cd51d90a49996be8d2d4c91d50a4d74fa8 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Tue, 2 Jun 2015 00:48:00 +0100 Subject: [PATCH 26/36] Add organisation, venue, start/end date/time --- RIGS/test_functional.py | 50 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index b5b967dd..fe367f38 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -276,16 +276,60 @@ class EventTest(LiveServerTestCase): '//button[@data-id="id_person"]/span').text) # Create organisation - + add_button = self.browser.find_element_by_xpath( + '//a[@data-target="#id_organisation" and contains(@href, "add")]') + add_button.click() + modal = self.browser.find_element_by_id('modal') + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Organisation", modal.find_element_by_tag_name('h3').text) + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Organisation") + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@type="submit"]').click() + # See it is selected + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) + obj = models.Organisation.objects.get(name="Test Organisation") + self.assertEqual(obj.name, form.find_element_by_xpath( + '//button[@data-id="id_organisation"]/span').text) + # and backend + option = form.find_element_by_xpath( + '//select[@id="id_organisation"]//option[@selected="selected"]') + self.assertEqual(obj.pk, int(option.get_attribute("value"))) # Create veneue - - # See it selected + add_button = self.browser.find_element_by_xpath( + '//a[@data-target="#id_venue" and contains(@href, "add")]') + add_button.click() + modal = self.browser.find_element_by_id('modal') + self.browser.implicitly_wait(3) + self.assertTrue(modal.is_displayed()) + self.assertIn("Add Venue", modal.find_element_by_tag_name('h3').text) + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Venue") + modal.find_element_by_xpath( + '//div[@id="modal"]//input[@type="submit"]').click() + + # See it is selected + self.browser.implicitly_wait(3) + self.assertFalse(modal.is_displayed()) + obj = models.Venue.objects.get(name="Test Venue") + self.assertEqual(obj.name, form.find_element_by_xpath( + '//button[@data-id="id_venue"]/span').text) + # and backend + option = form.find_element_by_xpath( + '//select[@id="id_venue"]//option[@selected="selected"]') + self.assertEqual(obj.pk, int(option.get_attribute("value"))) # Set start date/time + form.find_element_by_id('id_start_date').send_keys('3015-05-25') + form.find_element_by_id('id_start_time').send_keys('06:59') # Set end date/time + form.find_element_by_id('id_end_date').send_keys('4000-06-27') + form.find_element_by_id('id_end_time').send_keys('07:00') # Add item From 92795754b1e01e7f0801ea2e52e88db4125be0b7 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 05:08:14 +0100 Subject: [PATCH 27/36] Enable adding an event item --- RIGS/test_functional.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index fe367f38..ad3ff1f6 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -332,6 +332,18 @@ class EventTest(LiveServerTestCase): form.find_element_by_id('id_end_time').send_keys('07:00') # Add item + form.find_element_by_xpath('//button[contains(@class, "item-add")]').click() + self.browser.implicitly_wait(3) + modal = self.browser.find_element_by_id("itemModal") + modal.find_element_by_id("item_name").send_keys("Test Item 1") + modal.find_element_by_id("item_description").send_keys("This is an item description\nthat for reasons unkown spans two lines") + e = modal.find_element_by_id("item_quantity") + e.click() + e.send_keys(Keys.UP) + e.send_keys(Keys.UP) + e = modal.find_element_by_id("item_cost") + e.send_keys("23.95") + e.send_keys(Keys.ENTER) # enter submit # See new item appear From e132bb2b9d58e5051372759eb59b537b4128fc60 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 05:40:41 +0100 Subject: [PATCH 28/36] Enable checking newly added item has worked --- RIGS/test_functional.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index ad3ff1f6..c3e3eff8 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from django.test import LiveServerTestCase from django.core import mail from selenium import webdriver @@ -5,6 +6,7 @@ from selenium.webdriver.common.keys import Keys from RIGS import models import re import os +import json class UserRegistrationTest(LiveServerTestCase): @@ -345,7 +347,20 @@ class EventTest(LiveServerTestCase): e.send_keys("23.95") e.send_keys(Keys.ENTER) # enter submit - # See new item appear + # Confirm item has been saved to json field + objectitems = self.browser.execute_script("return objectitems;") + self.assertEqual(1, len(objectitems)) + testitem = objectitems["-1"]['fields'] # as we are deliberately creating this we know the ID + self.assertEqual("Test Item 1", testitem['name']) + self.assertEqual("2", testitem['quantity']) # test a couple of "worse case" fields + + # See new item appear in table + row = self.browser.find_element_by_id('item--1') # ID number is known, see above + self.assertIn("Test Item 1", row.find_element_by_xpath('//span[@class="name"]').text) + self.assertIn("This is an item description", row.find_element_by_xpath('//div[@class="item-description"]').text) + self.assertEqual(u'£ 23.95', row.find_element_by_xpath('//tr[@id="item--1"]/td[2]').text) + self.assertEqual("2", row.find_element_by_xpath('//td[@class="quantity"]').text) + self.assertEqual(u'£ 47.90', row.find_element_by_xpath('//tr[@id="item--1"]/td[4]').text) # Attempt to save - missing title From 1f6e624cd9512df52699d32e7e97a8c754b2f627 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 06:00:11 +0100 Subject: [PATCH 29/36] Add small value checks, saving and checking error is displayed correctly. --- RIGS/test_functional.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index c3e3eff8..c52ad3a3 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -362,9 +362,24 @@ class EventTest(LiveServerTestCase): self.assertEqual("2", row.find_element_by_xpath('//td[@class="quantity"]').text) self.assertEqual(u'£ 47.90', row.find_element_by_xpath('//tr[@id="item--1"]/td[4]').text) + # Check totals + self.assertEqual("47.90", self.browser.find_element_by_id('sumtotal').text) + self.assertIn("TBD%", self.browser.find_element_by_id('vat-rate').text) + self.assertEqual("0.00", self.browser.find_element_by_id('vat').text) + self.assertEqual("47.90", self.browser.find_element_by_id('total').text) + # Attempt to save - missing title + save.click() # See error and all data preserved + error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]') + self.assertTrue(error.is_displayed()) + # Should only have one error message + self.assertEqual("Name", error.find_element_by_xpath('//dt[1]').text) + self.assertEqual("This field is required.", error.find_element_by_xpath('//dd[1]/ul/li').text) + # don't need error so close it + error.find_element_by_xpath('//button[@class="close"]').click() + self.assertFalse(error.is_displayed()) # Set title From 6180fdf7a4d09e552af4f16a747cca96f90a5ee1 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 06:26:43 +0100 Subject: [PATCH 30/36] Finish testing the remaining parts of adding an event --- RIGS/test_functional.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index c52ad3a3..e42ec5a7 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -3,6 +3,7 @@ from django.test import LiveServerTestCase from django.core import mail from selenium import webdriver from selenium.webdriver.common.keys import Keys +from selenium.common.exceptions import StaleElementReferenceException from RIGS import models import re import os @@ -371,18 +372,30 @@ class EventTest(LiveServerTestCase): # Attempt to save - missing title save.click() - # See error and all data preserved + # See error error = self.browser.find_element_by_xpath('//div[contains(@class, "alert-danger")]') self.assertTrue(error.is_displayed()) # Should only have one error message self.assertEqual("Name", error.find_element_by_xpath('//dt[1]').text) self.assertEqual("This field is required.", error.find_element_by_xpath('//dd[1]/ul/li').text) # don't need error so close it - error.find_element_by_xpath('//button[@class="close"]').click() - self.assertFalse(error.is_displayed()) + error.find_element_by_xpath('//div[contains(@class, "alert-danger")]//button[@class="close"]').click() + try: + self.assertFalse(error.is_displayed()) + except StaleElementReferenceException: + pass + except: + self.assertFail("Element does not appear to have been deleted") + + # Check at least some data is preserved. Some = all will be there + option = self.browser.find_element_by_xpath( + '//select[@id="id_person"]//option[@selected="selected"]') + self.assertEqual(person1.pk, int(option.get_attribute("value"))) # Set title - - # Save again + e = self.browser.find_element_by_id('id_name') + e.send_keys('Test Event Name') + e.send_keys(Keys.ENTER) # See redirected to success page + self.assertIn("N00001 | Test Event Name", self.browser.find_element_by_xpath('//h1').text) From abdbad14d6af6123d207108157ce502e72935eee Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 06:30:47 +0100 Subject: [PATCH 31/36] Add using the pk of the event rather than a static for atomicity when running other tests. --- RIGS/test_functional.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index e42ec5a7..1fe4b338 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -396,6 +396,8 @@ class EventTest(LiveServerTestCase): e = self.browser.find_element_by_id('id_name') e.send_keys('Test Event Name') e.send_keys(Keys.ENTER) + self.browser.implicitly_wait(3) # See redirected to success page - self.assertIn("N00001 | Test Event Name", self.browser.find_element_by_xpath('//h1').text) + event = models.Event.objects.get(name='Test Event Name') + self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) From 8666dcc9a410665b628fa7a3cc0ca056dfcbaf7d Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 06:42:01 +0100 Subject: [PATCH 32/36] Start work on an EventDetail test --- RIGS/test_functional.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 1fe4b338..b111bbb3 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -401,3 +401,35 @@ class EventTest(LiveServerTestCase): # See redirected to success page event = models.Event.objects.get(name='Test Event Name') self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) + + def testEventDetail(self): + person = models.Person(name="Event Detail Person", email="eventdetail@person.tests.rigs", phone="123 123").save() + organisation = models.Organisation(name="Event Detail Organisation", email="eventdetail@organisation.tests.rigs", phone="123 456").save() + venue = models.Venue(name="Event Detail Venue").save() + event = models.Event( + name="Detail Test", + description="This is an event to test the detail view", + notes="It is going to be aweful", + person=person, + organisation=organisation, + start_date='2015-06-04' + ) + event.save() + item1 = models.EventItem( + event=event, + name="Detail Item 1", + cost="10.00", + quantity="1", + order=1 + ).save() + item2 = models.EventItem( + event=event, + name="Detail Item 2", + description="Foo", + cost="9.72", + quantity="3", + order=2, + ).save() + + + self.browser.get(self.live_server_url + '/event/%d'%event.pk) From 6b2df1b9f43b4a02aaeae6fd61f8dc6d11b45e5b Mon Sep 17 00:00:00 2001 From: Tom Price Date: Thu, 4 Jun 2015 07:04:01 +0100 Subject: [PATCH 33/36] TestEventDetail does not work. Changd name to prevent it from running a full suite of tests. The issue appears to be with trying to access events without a reversion history for that sepecific event. --- RIGS/test_functional.py | 71 +++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index b111bbb3..e446d17e 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -7,6 +7,8 @@ from selenium.common.exceptions import StaleElementReferenceException from RIGS import models import re import os +from django.db import transaction +import reversion import json @@ -402,34 +404,49 @@ class EventTest(LiveServerTestCase): event = models.Event.objects.get(name='Test Event Name') self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) - def testEventDetail(self): - person = models.Person(name="Event Detail Person", email="eventdetail@person.tests.rigs", phone="123 123").save() - organisation = models.Organisation(name="Event Detail Organisation", email="eventdetail@organisation.tests.rigs", phone="123 456").save() - venue = models.Venue(name="Event Detail Venue").save() - event = models.Event( - name="Detail Test", - description="This is an event to test the detail view", - notes="It is going to be aweful", - person=person, - organisation=organisation, - start_date='2015-06-04' - ) + def _testEventDetail(self): + with transaction.atomic(), reversion.create_revision(): + person = models.Person(name="Event Detail Person", email="eventdetail@person.tests.rigs", phone="123 123") + person.save() + with transaction.atomic(), reversion.create_revision(): + organisation = models.Organisation(name="Event Detail Organisation", email="eventdetail@organisation.tests.rigs", phone="123 456").save() + with transaction.atomic(), reversion.create_revision(): + venue = models.Venue(name="Event Detail Venue").save() + with transaction.atomic(), reversion.create_revision(): + event = models.Event( + name="Detail Test", + description="This is an event to test the detail view", + notes="It is going to be aweful", + person=person, + organisation=organisation, + start_date='2015-06-04' + ) event.save() - item1 = models.EventItem( - event=event, - name="Detail Item 1", - cost="10.00", - quantity="1", - order=1 - ).save() - item2 = models.EventItem( - event=event, - name="Detail Item 2", - description="Foo", - cost="9.72", - quantity="3", - order=2, - ).save() + with transaction.atomic(), reversion.create_revision(): + item1 = models.EventItem( + event=event, + name="Detail Item 1", + cost="10.00", + quantity="1", + order=1 + ).save() + item2 = models.EventItem( + event=event, + name="Detail Item 2", + description="Foo", + cost="9.72", + quantity="3", + order=2, + ).save() self.browser.get(self.live_server_url + '/event/%d'%event.pk) + self.authenticate('/event/%d/'%event.pk) + self.assertIn("N%05d | %s"%(event.pk, event.name), self.browser.find_element_by_xpath('//h1').text) + + personPanel = self.browser.find_element_by_xpath('//div[contains(text(), "Contact Details")]/..') + self.assertEqual(person.name, personPanel.find_element_by_xpath('//dt[text()="Person"]/following-sibling::dd[1]').text) + self.assertEqual(person.email, personPanel.find_element_by_xpath('//dt[text()="Email"]/following-sibling::dd[1]').text) + self.assertEqual(person.phone, personPanel.find_element_by_xpath('//dt[text()="Phone Number"]/following-sibling::dd[1]').text) + + organisationPanel = self.browser.find_element_by_xpath('//div[contains(text(), "Contact Details")]/..') From e96b36e533c01fd294a45d7b57c4fb5f924ecfb7 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 28 Jun 2015 16:40:22 +0100 Subject: [PATCH 34/36] Fixed registration test --- RIGS/test_functional.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index e446d17e..bbff140b 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -101,16 +101,16 @@ class UserRegistrationTest(LiveServerTestCase): email = mail.outbox[0] self.assertIn('activation required', email.subject) urls = re.findall( - 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.message) - self.assertEqual(len(urls), 2) + 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', email.body) + self.assertEqual(len(urls), 1) mail.outbox = [] # empty this for later # Follow link - self.browser.get(urls[1]) # go to the second link + self.browser.get(urls[0]) # go to the first link # Complete registration - title_text = self.browser.find_element_by_tag_name('h2') + title_text = self.browser.find_element_by_tag_name('h2').text self.assertIn('Complete', title_text) # Test login @@ -123,12 +123,12 @@ class UserRegistrationTest(LiveServerTestCase): username.send_keys('TestUsername') password.send_keys('correcthorsebatterystaple') - password.send_keys(Keys.ENTER) self.browser.execute_script( "return jQuery('#g-recaptcha-response').val('PASSED')") + password.send_keys(Keys.ENTER) # Check we are logged in - udd = self.browser.find_element_by_id('userdropdown') + udd = self.browser.find_element_by_class_name('navbar').text self.assertIn('Hi John', udd) # All is well From 65a8b43dbf56b0930fdd683482005f0e5cbf9efd Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 28 Jun 2015 18:44:32 +0100 Subject: [PATCH 35/36] Fix testRigCreate (wait for animations) --- RIGS/test_functional.py | 43 +++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index bbff140b..24d0a4f2 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -4,6 +4,7 @@ from django.core import mail from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import StaleElementReferenceException +from selenium.webdriver.support.ui import WebDriverWait from RIGS import models import re import os @@ -186,7 +187,12 @@ class EventTest(LiveServerTestCase): # Gets redirected to login and back self.authenticate('/event/create/') - # Check has slided up correctly - third save button hidden + wait = WebDriverWait(self.browser, 10) #setup WebDriverWait to use later (to wait for animations) + self.browser.implicitly_wait(3) #Set session-long wait (only works for non-existant DOM objects) + + wait.until(animation_is_finished()) + + # Check has slided up correctly - second save button hidden save = self.browser.find_element_by_xpath( '(//button[@type="submit"])[3]') self.assertFalse(save.is_displayed()) @@ -205,7 +211,7 @@ class EventTest(LiveServerTestCase): # See modal has opened modal = self.browser.find_element_by_id('modal') - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertTrue(modal.is_displayed()) self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) @@ -214,7 +220,7 @@ class EventTest(LiveServerTestCase): '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 1") modal.find_element_by_xpath( '//div[@id="modal"]//input[@type="submit"]').click() - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertFalse(modal.is_displayed()) # See new person selected @@ -229,7 +235,7 @@ class EventTest(LiveServerTestCase): # Change mind and add another add_person_button.click() - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertTrue(modal.is_displayed()) self.assertIn("Add Person", modal.find_element_by_tag_name('h3').text) @@ -237,7 +243,7 @@ class EventTest(LiveServerTestCase): '//div[@id="modal"]//input[@id="id_name"]').send_keys("Test Person 2") modal.find_element_by_xpath( '//div[@id="modal"]//input[@type="submit"]').click() - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertFalse(modal.is_displayed()) person2 = models.Person.objects.get(name="Test Person 2") @@ -265,7 +271,7 @@ class EventTest(LiveServerTestCase): # Edit Person 1 to have a better name form.find_element_by_xpath( '//a[@data-target="#id_person" and contains(@href, "%s/edit/")]' % person1.pk).click() - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertTrue(modal.is_displayed()) self.assertIn("Edit Person", modal.find_element_by_tag_name('h3').text) name = modal.find_element_by_xpath( @@ -274,7 +280,9 @@ class EventTest(LiveServerTestCase): name.clear() name.send_keys('Rig ' + person1.name) name.send_keys(Keys.ENTER) - self.browser.implicitly_wait(3) + + wait.until(animation_is_finished()) + self.assertFalse(modal.is_displayed()) person1 = models.Person.objects.get(pk=person1.pk) self.assertEqual(person1.name, form.find_element_by_xpath( @@ -285,7 +293,7 @@ class EventTest(LiveServerTestCase): '//a[@data-target="#id_organisation" and contains(@href, "add")]') add_button.click() modal = self.browser.find_element_by_id('modal') - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertTrue(modal.is_displayed()) self.assertIn("Add Organisation", modal.find_element_by_tag_name('h3').text) modal.find_element_by_xpath( @@ -294,7 +302,7 @@ class EventTest(LiveServerTestCase): '//div[@id="modal"]//input[@type="submit"]').click() # See it is selected - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertFalse(modal.is_displayed()) obj = models.Organisation.objects.get(name="Test Organisation") self.assertEqual(obj.name, form.find_element_by_xpath( @@ -309,7 +317,7 @@ class EventTest(LiveServerTestCase): '//a[@data-target="#id_venue" and contains(@href, "add")]') add_button.click() modal = self.browser.find_element_by_id('modal') - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertTrue(modal.is_displayed()) self.assertIn("Add Venue", modal.find_element_by_tag_name('h3').text) modal.find_element_by_xpath( @@ -318,7 +326,7 @@ class EventTest(LiveServerTestCase): '//div[@id="modal"]//input[@type="submit"]').click() # See it is selected - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) self.assertFalse(modal.is_displayed()) obj = models.Venue.objects.get(name="Test Venue") self.assertEqual(obj.name, form.find_element_by_xpath( @@ -338,7 +346,7 @@ class EventTest(LiveServerTestCase): # Add item form.find_element_by_xpath('//button[contains(@class, "item-add")]').click() - self.browser.implicitly_wait(3) + wait.until(animation_is_finished()) modal = self.browser.find_element_by_id("itemModal") modal.find_element_by_id("item_name").send_keys("Test Item 1") modal.find_element_by_id("item_description").send_keys("This is an item description\nthat for reasons unkown spans two lines") @@ -450,3 +458,14 @@ class EventTest(LiveServerTestCase): self.assertEqual(person.phone, personPanel.find_element_by_xpath('//dt[text()="Phone Number"]/following-sibling::dd[1]').text) organisationPanel = self.browser.find_element_by_xpath('//div[contains(text(), "Contact Details")]/..') + + +class animation_is_finished(object): + """ Checks if animation is done """ + def __init__(self): + pass + + def __call__(self, driver): + numberAnimating = driver.execute_script('return $(":animated").length') + finished = numberAnimating == 0 + return finished \ No newline at end of file From 8ee76a9a7596b9b3d4ae52b972f77fca192e2278 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Sun, 28 Jun 2015 19:02:18 +0100 Subject: [PATCH 36/36] Fixed testEventDetail --- RIGS/models.py | 27 ++++++++++++++++++--------- RIGS/test_functional.py | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/RIGS/models.py b/RIGS/models.py index a72255b3..6c4c9c9c 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -53,14 +53,21 @@ class Profile(AbstractUser): class RevisionMixin(object): @property def last_edited_at(self): - version = reversion.get_for_object(self)[0] - return version.revision.date_created + versions = reversion.get_for_object(self) + if versions: + version = reversion.get_for_object(self)[0] + return version.revision.date_created + else: + return None @property def last_edited_by(self): - version = reversion.get_for_object(self)[0] - return version.revision.user - + versions = reversion.get_for_object(self) + if versions: + version = reversion.get_for_object(self)[0] + return version.revision.user + else: + return None @reversion.register @python_2_unicode_compatible @@ -75,8 +82,9 @@ class Person(models.Model, RevisionMixin): def __str__(self): string = self.name - if len(self.notes) > 0: - string += "*" + if self.notes is not None: + if len(self.notes) > 0: + string += "*" return string @property @@ -114,8 +122,9 @@ class Organisation(models.Model, RevisionMixin): def __str__(self): string = self.name - if len(self.notes) > 0: - string += "*" + if self.notes is not None: + if len(self.notes) > 0: + string += "*" return string @property diff --git a/RIGS/test_functional.py b/RIGS/test_functional.py index 24d0a4f2..c9b5c906 100644 --- a/RIGS/test_functional.py +++ b/RIGS/test_functional.py @@ -412,7 +412,7 @@ class EventTest(LiveServerTestCase): event = models.Event.objects.get(name='Test Event Name') self.assertIn("N0000%d | Test Event Name"%event.pk, self.browser.find_element_by_xpath('//h1').text) - def _testEventDetail(self): + def testEventDetail(self): with transaction.atomic(), reversion.create_revision(): person = models.Person(name="Event Detail Person", email="eventdetail@person.tests.rigs", phone="123 123") person.save()