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 @@
- +

+ +

- +

+ +