From 112f0e0ab239d2fc8de65695ab3c3d310cae94eb Mon Sep 17 00:00:00 2001 From: dandds Date: Fri, 13 Sep 2019 11:08:50 -0400 Subject: [PATCH] Initial JS tests for the Vue TOForm component. This adds BeautifulSoup to the Python dev dependencies so that we can render an entire page and then extract the Vue component we need. Ideally, we should refactor all the Vue components so that they live in Jinja macros and we can render those macros directly. --- .secrets.baseline | 4 +- Pipfile | 1 + Pipfile.lock | 136 ++++--- js/components/date_selector.js | 2 +- js/components/forms/__tests__/to_form.test.js | 67 ++++ .../checkbox_input_template.html | 4 +- js/test_templates/to_form.html | 341 ++++++++++++++++++ .../upload_input_error_template.html | 4 +- js/test_templates/upload_input_template.html | 4 +- templates/task_orders/step_3.html | 1 + tests/render_vue_component.py | 42 ++- 11 files changed, 538 insertions(+), 68 deletions(-) create mode 100644 js/components/forms/__tests__/to_form.test.js create mode 100644 js/test_templates/to_form.html diff --git a/.secrets.baseline b/.secrets.baseline index b8c620f6..e6096961 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -3,7 +3,7 @@ "files": "^.secrets.baseline$", "lines": null }, - "generated_at": "2019-09-13T17:44:56Z", + "generated_at": "2019-09-20T19:20:43Z", "plugins_used": [ { "base64_limit": 4.5, @@ -199,5 +199,5 @@ } ] }, - "version": "0.12.5" + "version": "0.12.6" } diff --git a/Pipfile b/Pipfile index a84969ea..9141edf7 100644 --- a/Pipfile +++ b/Pipfile @@ -44,6 +44,7 @@ honcho = "*" blinker = "*" pytest-mock = "*" detect-secrets = "*" +beautifulsoup4 = "*" [requires] python_version = "3.7.3" diff --git a/Pipfile.lock b/Pipfile.lock index a3a72fdb..168163da 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "bf3b598c052193f70249da97ac746bc53aeb72f45a4515e10945a4274aba7b18" + "sha256": "8eb62f8620ec951cbef680341d18a184e9661cd28e4c3761e9679dc840fd1888" }, "pipfile-spec": 6, "requires": { @@ -18,10 +18,10 @@ "default": { "alembic": { "hashes": [ - "sha256:4a4811119efbdc5259d1f4c8f6de977b36ad3bcc919f59a29c2960c5ef9149e4" + "sha256:5609afbb2ab142a991b15ae436347c475f8a517f1610f2fd1b09cdca7c311f3f" ], "index": "pypi", - "version": "==1.1.0" + "version": "==1.2.0" }, "amqp": { "hashes": [ @@ -32,11 +32,11 @@ }, "apache-libcloud": { "hashes": [ - "sha256:8f133038710257d39f9092ccaea694e31f7f4fe02c11d7fcc2674bc60a9448b6", - "sha256:d876f8c4d8aecf32f41f3a4d6ed1cebdf33b8b8f73df0aebc5280789fa806c60" + "sha256:201751f738109f25d58dcdfb5804e17216e0dc8f68b522e9e26ac16e0b9ff2ea", + "sha256:40215db1bd489d17dc1abfdb289d7f035313c7297b6a7462c79d8287cbbeae91" ], "index": "pypi", - "version": "==2.5.0" + "version": "==2.6.0" }, "asn1crypto": { "hashes": [ @@ -85,18 +85,18 @@ }, "boto3": { "hashes": [ - "sha256:366a1f3ec37b9434f25247cbe876f9ca1b53d35e35af18f74c735445100b4bc4", - "sha256:e7718b48cd073ad59a99a33d14252319dfaf550be3682b0c6a58da052fb05fcc" + "sha256:0e4d047feb4d7d701e9b2107f10bb8d674952243385cd35d0b413a273c299751", + "sha256:67f957389cf56fb4c24c1093c6d58baebe6cf18139f6dca0f8a177239b0a4f8c" ], "index": "pypi", - "version": "==1.9.217" + "version": "==1.9.232" }, "botocore": { "hashes": [ - "sha256:68a0a22ca4e0e7e7ab482f63e21debfe402841fc49b8503dec0a7307b565d774", - "sha256:7a213b876e58b1b5380cf30faa05ba45073692ad4a3cc803ba763082a36436bb" + "sha256:724d2349198c6f15f3cee0c0e4d33ecf4435e6d0db311bb79a3a28f6cf5a4090", + "sha256:a57a8fd0145c68e31bb4baab549b27a12f6695068c8dd5f2901d8dc06572dbeb" ], - "version": "==1.12.217" + "version": "==1.12.232" }, "celery": { "hashes": [ @@ -108,10 +108,10 @@ }, "certifi": { "hashes": [ - "sha256:046832c04d4e752f37383b628bc601a7ea7211496b4638f6514d0e5b9acc4939", - "sha256:945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695" + "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", + "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" ], - "version": "==2019.6.16" + "version": "==2019.9.11" }, "cffi": { "hashes": [ @@ -237,10 +237,10 @@ }, "importlib-metadata": { "hashes": [ - "sha256:23d3d873e008a513952355379d93cbcab874c58f4f034ff657c7a87422fa64e8", - "sha256:80d2de76188eabfbfcf27e6a37342c2827801e59c4cc14b0371c56fed43820e3" + "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", + "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" ], - "version": "==0.19" + "version": "==0.23" }, "itsdangerous": { "hashes": [ @@ -409,10 +409,10 @@ }, "pytzdata": { "hashes": [ - "sha256:c0c8316eaf6c25ba45816390a1a45c39790767069b3275c5f7de3ddf773eb810", - "sha256:e8a91952afd853642a49f0713caac3e15a5306855ff4a47af4ddec5b7dd23a09" + "sha256:84c52b9a47d097fcd483f047a544979de6c3a86e94c845e3569e9f8acd0fa071", + "sha256:fac06f7cdfa903188dc4848c655e4adaee67ee0f2fe08e7daf815cf2a761ee5e" ], - "version": "==2019.2" + "version": "==2019.3" }, "pyyaml": { "hashes": [ @@ -480,11 +480,11 @@ }, "urllib3": { "hashes": [ - "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", - "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" + "sha256:2f3eadfea5d92bc7899e75b5968410b749a054b492d5a6379c1344a1481bc2cb", + "sha256:9c6c593cb28f52075016307fc26b0a0f8e82bc7d1ff19aaaa959b91710a56c47" ], "markers": "python_version >= '3.4'", - "version": "==1.25.3" + "version": "==1.25.5" }, "vine": { "hashes": [ @@ -502,11 +502,11 @@ }, "werkzeug": { "hashes": [ - "sha256:87ae4e5b5366da2347eb3116c0e6c681a0e939a33b2805e2c0cbd282664932c4", - "sha256:a13b74dd3c45f758d4ebdb224be8f1ab8ef58b3c0ffc1783a8c7d9f4f50227e6" + "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7", + "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4" ], "index": "pypi", - "version": "==0.15.5" + "version": "==0.16.0" }, "wtforms": { "hashes": [ @@ -582,6 +582,15 @@ "index": "pypi", "version": "==1.6.2" }, + "beautifulsoup4": { + "hashes": [ + "sha256:05668158c7b85b791c5abde53e50265e16f98ad601c402ba44d70f96c4159612", + "sha256:25288c9e176f354bf277c0a10aa96c782a6a18a17122dba2e8cec4a97e03343b", + "sha256:f040590be10520f2ea4c2ae8c3dae441c7cfff5308ec9d58a0ec0c1b8f81d469" + ], + "index": "pypi", + "version": "==4.8.0" + }, "black": { "hashes": [ "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf", @@ -599,10 +608,10 @@ }, "certifi": { "hashes": [ - "sha256:046832c04d4e752f37383b628bc601a7ea7211496b4638f6514d0e5b9acc4939", - "sha256:945e3ba63a0b9f577b1395204e13c3a231f9bc0223888be653286534e5873695" + "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", + "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" ], - "version": "==2019.6.16" + "version": "==2019.9.11" }, "chardet": { "hashes": [ @@ -666,11 +675,11 @@ }, "detect-secrets": { "hashes": [ - "sha256:33593cbf7099ced595e7371fcee31c815a237419de2869d571bbdb651a125d4c", - "sha256:7b8e6d521f5a164ff17dbe3d2691eb85f842133d4e6bb7a23eeb461a0ab4e215" + "sha256:7e1820a3c4ac412a7a2cec13075c274ae4bfc9167b4b831ad3c7f0e6208c9488", + "sha256:bacb5842f149f39799409039fafb1902554ac0c71a9764cc8a8ffab85f99efc1" ], "index": "pypi", - "version": "==0.12.5" + "version": "==0.12.6" }, "docopt": { "hashes": [ @@ -688,10 +697,10 @@ }, "faker": { "hashes": [ - "sha256:1d3f700e8dfcefd6e657118d71405d53e86974448aba78884f119bbd84c0cddf", - "sha256:d5366e120191c5610fceeebfe1c298dc46da0277096f639c6dd7e2eaee0fa547" + "sha256:45cc9cca3de8beba5a2da3bd82a6e5544f53da1a702645c8485f682366c15026", + "sha256:a6459ff518d1fc6ee2238a7209e6c899517872c7e1115510279033ffe6fe8ef3" ], - "version": "==2.0.1" + "version": "==2.0.2" }, "flask": { "hashes": [ @@ -732,10 +741,10 @@ }, "importlib-metadata": { "hashes": [ - "sha256:23d3d873e008a513952355379d93cbcab874c58f4f034ff657c7a87422fa64e8", - "sha256:80d2de76188eabfbfcf27e6a37342c2827801e59c4cc14b0371c56fed43820e3" + "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", + "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" ], - "version": "==0.19" + "version": "==0.23" }, "ipdb": { "hashes": [ @@ -746,11 +755,11 @@ }, "ipython": { "hashes": [ - "sha256:1d3a1692921e932751bc1a1f7bb96dc38671eeefdc66ed33ee4cbc57e92a410e", - "sha256:537cd0176ff6abd06ef3e23f2d0c4c2c8a4d9277b7451544c6cbf56d1c79a83d" + "sha256:c4ab005921641e40a68e405e286e7a1fcc464497e14d81b6914b4fd95e5dee9b", + "sha256:dd76831f065f17bddd7eaa5c781f5ea32de5ef217592cf019e34043b56895aa1" ], "index": "pypi", - "version": "==7.7.0" + "version": "==7.8.0" }, "ipython-genutils": { "hashes": [ @@ -872,10 +881,10 @@ }, "pbr": { "hashes": [ - "sha256:56e52299170b9492513c64be44736d27a512fa7e606f21942160b68ce510b4bc", - "sha256:9b321c204a88d8ab5082699469f52cc94c5da45c51f114113d01b3d993c24cdf" + "sha256:2c8e420cd4ed4cec4e7999ee47409e876af575d4c35a45840d59e8b5f3155ab8", + "sha256:b32c8ccaac7b1a20c0ce00ce317642e6cf231cf038f9875e0280e28af5bf7ac9" ], - "version": "==5.4.2" + "version": "==5.4.3" }, "pexpect": { "hashes": [ @@ -894,10 +903,10 @@ }, "pluggy": { "hashes": [ - "sha256:0825a152ac059776623854c1543d65a4ad408eb3d33ee114dff91e57ec6ae6fc", - "sha256:b9817417e95936bf75d85d3f8767f7df6cdde751fc40aed3bb3074cbcb77757c" + "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", + "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" ], - "version": "==0.12.0" + "version": "==0.13.0" }, "prompt-toolkit": { "hashes": [ @@ -1039,19 +1048,26 @@ ], "version": "==2.0.5" }, + "soupsieve": { + "hashes": [ + "sha256:8662843366b8d8779dec4e2f921bebec9afd856a5ff2e82cd419acc5054a1a92", + "sha256:a5a6166b4767725fd52ae55fee8c8b6137d9a51e9f1edea461a062a759160118" + ], + "version": "==1.9.3" + }, "stevedore": { "hashes": [ - "sha256:7be098ff53d87f23d798a7ce7ae5c31f094f3deb92ba18059b1aeb1ca9fec0a0", - "sha256:7d1ce610a87d26f53c087da61f06f9b7f7e552efad2a7f6d2322632b5f932ea2" + "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730", + "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14" ], - "version": "==1.30.1" + "version": "==1.31.0" }, "text-unidecode": { "hashes": [ - "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", - "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" + "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", + "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" ], - "version": "==1.2" + "version": "==1.3" }, "toml": { "hashes": [ @@ -1090,11 +1106,11 @@ }, "urllib3": { "hashes": [ - "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", - "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" + "sha256:2f3eadfea5d92bc7899e75b5968410b749a054b492d5a6379c1344a1481bc2cb", + "sha256:9c6c593cb28f52075016307fc26b0a0f8e82bc7d1ff19aaaa959b91710a56c47" ], "markers": "python_version >= '3.4'", - "version": "==1.25.3" + "version": "==1.25.5" }, "watchdog": { "hashes": [ @@ -1111,11 +1127,11 @@ }, "werkzeug": { "hashes": [ - "sha256:87ae4e5b5366da2347eb3116c0e6c681a0e939a33b2805e2c0cbd282664932c4", - "sha256:a13b74dd3c45f758d4ebdb224be8f1ab8ef58b3c0ffc1783a8c7d9f4f50227e6" + "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7", + "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4" ], "index": "pypi", - "version": "==0.15.5" + "version": "==0.16.0" }, "wrapt": { "hashes": [ diff --git a/js/components/date_selector.js b/js/components/date_selector.js index 311d5514..646cc6c5 100644 --- a/js/components/date_selector.js +++ b/js/components/date_selector.js @@ -172,7 +172,7 @@ export default { }, _emitChange: function(name, value, valid) { - emitEvent('field-change', this, { value, name }) + emitEvent('field-change', this, { value, name, valid }) }, }, diff --git a/js/components/forms/__tests__/to_form.test.js b/js/components/forms/__tests__/to_form.test.js new file mode 100644 index 00000000..eb636340 --- /dev/null +++ b/js/components/forms/__tests__/to_form.test.js @@ -0,0 +1,67 @@ +import { mount } from '@vue/test-utils' + +import toForm from '../to_form' +import clinFields from '../../clin_fields' + +import { makeTestWrapper } from '../../../test_utils/component_test_helpers' + +const TOFormWrapper = makeTestWrapper({ + components: { toForm }, + templatePath: 'to_form.html', +}) + +describe('TOForm Test', () => { + it('should allow users to add new CLINs', () => { + const wrapper = mount(TOFormWrapper, { + propsData: { + initialData: {}, + }, + }) + expect(wrapper.findAll(clinFields).length).toBe(1) + wrapper.find('#add-clin').trigger('click') + expect(wrapper.findAll(clinFields).length).toBe(2) + }) + + it('should not enable the save button until the form is complete and valid', () => { + const wrapper = mount(TOFormWrapper, { + propsData: { + initialData: {}, + }, + }) + + const submit = wrapper.find('input[type=submit]') + function expectSubmitIsDisabled() { + expect(submit.attributes('disabled')).toEqual('disabled') + } + expectSubmitIsDisabled() + + // begin filling in the form; check at every submit button is disabled + wrapper.find('input#clins-0-number').setValue('0001') + expectSubmitIsDisabled() + wrapper.find('input#clins-0-obligated_amount').setValue('50000') + expectSubmitIsDisabled() + wrapper.find('input#clins-0-total_amount').setValue('60000') + expectSubmitIsDisabled() + wrapper.findAll('input[name="date-month"]').setValue('12') + expectSubmitIsDisabled() + wrapper.findAll('input[name="date-day"]').setValue('01') + expectSubmitIsDisabled() + wrapper + .findAll('input[name="date-year"]') + .at(0) + .setValue('2020') + expectSubmitIsDisabled() + wrapper + .findAll('input[name="date-year"]') + .at(1) + .setValue('2021') + expectSubmitIsDisabled() + // need to trigger the change function on the hidden date inputs so that + // the corresponding event fires to notify the parent form that it is valid + wrapper.find('input[name="clins-0-start_date"]').trigger('change') + wrapper.find('input[name="clins-0-end_date"]').trigger('change') + + // check save button is enabled + expect(submit.attributes('disabled')).toBeUndefined() + }) +}) diff --git a/js/test_templates/checkbox_input_template.html b/js/test_templates/checkbox_input_template.html index f5dd7474..ce847845 100644 --- a/js/test_templates/checkbox_input_template.html +++ b/js/test_templates/checkbox_input_template.html @@ -3,9 +3,10 @@ inline-template key='datafield' v-bind:initial-checked='initialvalue' + v-bind:optional=false >
-
+
@@ -16,6 +17,5 @@
-
\ No newline at end of file diff --git a/js/test_templates/to_form.html b/js/test_templates/to_form.html new file mode 100644 index 00000000..00a327d2 --- /dev/null +++ b/js/test_templates/to_form.html @@ -0,0 +1,341 @@ + +
+
+
+
+

Add Task Order (step 3 of 5)

+
+ +
+
+
+ +
+
+
+
+
+ Enter Contract Line Items +
+

+Task Order Number: 1234567890123 +

+

+ Refer to your task order to locate your Contract Line Item Numbers (CLINs). +

+
+
+ +
+
+ + +
+
+
+
+ CLIN Details +
+
+
+
+ +
+ + + + + + +
+
+
+
+
+
+ +
+
+ +
+ Corresponding IDIQ CLIN +
+
+ +
+
+
+
+
+
+
+
+ CLIN Funding +
+
+
+
+ +
+ + + + + + + +
+
+
+
+
+
+ +
+ + + + + + + +
+
+
+
+
Percent Obligated
+

+
+
+
+ Period of Performance +
+
+
+
+ +
+ +
+ Start Date +
+

+ For example: 07 04 1776 +

+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+
+ +
+ +
+ End Date +
+ +

+ For example: 07 04 1776 +

+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+
+

+
+
+
+
+ +
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/js/test_templates/upload_input_error_template.html b/js/test_templates/upload_input_error_template.html index 1420fe17..13e3a262 100644 --- a/js/test_templates/upload_input_error_template.html +++ b/js/test_templates/upload_input_error_template.html @@ -18,7 +18,9 @@
- +

+ +

- +

+ +