diff --git a/app_homepage/__pycache__/models.cpython-37.pyc b/app_homepage/__pycache__/models.cpython-37.pyc index 3869d445de8560a569c1afb19fa0425663d192b1..03d012f4a9ceb0c1e8cbc9a817275a58a0fdd430 100644 Binary files a/app_homepage/__pycache__/models.cpython-37.pyc and b/app_homepage/__pycache__/models.cpython-37.pyc differ diff --git a/app_homepage/__pycache__/tests.cpython-37.pyc b/app_homepage/__pycache__/tests.cpython-37.pyc index dd513e03a93317ad2baee47f1f210ac2fab1dbbe..3af5b760dc98e6f7b9a54d5cb312ba6336d842af 100644 Binary files a/app_homepage/__pycache__/tests.cpython-37.pyc and b/app_homepage/__pycache__/tests.cpython-37.pyc differ diff --git a/app_homepage/migrations/0001_initial.py b/app_homepage/migrations/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..d1f51bd1ee363cab3b08f10a81548700391952a2 --- /dev/null +++ b/app_homepage/migrations/0001_initial.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.1 on 2019-09-25 09:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + ] diff --git a/app_homepage/migrations/0002_item_text.py b/app_homepage/migrations/0002_item_text.py new file mode 100644 index 0000000000000000000000000000000000000000..02183b85d7d41369b1f189e0e4c0d3b8525637cd --- /dev/null +++ b/app_homepage/migrations/0002_item_text.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.1 on 2019-09-25 09:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app_homepage', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='text', + field=models.TextField(default=''), + ), + ] diff --git a/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc b/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5acc0a56ef65389525d30d7e52d9f699069fd1b Binary files /dev/null and b/app_homepage/migrations/__pycache__/0001_initial.cpython-37.pyc differ diff --git a/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc b/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e56f938c3ab9594f126b02e8c5b9e6d8d64656fe Binary files /dev/null and b/app_homepage/migrations/__pycache__/0002_item_text.cpython-37.pyc differ diff --git a/app_homepage/models.py b/app_homepage/models.py index 71a836239075aa6e6e4ecb700e9c42c95c022d91..23391689c46e637c88b2f487e5a43f44dbe3faa8 100644 --- a/app_homepage/models.py +++ b/app_homepage/models.py @@ -1,3 +1,4 @@ from django.db import models -# Create your models here. +class Item(models.Model): + text = models.TextField(default = '') diff --git a/app_homepage/tests.py b/app_homepage/tests.py index f798f5def2e6bd9bf1f75feebc594c3b6f065df4..7e88a004a2c69cb68b524ff39b91d10d685a0d5b 100644 --- a/app_homepage/tests.py +++ b/app_homepage/tests.py @@ -2,6 +2,7 @@ from django.test import TestCase from django.urls import resolve from django.http import HttpRequest from .views import home_page +from .models import Item from django.template.loader import render_to_string # Create your tests here. @@ -15,4 +16,23 @@ class HomePageTest(TestCase): response = self.client.post('/', data={'item_text':'A new list item'}) self.assertIn('A new list item', response.content.decode()) self.assertTemplateUsed(response, 'app/home.html') + +class ItemModelTest(TestCase): + + def test_saving_and_retrieving_items(self): + first_item = Item() + first_item.text = 'The first (ever) list item' + first_item.save() + + second_item = Item() + second_item.text = 'Item the second' + second_item.save() + + saved_items = Item.objects.all() + self.assertEqual(saved_items.count(), 2) + + first_saved_item = saved_items[0] + second_saved_item = saved_items[1] + self.assertEqual(first_saved_item.text, 'The first (ever) list item') + self.assertEqual(second_saved_item.text, 'Item the second') \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..84a97d59846267e90d4d32eb9caeb5944b75d86f 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/functional_test.py b/functional_test.py index 82f6057d270fe8d90819ad5673487524b925497a..c6268c40c1ea0305f3c4f5925d7fcf173d61e28e 100644 --- a/functional_test.py +++ b/functional_test.py @@ -11,6 +11,11 @@ class NewVisitorTest(unittest.TestCase): def tearDown(self): self.browser.quit() + def check_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') + self.assertIn(row_text, [row_text for row in rows]) + def test_can_start_a_list_and_retrieve_it_later(self): # Edith has heard about a cool new online to-do app. She goes # to check out its homepage @@ -21,6 +26,11 @@ class NewVisitorTest(unittest.TestCase): header_text = self.browser.find_element_by_tag_name('h1').text self.assertIn('To-Do', header_text) + inputbox = self.browser.find_element_by_id('id_new_item') + inputbox.send_keys(Keys.ENTER) + time.sleep(1) + # The page updates again, and now shows both items on her list + self.check_for_row_in_list_table('1: Buy peacock feathers') # She is invited to enter a to-do item straight away # There is still a text box inviting her to add another item. She # enters "Use peacock feathers to make a fly" (Edith is very @@ -31,13 +41,17 @@ class NewVisitorTest(unittest.TestCase): time.sleep(1) # The page updates again, and now shows both items on her list - table = self.browser.find_element_by_id('id_list_table') - rows = table.find_elements_by_tag_name('tr') - self.assertIn('1: Buy peacock feathers', [row.text for row in rows]) - self.assertIn( - '2: Use peacock feathers to make a fly', - [row.text for row in rows] - ) + self.check_for_row_in_list_table('1: Buy peacock feathers') + self.check_for_row_in_list_table('2: Use peacock feathers to make a fly') + + # The page updates again, and now shows both items on her list + # table = self.browser.find_element_by_id('id_list_table') + # rows = table.find_elements_by_tag_name('tr') + # self.assertIn('1: Buy peacock feathers', [row.text for row in rows]) + # self.assertIn( + # '2: Use peacock feathers to make a fly', + # [row.text for row in rows] + # ) # Edith wonders whether the site will remember her list. Then she sees # that the site has generated a unique URL for her -- there is some diff --git a/geckodriver.log b/geckodriver.log index 5f7171acbb73c06ed4a3c3eebacbffc0ca037bb0..50662d2aa1603896dc837fb2b02a50798505001a 100644 --- a/geckodriver.log +++ b/geckodriver.log @@ -520,3 +520,61 @@ JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't fin [Child 11912, Chrome_ChJavaScript error: resource://gre/modules/ExtensionSettingsStore.jsm, line 117: Error: The ExtensionSettingsStore was accessed before the initialize promise resolved. console.error: (new Error("Transaction canceled due to a closed connection.", "resource://gre/modules/Sqlite.jsm", 613)) console.error: (new Error("Transaction canceled due to a closed connection.", "resource://gre/modules/Sqlite.jsm", 613)) +1569290323575 mozrunner::runner INFO Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofileYP5ql9" +1569290324406 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons +1569290324406 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry +1569290324406 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/ +1569290324407 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader* +JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory. +1569290327278 Marionette INFO Listening on port 56936 +1569290327401 Marionette WARN TLS certificate errors will be ignored for this session +1569290328922 Marionette INFO Stopped listening on port 56936 +JavaScript error: resource://activity-stream/lib/ActivityStreamPrefs.jsm, line 27: NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIPrefBranch.removeObserver] +[Child 19360, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 19360, Chrome_ChildThread] WARNING[Child 6428, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 6428, Chrome_ChildThread] WARNING: pipe e[Parent 7632, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 13208, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 13208, Chrome_C +###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost + +[G +###!!! [Child][MessageChannel::SendAndWait] Error: Channel error: cannot send/recv + +1569290599845 mozrunner::runner INFO Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofile3vJRSq" +1569290600768 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons +1569290600768 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry +1569290600768 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/ +1569290600768 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader* +JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory. +1569290609517 Marionette INFO Listening on port 57003 +1569290609684 Marionette WARN TLS certificate errors will be ignored for this session +1569290610259 Marionette INFO Stopped listening on port 57003 +JavaScript error: resource://activity-stream/lib/ActivityStreamPrefs.jsm, line 27: NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIPrefBranch.removeObserver] +[Child 6[Parent 18116, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 21176, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 21176, Chrome_JavaScript error: resource://gre/modules/ExtensionSettingsStore.jsm, line 117: Error: The ExtensionSettingsStore was accessed before the initialize promise resolved. +JavaScript error: resource://gre/modules/Sqlite.jsm, line 912: Error: Connection is not open. + +###!!! [Parent][DispatchAsyncMessage] Error: PBackgroundIDBFactory::Msg_PBackgroundIDBFactoryRequestConstructor Value error: message was deserialized, but contained an illegal value + +[GPU 9480, Chrome +###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost + +_ +###!!! [Child][MessageChannel::SendAndWait] Error: Channel error: cannot send/recv + +1569290666739 mozrunner::runner INFO Running command: "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\\Users\\YUMNAP~1\\AppData\\Local\\Temp\\rust_mozprofileKddsnv" +1569290667493 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons +1569290667493 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: telemetry +1569290667493 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/ +1569290667493 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader* +JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can't find profile directory. +1569290670921 Marionette INFO Listening on port 57043 +1569290671052 Marionette WARN TLS certificate errors will be ignored for this session +1569290673569 Marionette INFO Stopped listening on port 57043 +[Child 18832, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 18832, Ch[Child 12040, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 12040, Chrome_ChildThread] WARNIJavaScript error: resource://gre/modules/UrlClassifierListManager.jsm, line 680: TypeError: this.tablesData[table] is undefined +[Parent 17632, Gecko_IOThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 18196, Chrome_ChildThread] WARNING: pipe error: 109: file z:/task_1566861941/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 341 +[Child 18196, Chrome_Child \ No newline at end of file