diff --git a/.gitignore b/.gitignore index 1bced8c4d9c9c682eb50c3b45b54510c7ca506a6..ce8b0e10a2c3c58b755b75608ab31806beb016e3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,8 @@ __pycache__ *.pyc chromedriver.exe /static +.coverage +.coverage.* +coverage.xml +accounts/tests/__pycache__/* +lists/tests/__pycache__/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f39ac0322d6ea6e864d5e0af0f4de43a01d30208..42a43bb10a914214539bdd7116756f53e56e6c98 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,6 +14,8 @@ lists: - python3 manage.py migrate - python3 manage.py collectstatic --no-input script: + - coverage run --source=lists manage.py test lists + - coverage report -m - python3 manage.py test lists accounts: @@ -28,6 +30,8 @@ accounts: - python3 manage.py migrate - python3 manage.py collectstatic --no-input script: + - coverage run --source=accounts manage.py test accounts + - coverage report -m - python3 manage.py test accounts functional_test: @@ -45,4 +49,6 @@ functional_test: - python3 manage.py makemigrations - python3 manage.py migrate script: + - coverage run --source=functional_tests manage.py test functional_tests + - coverage report -m - python3 manage.py test functional_tests diff --git a/functional_tests/base.py b/functional_tests/base.py index 45ca4a1661eff94e497246848d6a9ed334c87416..d65cd9b1b4c66cdce7a542a8750fab07ec330e17 100644 --- a/functional_tests/base.py +++ b/functional_tests/base.py @@ -36,48 +36,16 @@ class FunctionalTest(StaticLiveServerTestCase): def wait_for(self, fn): return fn() - # def wait_for_row_in_list_table(self, row_text): - # start_time = time.time() - # while True: - # try: - # table = self.browser.find_element_by_id('id_list_table') - # rows = table.find_elements_by_tag_name('tr') - # self.assertIn(row_text, [row.text for row in rows]) - # return - # except (AssertionError, WebDriverException) as e: - # if time.time() - start_time > MAX_WAIT: - # raise e - # time.sleep(0.5) - - # def wait_for(self, fn): - # start_time = time.time() - # while True: - # try: - # return fn() - # except (AssertionError, WebDriverException) as e: - # if time.time() - start_time > MAX_WAIT: - # raise e - # time.sleep(0.5) - - # def wait_to_be_logged_in(self, email): - # self.wait_for( - # lambda: self.browser.find_element_by_link_text('Log out') - # ) - # navbar = self.browser.find_element_by_css_selector('.navbar') - # self.assertIn(email, navbar.text) - - - # def wait_to_be_logged_out(self, email): - # self.wait_for( - # lambda: self.browser.find_element_by_name('email') - # ) - # navbar = self.browser.find_element_by_css_selector('.navbar') - # self.assertNotIn(email, navbar.text) - @wait def wait_for_row_in_list_table(self, row_text): table = self.browser.find_element_by_id('id_list_table') - rows = table.find_elements_by_tag_name('tr') + rows = table.find_elements_by_tag_name('td') + self.assertIn(row_text, [row.text for row in rows]) + + @wait + def wait_for_title_in_list_table(self, row_text): + table = self.browser.find_element_by_id('id_list_table') + rows = table.find_elements_by_tag_name('th') self.assertIn(row_text, [row.text for row in rows]) @wait diff --git a/functional_tests/test_layout_and_styling.py b/functional_tests/test_layout_and_styling.py index f64fd1b827b25f2b0737caf00fe12e45c8bd43c8..a8867365b258d1d4b9871129f100c18474561eb3 100644 --- a/functional_tests/test_layout_and_styling.py +++ b/functional_tests/test_layout_and_styling.py @@ -5,6 +5,14 @@ from .base import FunctionalTest class LayoutAndStylingTest(FunctionalTest): + def test_name_in_header_and_footer(self): + self.browser.get(self.live_server_url) + + header = self.browser.find_element_by_id('name_header').text + footer = self.browser.find_element_by_id('name_footer').text + self.assertIn('Aviliani Pramestya', header) + self.assertIn('Aviliani Pramestya', footer) + def test_layout_and_styling(self): # Edith goes to the home page self.browser.get(self.live_server_url) @@ -32,13 +40,13 @@ class LayoutAndStylingTest(FunctionalTest): rows = h1_elem.find_elements_by_tag_name('h1') self.assertIn("sibuk tapi santai", [row.text for row in rows]) - def test_body_contains_name_in_h1(self): - self.browser.get(self.live_server_url) - h1_elem = self.browser.find_element_by_tag_name('h1') - self.assertIn('Aviliani Pramestya', h1_elem.text) + # def test_body_contains_name_in_h1(self): + # self.browser.get(self.live_server_url) + # h1_elem = self.browser.find_element_by_tag_name('h1') + # self.assertIn('Aviliani Pramestya', h1_elem.text) - def test_body_contains_npm_in_h1(self): - self.browser.get(self.live_server_url) - h1_elem = self.browser.find_element_by_tag_name('h2') - self.assertIn('1606829402', h1_elem.text) + # def test_body_contains_npm_in_h1(self): + # self.browser.get(self.live_server_url) + # h1_elem = self.browser.find_element_by_tag_name('h2') + # self.assertIn('1606829402', h1_elem.text) diff --git a/functional_tests/test_list_item_validation.py b/functional_tests/test_list_item_validation.py index ccc0d60b4cb796642cec84408cab333fa552c3a1..bf06a45f54b39e79e6de310426e477e8e88d0f73 100644 --- a/functional_tests/test_list_item_validation.py +++ b/functional_tests/test_list_item_validation.py @@ -21,6 +21,8 @@ class ItemValidationTest(FunctionalTest): # She tries again with some text for the item, which now works self.browser.find_element_by_id('id_new_item').send_keys('Buy milk') self.browser.find_element_by_id('id_new_item').send_keys(Keys.ENTER) + self.wait_for_title_in_list_table("To Do List") + self.wait_for_title_in_list_table("Created at") self.wait_for_row_in_list_table('1: Buy milk') # Perversely, she now decides to submit a second blank list item @@ -35,5 +37,7 @@ class ItemValidationTest(FunctionalTest): # And she can correct it by filling some text in self.browser.find_element_by_id('id_new_item').send_keys('Make tea') self.browser.find_element_by_id('id_new_item').send_keys(Keys.ENTER) + self.wait_for_title_in_list_table("To Do List") + self.wait_for_title_in_list_table("Created at") self.wait_for_row_in_list_table('1: Buy milk') self.wait_for_row_in_list_table('2: Make tea') diff --git a/lists/migrations/0003_item_date.py b/lists/migrations/0003_item_date.py new file mode 100644 index 0000000000000000000000000000000000000000..57e034ad5877d6e3671d873da3001b01016973ed --- /dev/null +++ b/lists/migrations/0003_item_date.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.24 on 2019-12-22 16:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lists', '0002_auto_20191009_1640'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='date', + field=models.TextField(default='22 12 2019 23:04:06'), + ), + ] diff --git a/lists/migrations/0004_auto_20191222_2345.py b/lists/migrations/0004_auto_20191222_2345.py new file mode 100644 index 0000000000000000000000000000000000000000..b042e3dc8be66c8aa70303e64b6d94ead1f9c68c --- /dev/null +++ b/lists/migrations/0004_auto_20191222_2345.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.24 on 2019-12-22 16:45 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lists', '0003_item_date'), + ] + + operations = [ + migrations.AlterField( + model_name='item', + name='date', + field=models.TextField(default='22-12-2019 23:45:18'), + ), + ] diff --git a/lists/models.py b/lists/models.py index 719803c0bc876f60de483249d089139b85e850ef..194e7d25bd81e3a854fee7c3a61990a3e7c4bfa9 100644 --- a/lists/models.py +++ b/lists/models.py @@ -1,4 +1,5 @@ from django.db import models +from datetime import datetime # Create your models here. class List(models.Model): @@ -7,3 +8,4 @@ class List(models.Model): class Item(models.Model): text = models.TextField(default='') list = models.ForeignKey(List, default=None, on_delete=models.CASCADE) + date = models.TextField(default=datetime.now().strftime("%d-%m-%Y %H:%M:%S")) diff --git a/lists/static/base.css b/lists/static/base.css index cc7eb16202b12f281ee16aba0454e4c7fe4e9ddd..f4c148f291458d364a6ebc6f8ddc59d40c03b318 100644 --- a/lists/static/base.css +++ b/lists/static/base.css @@ -1,3 +1,22 @@ #id_new_item { margin-top: 2ex; +} + +#name_header { + font-size: 18px; + font-weight: bold; + text-align: center; + margin-bottom: 20px; +} + +#name_footer { + margin-bottom: 5px; + text-align: center; + font-size: 15px; + font-weight: bold; +} + +.navbar-brand { + font-size: 18px; + font-weight: bold; } \ No newline at end of file diff --git a/lists/templates/base.html b/lists/templates/base.html index 82a3de4f38f32b02149565e0311bf7286ae20270..68008116dff48d9b07f45d74e108c617b12c6b93 100644 --- a/lists/templates/base.html +++ b/lists/templates/base.html @@ -40,6 +40,7 @@ {% csrf_token %} {% endif %} +
Aviliani Pramestya
@@ -59,7 +60,7 @@ -