Merge pull request #527 from GSA/notify-17

get rid of test skips
This commit is contained in:
Kenneth Kehl
2023-05-31 12:12:11 -07:00
committed by GitHub
13 changed files with 495 additions and 352 deletions

176
Pipfile.lock generated
View File

@@ -50,19 +50,19 @@
}, },
"boto3": { "boto3": {
"hashes": [ "hashes": [
"sha256:d47a68a0ca6599e8711c7da670fbac24085d9d50cfb4f761204f154d2b6fae26", "sha256:152def2fcc9854dcc42383d2b53e2ed2c9ccb5ff6cc0f3ada20f1ab54418ede4",
"sha256:f0a78f94a7140b60960898fd86677e4e73cc96bd7f3e5c64fc5cc1818d04c7b8" "sha256:a5d6fdcaec863bc7ad2f8133ff9a926d6f06468b83b5fb631cd90bd33b709c45"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==1.26.138" "version": "==1.26.141"
}, },
"botocore": { "botocore": {
"hashes": [ "hashes": [
"sha256:31edc237088c104f7a05887646bbec31d7459dd2e108fd90cbffa315902817e2", "sha256:b01d156c42765f3f437959e01a8c7f3cb0e29b24aa0b8f373498133408b2e3c7",
"sha256:3d145f30d10a9c712acee48e7ce906c9456bb25fe50d477c9312c702ccfa50d1" "sha256:e86e1633f98838317b9e1b5c874c4d85339b77f6b7e55c2a4d83913f6166f9ad"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==1.29.138" "version": "==1.29.141"
}, },
"cachetools": { "cachetools": {
"hashes": [ "hashes": [
@@ -235,7 +235,7 @@
"sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df",
"sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"
], ],
"markers": "python_version >= '3.7'", "markers": "python_full_version >= '3.7.0'",
"version": "==3.1.0" "version": "==3.1.0"
}, },
"click": { "click": {
@@ -248,60 +248,60 @@
}, },
"coverage": { "coverage": {
"hashes": [ "hashes": [
"sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3", "sha256:004948e296149644d208964300cb3d98affc5211e9e490e9979af4030b0d6473",
"sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a", "sha256:13cde6bb0e58fb67d09e2f373de3899d1d1e866c5a9ff05d93615f2f54fbd2bb",
"sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813", "sha256:1c9e4a5eb1bbc3675ee57bc31f8eea4cd7fb0cbcbe4912cf1cb2bf3b754f4a80",
"sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0", "sha256:2025f913f2edb0272ef15d00b1f335ff8908c921c8eb2013536fcaf61f5a683d",
"sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a", "sha256:25bad4196104761bc26b1dae9b57383826542ec689ff0042f7f4f4dd7a815cba",
"sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd", "sha256:2692306d3d4cb32d2cceed1e47cebd6b1d2565c993d6d2eda8e6e6adf53301e6",
"sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139", "sha256:272ab31228a9df857ab5df5d67936d8861464dc89c5d3fab35132626e9369379",
"sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b", "sha256:2e8c0e79820cdd67978e1120983786422d279e07a381dbf89d03bbb23ec670a6",
"sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252", "sha256:3062fd5c62df988cea9f2972c593f77fed1182bfddc5a3b12b1e606cb7aba99e",
"sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790", "sha256:3436927d1794fa6763b89b60c896f9e3bd53212001026ebc9080d23f0c2733c1",
"sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045", "sha256:35db06450272473eab4449e9c2ad9bc6a0a68dab8e81a0eae6b50d9c2838767e",
"sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce", "sha256:392154d09bd4473b9d11351ab5d63391f3d5d24d752f27b3be7498b0ee2b5226",
"sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200", "sha256:3cff6980fe7100242170092bb40d2b1cdad79502cd532fd26b12a2b8a5f9aee0",
"sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718", "sha256:42c692b55a647a832025a4c048007034fe77b162b566ad537ce65ad824b12a84",
"sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b", "sha256:44c9b9f1a245f3d0d202b1a8fa666a80b5ecbe4ad5d0859c0fb16a52d9763224",
"sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f", "sha256:496b86f1fc9c81a1cd53d8842ef712e950a4611bba0c42d33366a7b91ba969ec",
"sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5", "sha256:4bbd58eb5a2371bf160590f4262109f66b6043b0b991930693134cb617bc0169",
"sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade", "sha256:4e3783a286d5a93a2921396d50ce45a909aa8f13eee964465012f110f0cbb611",
"sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5", "sha256:4f3c7c19581d471af0e9cb49d928172cd8492cd78a2b7a4e82345d33662929bb",
"sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a", "sha256:52c139b7ab3f0b15f9aad0a3fedef5a1f8c0b2bdc291d88639ca2c97d3682416",
"sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8", "sha256:541280dde49ce74a4262c5e395b48ea1207e78454788887118c421cb4ffbfcac",
"sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33", "sha256:5906f6a84b47f995cd1bf0aca1c72d591c55ee955f98074e93660d64dfc66eb9",
"sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e", "sha256:6284a2005e4f8061c58c814b1600ad0074ccb0289fe61ea709655c5969877b70",
"sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c", "sha256:6727a0d929ff0028b1ed8b3e7f8701670b1d7032f219110b55476bb60c390bfb",
"sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3", "sha256:697f4742aa3f26c107ddcb2b1784a74fe40180014edbd9adaa574eac0529914c",
"sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969", "sha256:6b9f64526286255735847aed0221b189486e0b9ed943446936e41b7e44b08783",
"sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068", "sha256:6babcbf1e66e46052442f10833cfc4a0d3554d8276aa37af8531a83ed3c1a01d",
"sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2", "sha256:6e7f1a8328eeec34c54f1d5968a708b50fc38d31e62ca8b0560e84a968fbf9a9",
"sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771", "sha256:71f739f97f5f80627f1fee2331e63261355fd1e9a9cce0016394b6707ac3f4ec",
"sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed", "sha256:76d06b721c2550c01a60e5d3093f417168658fb454e5dfd9a23570e9bffe39a1",
"sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212", "sha256:77a04b84d01f0e12c66f16e69e92616442dc675bbe51b90bfb074b1e5d1c7fbd",
"sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614", "sha256:97729e6828643f168a2a3f07848e1b1b94a366b13a9f5aba5484c2215724edc8",
"sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88", "sha256:9a8723ccec4e564d4b9a79923246f7b9a8de4ec55fa03ec4ec804459dade3c4f",
"sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3", "sha256:a5ffd45c6b93c23a8507e2f436983015c6457aa832496b6a095505ca2f63e8f1",
"sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c", "sha256:a6f03f87fea579d55e0b690d28f5042ec1368650466520fbc400e7aeaf09e995",
"sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84", "sha256:aac1d5fdc5378f6bac2c0c7ebe7635a6809f5b4376f6cf5d43243c1917a67087",
"sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11", "sha256:ae82c5f168d2a39a5d69a12a69d4dc23837a43cf2ca99be60dfe59996ea6b113",
"sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1", "sha256:bc7b667f8654376e9353dd93e55e12ce2a59fb6d8e29fce40de682273425e044",
"sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1", "sha256:c1d7a31603c3483ac49c1726723b0934f88f2c011c660e6471e7bd735c2fa110",
"sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e", "sha256:c534431153caffc7c495c3eddf7e6a6033e7f81d78385b4e41611b51e8870446",
"sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1", "sha256:c93d52c3dc7b9c65e39473704988602300e3cc1bad08b5ab5b03ca98bbbc68c1",
"sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd", "sha256:cbcc874f454ee51f158afd604a315f30c0e31dff1d5d5bf499fc529229d964dd",
"sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47", "sha256:d3cacc6a665221108ecdf90517a8028d07a2783df3417d12dcfef1c517e67478",
"sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a", "sha256:d712cefff15c712329113b01088ba71bbcef0f7ea58478ca0bbec63a824844cb",
"sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c", "sha256:d7786b2fa7809bf835f830779ad285215a04da76293164bb6745796873f0942d",
"sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31", "sha256:dc11b42fa61ff1e788dd095726a0aed6aad9c03d5c5984b54cb9e1e67b276aa5",
"sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5", "sha256:dc4d5187ef4d53e0d4c8eaf530233685667844c5fb0b855fea71ae659017854b",
"sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6", "sha256:f5440cdaf3099e7ab17a5a7065aed59aff8c8b079597b61c1f8be6f32fe60636",
"sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303", "sha256:fa079995432037b5e2ef5ddbb270bcd2ded9f52b8e191a5de11fe59a00ea30d8",
"sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5", "sha256:fbe6e8c0a9a7193ba10ee52977d4d5e7652957c1f56ccefed0701db8801a2a3b",
"sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47" "sha256:fde5c7a9d9864d3e07992f66767a9817f24324f354caa3d8129735a3dc74f126"
], ],
"index": "pypi", "index": "pypi",
"version": "==7.2.5" "version": "==7.2.6"
}, },
"cryptography": { "cryptography": {
"hashes": [ "hashes": [
@@ -1000,7 +1000,7 @@
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
], ],
"index": "pypi", "markers": "python_version >= '3.7'",
"version": "==2.31.0" "version": "==2.31.0"
}, },
"rtreelib": { "rtreelib": {
@@ -1094,19 +1094,19 @@
}, },
"typing-extensions": { "typing-extensions": {
"hashes": [ "hashes": [
"sha256:6ad00b63f849b7dcc313b70b6b304ed67b2b2963b3098a33efe18056b1a9a223", "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c",
"sha256:ff6b238610c747e44c268aa4bb23c8c735d665a63726df3f9431ce707f2aa768" "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98"
], ],
"markers": "python_version < '3.10'", "markers": "python_version < '3.10'",
"version": "==4.6.0" "version": "==4.6.2"
}, },
"urllib3": { "urllib3": {
"hashes": [ "hashes": [
"sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f",
"sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"
], ],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.26.15" "version": "==1.26.16"
}, },
"webencodings": { "webencodings": {
"hashes": [ "hashes": [
@@ -1117,11 +1117,11 @@
}, },
"werkzeug": { "werkzeug": {
"hashes": [ "hashes": [
"sha256:4866679a0722de00796a74086238bb3b98d90f423f05de039abb09315487254a", "sha256:1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76",
"sha256:a987caf1092edc7523edb139edb20c70571c4a8d5eed02e0b547b4739174d091" "sha256:48e5e61472fee0ddee27ebad085614ebedb7af41e88f687aaf881afb723a162f"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.3.3" "version": "==2.3.4"
}, },
"wtforms": { "wtforms": {
"hashes": [ "hashes": [
@@ -1182,19 +1182,19 @@
}, },
"boto3": { "boto3": {
"hashes": [ "hashes": [
"sha256:d47a68a0ca6599e8711c7da670fbac24085d9d50cfb4f761204f154d2b6fae26", "sha256:152def2fcc9854dcc42383d2b53e2ed2c9ccb5ff6cc0f3ada20f1ab54418ede4",
"sha256:f0a78f94a7140b60960898fd86677e4e73cc96bd7f3e5c64fc5cc1818d04c7b8" "sha256:a5d6fdcaec863bc7ad2f8133ff9a926d6f06468b83b5fb631cd90bd33b709c45"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==1.26.138" "version": "==1.26.141"
}, },
"botocore": { "botocore": {
"hashes": [ "hashes": [
"sha256:31edc237088c104f7a05887646bbec31d7459dd2e108fd90cbffa315902817e2", "sha256:b01d156c42765f3f437959e01a8c7f3cb0e29b24aa0b8f373498133408b2e3c7",
"sha256:3d145f30d10a9c712acee48e7ce906c9456bb25fe50d477c9312c702ccfa50d1" "sha256:e86e1633f98838317b9e1b5c874c4d85339b77f6b7e55c2a4d83913f6166f9ad"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==1.29.138" "version": "==1.29.141"
}, },
"cachecontrol": { "cachecontrol": {
"extras": [ "extras": [
@@ -1362,7 +1362,7 @@
"sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df",
"sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"
], ],
"markers": "python_version >= '3.7'", "markers": "python_full_version >= '3.7.0'",
"version": "==3.1.0" "version": "==3.1.0"
}, },
"cryptography": { "cryptography": {
@@ -1717,18 +1717,18 @@
}, },
"pip-audit": { "pip-audit": {
"hashes": [ "hashes": [
"sha256:a4cb03f9e2896d626f5b153973d3ac0d32fdb18594d78d393b153c83bb8089b6", "sha256:04fc0ad1727674181bda243a457af5a73038ee691dd9b8afc71f7e9292ce3912",
"sha256:bee3748030c895488b4dd8a6196fa44f484da000cfd52d8fc64dfa3a2e121624" "sha256:7673bea690470024f1aec9be26055334cb987a530c6a431a31c347f66064e475"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.5.4" "version": "==2.5.6"
}, },
"pip-requirements-parser": { "pip-requirements-parser": {
"hashes": [ "hashes": [
"sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526",
"sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3" "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3"
], ],
"markers": "python_version >= '3.6'", "markers": "python_full_version >= '3.6.0'",
"version": "==32.0.1" "version": "==32.0.1"
}, },
"pluggy": { "pluggy": {
@@ -1892,7 +1892,7 @@
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
], ],
"index": "pypi", "markers": "python_version >= '3.7'",
"version": "==2.31.0" "version": "==2.31.0"
}, },
"requests-mock": { "requests-mock": {
@@ -1916,7 +1916,7 @@
"sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c", "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c",
"sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704" "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"
], ],
"markers": "python_version >= '3.7'", "markers": "python_full_version >= '3.7.0'",
"version": "==13.3.5" "version": "==13.3.5"
}, },
"s3transfer": { "s3transfer": {
@@ -1999,11 +1999,11 @@
}, },
"urllib3": { "urllib3": {
"hashes": [ "hashes": [
"sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f",
"sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"
], ],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.26.15" "version": "==1.26.16"
}, },
"webencodings": { "webencodings": {
"hashes": [ "hashes": [
@@ -2014,11 +2014,11 @@
}, },
"werkzeug": { "werkzeug": {
"hashes": [ "hashes": [
"sha256:4866679a0722de00796a74086238bb3b98d90f423f05de039abb09315487254a", "sha256:1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76",
"sha256:a987caf1092edc7523edb139edb20c70571c4a8d5eed02e0b547b4739174d091" "sha256:48e5e61472fee0ddee27ebad085614ebedb7af41e88f687aaf881afb723a162f"
], ],
"index": "pypi", "index": "pypi",
"version": "==2.3.3" "version": "==2.3.4"
}, },
"xmltodict": { "xmltodict": {
"hashes": [ "hashes": [

View File

@@ -267,7 +267,7 @@ def test_choose_account_should_not_show_back_to_service_link_if_not_signed_in(
@pytest.mark.parametrize('active', ( @pytest.mark.parametrize('active', (
False, False,
pytest.param(True, marks=pytest.mark.xfail(raises=AssertionError)), pytest.param(True),
)) ))
def test_choose_account_should_not_show_back_to_service_link_if_service_archived( def test_choose_account_should_not_show_back_to_service_link_if_service_archived(
client_request, client_request,
@@ -283,7 +283,10 @@ def test_choose_account_should_not_show_back_to_service_link_if_service_archived
page = client_request.get('main.choose_account') page = client_request.get('main.choose_account')
assert normalize_spaces(page.select_one('h1').text) == 'Choose service' assert normalize_spaces(page.select_one('h1').text) == 'Choose service'
assert page.select_one('.navigation-service a') is None if active:
assert page.select_one('.navigation-service a') is not None
else:
assert page.select_one('.navigation-service a') is None
def test_should_not_show_back_to_service_if_user_doesnt_belong_to_service( def test_should_not_show_back_to_service_if_user_doesnt_belong_to_service(

View File

@@ -262,64 +262,6 @@ def test_gps_can_create_own_organisations(
) )
@pytest.mark.parametrize('organisation_type, organisation, expected_status', (
('nhs_local', None, 200),
('nhs_gp', None, 403),
('central', None, 403),
('nhs_local', organisation_json(organisation_type='nhs_local'), 403),
))
@pytest.mark.skip(reason='Update for TTS')
def test_nhs_local_can_create_own_organisations(
client_request,
mocker,
mock_get_service_organisation,
service_one,
organisation_type,
organisation,
expected_status,
):
mocker.patch('app.organisations_client.get_organisation', return_value=organisation)
mocker.patch(
'app.models.organisation.AllOrganisations.client_method',
return_value=[
organisation_json('t2', 'Trust 2', organisation_type='nhs_local'),
organisation_json('t1', 'Trust 1', organisation_type='nhs_local'),
organisation_json('gp1', 'GP 1', organisation_type='nhs_gp'),
organisation_json('c1', 'Central 1'),
],
)
service_one['organisation_type'] = organisation_type
page = client_request.get(
'.add_organisation_from_nhs_local_service',
service_id=SERVICE_ONE_ID,
_expected_status=expected_status,
)
if expected_status == 403:
return
assert normalize_spaces(page.select_one('main p').text) == (
'Which NHS Trust or Clinical Commissioning Group do you work for?'
)
assert page.select_one('[data-module=live-search]')['data-targets'] == (
'.govuk-radios__item'
)
assert [
(
normalize_spaces(radio.select_one('label').text),
radio.select_one('input')['value']
)
for radio in page.select('.govuk-radios__item')
] == [
('Trust 1', 't1'),
('Trust 2', 't2'),
]
assert normalize_spaces(page.select_one('.js-stick-at-bottom-when-scrolling button').text) == (
'Continue'
)
@pytest.mark.parametrize('data, expected_service_name', ( @pytest.mark.parametrize('data, expected_service_name', (
( (
{ {
@@ -398,33 +340,6 @@ def test_validation_of_gps_creating_organisations(
assert expected_error in page.select_one('.govuk-error-message, .error-message').text assert expected_error in page.select_one('.govuk-error-message, .error-message').text
@pytest.mark.skip(reason='Update for TTS')
def test_nhs_local_assigns_to_selected_organisation(
client_request,
mocker,
service_one,
mock_get_organisation,
mock_update_service_organisation,
):
mocker.patch(
'app.models.organisation.AllOrganisations.client_method',
return_value=[
organisation_json(ORGANISATION_ID, 'Trust 1', organisation_type='nhs_local'),
],
)
service_one['organisation_type'] = 'nhs_local'
client_request.post(
'.add_organisation_from_nhs_local_service',
service_id=SERVICE_ONE_ID,
_data={
'organisations': ORGANISATION_ID,
},
_expected_status=302,
)
mock_update_service_organisation.assert_called_once_with(SERVICE_ONE_ID, ORGANISATION_ID)
@freeze_time("2020-02-20 20:20") @freeze_time("2020-02-20 20:20")
def test_organisation_services_shows_live_services_and_usage( def test_organisation_services_shows_live_services_and_usage(
client_request, client_request,
@@ -795,8 +710,8 @@ def test_manage_org_users_shows_no_link_for_cancelled_users(
@pytest.mark.parametrize('number_of_users', ( @pytest.mark.parametrize('number_of_users', (
pytest.param(7, marks=pytest.mark.xfail),
pytest.param(8), pytest.param(8),
pytest.param(800),
)) ))
def test_manage_org_users_should_show_live_search_if_more_than_7_users( def test_manage_org_users_should_show_live_search_if_more_than_7_users(
client_request, client_request,
@@ -839,6 +754,37 @@ def test_manage_org_users_should_show_live_search_if_more_than_7_users(
) == 'Search by name or email address' ) == 'Search by name or email address'
@pytest.mark.parametrize('number_of_users', (
pytest.param(3),
pytest.param(7),
))
def test_manage_org_users_should_show_live_search_if_7_users_or_less(
client_request,
mocker,
mock_get_organisation,
active_user_with_permissions,
number_of_users,
):
mocker.patch(
'app.models.user.OrganisationInvitedUsers.client_method',
return_value=[],
)
mocker.patch(
'app.models.user.OrganisationUsers.client_method',
return_value=[active_user_with_permissions] * number_of_users,
)
page = client_request.get(
'.manage_org_users',
org_id=ORGANISATION_ID,
)
with pytest.raises(expected_exception=TypeError):
assert page.select_one('div[data-module=live-search]')['data-targets'] == (
".user-list-item"
)
def test_edit_organisation_user_shows_the_delete_confirmation_banner( def test_edit_organisation_user_shows_the_delete_confirmation_banner(
client_request, client_request,
mock_get_organisation, mock_get_organisation,
@@ -993,7 +939,6 @@ def test_view_organisation_settings(
), ),
pytest.param( pytest.param(
create_active_user_with_permissions(), create_active_user_with_permissions(),
marks=pytest.mark.xfail
), ),
)) ))
def test_update_organisation_settings( def test_update_organisation_settings(
@@ -1011,21 +956,28 @@ def test_update_organisation_settings(
mocker.patch('app.organisations_client.get_organisation_services', return_value=[]) mocker.patch('app.organisations_client.get_organisation_services', return_value=[])
client_request.login(user) client_request.login(user)
if user['email_address'] == 'platform@admin.gsa.gov':
expected_status = 302
expected_redirect = url_for(
'main.organisation_settings',
org_id=organisation_one['id'],
)
else:
expected_status = 403
expected_redirect = None
client_request.post( client_request.post(
endpoint, endpoint,
org_id=organisation_one['id'], org_id=organisation_one['id'],
_data=post_data, _data=post_data,
_expected_status=302, _expected_status=expected_status,
_expected_redirect=url_for( _expected_redirect=expected_redirect,
'main.organisation_settings',
org_id=organisation_one['id'],
),
) )
mock_update_organisation.assert_called_once_with( if user['email_address'] == 'platform@admin.gsa.gov':
organisation_one['id'], mock_update_organisation.assert_called_once_with(
**expected_persisted, organisation_one['id'],
) **expected_persisted,
)
def test_update_organisation_sector_sends_service_id_data_to_api_client( def test_update_organisation_sector_sends_service_id_data_to_api_client(
@@ -1143,7 +1095,6 @@ def test_view_organisation_domains(
), ),
pytest.param( pytest.param(
create_active_user_with_permissions(), create_active_user_with_permissions(),
marks=pytest.mark.xfail
), ),
)) ))
def test_update_organisation_domains( def test_update_organisation_domains(
@@ -1157,22 +1108,29 @@ def test_update_organisation_domains(
user, user,
): ):
client_request.login(user) client_request.login(user)
if user['email_address'] == 'platform@admin.gsa.gov':
expected_status = 302
expected_redirect = url_for(
'main.organisation_settings',
org_id=organisation_one['id'],
)
else:
expected_status = 403
expected_redirect = None
client_request.post( client_request.post(
'main.edit_organisation_domains', 'main.edit_organisation_domains',
org_id=ORGANISATION_ID, org_id=ORGANISATION_ID,
_data=post_data, _data=post_data,
_expected_status=302, _expected_status=expected_status,
_expected_redirect=url_for( _expected_redirect=expected_redirect,
'main.organisation_settings',
org_id=organisation_one['id'],
),
) )
mock_update_organisation.assert_called_once_with( if user['email_address'] == 'platform@admin.gsa.gov':
ORGANISATION_ID, mock_update_organisation.assert_called_once_with(
**expected_persisted, ORGANISATION_ID,
) **expected_persisted,
)
def test_update_organisation_domains_when_domain_already_exists( def test_update_organisation_domains_when_domain_already_exists(

View File

@@ -6,21 +6,15 @@ from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket, NotifySupportTicket,
) )
from app.utils.branding import NHS_EMAIL_BRANDING_ID
from tests import sample_uuid from tests import sample_uuid
from tests.conftest import ORGANISATION_ID, SERVICE_ONE_ID, normalize_spaces from tests.conftest import ORGANISATION_ID, SERVICE_ONE_ID, normalize_spaces
@pytest.mark.parametrize('organisation_type, expected_options', ( @pytest.mark.parametrize('organisation_type, expected_options', (
('nhs_central', [
('nhs', 'NHS'),
('something_else', 'Something else'),
]),
('other', [ ('other', [
('something_else', 'Something else'), ('something_else', 'Something else'),
]) ]),
)) ))
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_request_page_when_no_branding_is_set( def test_email_branding_request_page_when_no_branding_is_set(
service_one, service_one,
client_request, client_request,
@@ -77,7 +71,6 @@ def test_email_branding_request_page_shows_branding_if_set(
assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='some-random-branding') assert page.find('iframe')['src'] == url_for('main.email_template', branding_style='some-random-branding')
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_request_page_back_link( def test_email_branding_request_page_back_link(
client_request, client_request,
): ):
@@ -104,13 +97,6 @@ def test_email_branding_request_page_back_link(
'federal', 'federal',
'main.email_branding_govuk_and_org', 'main.email_branding_govuk_and_org',
), ),
(
{
'options': 'organisation',
},
'federal',
'main.email_branding_organisation',
),
( (
{ {
'options': 'something_else', 'options': 'something_else',
@@ -119,7 +105,6 @@ def test_email_branding_request_page_back_link(
'main.email_branding_something_else', 'main.email_branding_something_else',
), ),
)) ))
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_request_submit( def test_email_branding_request_submit(
client_request, client_request,
service_one, service_one,
@@ -151,7 +136,6 @@ def test_email_branding_request_submit(
) )
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_request_submit_when_no_radio_button_is_selected( def test_email_branding_request_submit_when_no_radio_button_is_selected(
client_request, client_request,
service_one, service_one,
@@ -170,9 +154,7 @@ def test_email_branding_request_submit_when_no_radio_button_is_selected(
@pytest.mark.parametrize('endpoint, expected_heading', [ @pytest.mark.parametrize('endpoint, expected_heading', [
('main.email_branding_govuk_and_org', 'Before you request new branding'), ('main.email_branding_govuk_and_org', 'Before you request new branding'),
('main.email_branding_organisation', 'When you request new branding'),
]) ])
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_description_pages_for_org_branding( def test_email_branding_description_pages_for_org_branding(
client_request, client_request,
mocker, mocker,
@@ -250,7 +232,6 @@ def test_email_branding_something_else_page(client_request, service_one):
) )
@pytest.mark.skip(reason='Update for TTS')
def test_get_email_branding_something_else_page_is_only_option(client_request, service_one): def test_get_email_branding_something_else_page_is_only_option(client_request, service_one):
# should only have a "something else" option # should only have a "something else" option
# so back button goes back to settings page # so back button goes back to settings page
@@ -268,7 +249,6 @@ def test_get_email_branding_something_else_page_is_only_option(client_request, s
@pytest.mark.parametrize('endpoint', [ @pytest.mark.parametrize('endpoint', [
('main.email_branding_govuk'), ('main.email_branding_govuk'),
('main.email_branding_govuk_and_org'), ('main.email_branding_govuk_and_org'),
# ('main.email_branding_nhs'),
('main.email_branding_organisation'), ('main.email_branding_organisation'),
]) ])
def test_email_branding_pages_give_404_if_selected_branding_not_allowed( def test_email_branding_pages_give_404_if_selected_branding_not_allowed(
@@ -284,7 +264,6 @@ def test_email_branding_pages_give_404_if_selected_branding_not_allowed(
) )
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_govuk_submit( def test_email_branding_govuk_submit(
mocker, mocker,
client_request, client_request,
@@ -379,34 +358,6 @@ def test_email_branding_govuk_and_org_submit(
) )
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_nhs_submit(
mocker,
client_request,
service_one,
organisation_one,
no_reply_to_email_addresses,
mock_get_email_branding,
single_sms_sender,
mock_update_service,
):
service_one['email_branding'] = sample_uuid()
service_one['organisation_type'] = 'nhs_local'
page = client_request.post(
'.email_branding_nhs',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
mock_update_service.assert_called_once_with(
SERVICE_ONE_ID,
email_branding=NHS_EMAIL_BRANDING_ID,
)
assert page.h1.text == 'Settings'
assert normalize_spaces(page.select_one('.banner-default').text) == 'Youve updated your email branding'
@pytest.mark.skip(reason='Update for TTS') @pytest.mark.skip(reason='Update for TTS')
def test_email_branding_organisation_submit( def test_email_branding_organisation_submit(
mocker, mocker,
@@ -466,7 +417,6 @@ def test_email_branding_organisation_submit(
) )
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_something_else_submit( def test_email_branding_something_else_submit(
client_request, client_request,
mocker, mocker,
@@ -518,7 +468,6 @@ def test_email_branding_something_else_submit(
) )
@pytest.mark.skip(reason='Update for TTS')
def test_email_branding_something_else_submit_shows_error_if_textbox_is_empty( def test_email_branding_something_else_submit_shows_error_if_textbox_is_empty(
client_request, client_request,
): ):

View File

@@ -122,10 +122,6 @@ def test_service_setting_toggles_show(
({'active': True}, '.history', 2, 'Service history'), ({'active': True}, '.history', 2, 'Service history'),
({'active': False}, '.resume_service', 0, 'Resume service'), ({'active': False}, '.resume_service', 0, 'Resume service'),
({'active': False}, '.history', 1, 'Service history'), ({'active': False}, '.history', 1, 'Service history'),
pytest.param(
{'active': False}, '.archive_service', 2, 'Resume service',
marks=pytest.mark.xfail(raises=IndexError)
)
]) ])
def test_service_setting_link_toggles( def test_service_setting_link_toggles(
get_service_settings_page, get_service_settings_page,
@@ -143,6 +139,26 @@ def test_service_setting_link_toggles(
assert link['href'] == link_url assert link['href'] == link_url
@pytest.mark.parametrize('service_fields, endpoint, index, text', [
pytest.param(
{'active': False}, '.archive_service', 2, 'Resume service',
)
])
def test_service_setting_link_toggles_index_error(
get_service_settings_page,
service_one,
service_fields,
endpoint,
index,
text,
):
with pytest.raises(expected_exception=IndexError):
url_for(endpoint, service_id=service_one['id'])
service_one.update(service_fields)
page = get_service_settings_page()
page.select('.page-footer-link a')[index]
@pytest.mark.parametrize('permissions,permissions_text,visible', [ @pytest.mark.parametrize('permissions,permissions_text,visible', [
('sms', 'inbound SMS', True), ('sms', 'inbound SMS', True),
('inbound_sms', 'inbound SMS', False), # no sms parent permission ('inbound_sms', 'inbound SMS', False), # no sms parent permission

View File

@@ -61,12 +61,6 @@ def mock_get_service_settings_page_common(
'Start text messages with service name On Change your settings for starting text messages with service name', 'Start text messages with service name On Change your settings for starting text messages with service name',
'Send international text messages Off Change your settings for sending international text messages', 'Send international text messages Off Change your settings for sending international text messages',
# 'Label Value Action',
# 'Send emails On Change your settings for sending emails',
# 'Reply-to email addresses Not set Manage reply-to email addresses',
# 'Email branding GOV.UK Change email branding',
# 'Send files by email contact_us@gsa.gov Manage sending files by email',
# 'Receive text messages Off Change your settings for receiving text messages',
]), ]),
(create_platform_admin_user(), [ (create_platform_admin_user(), [
@@ -78,12 +72,6 @@ def mock_get_service_settings_page_common(
'Start text messages with service name On Change your settings for starting text messages with service name', 'Start text messages with service name On Change your settings for starting text messages with service name',
'Send international text messages Off Change your settings for sending international text messages', 'Send international text messages Off Change your settings for sending international text messages',
# 'Label Value Action',
# 'Send emails On Change your settings for sending emails',
# 'Reply-to email addresses Not set Manage reply-to email addresses',
# 'Email branding GOV.UK Change email branding',
# 'Send files by email contact_us@gsa.gov Manage sending files by email',
# 'Receive text messages Off Change your settings for receiving text messages',
'Label Value Action', 'Label Value Action',
'Live Off Change service status', 'Live Off Change service status',
@@ -221,12 +209,6 @@ def test_send_files_by_email_row_on_settings_page(
'Start text messages with service name On Change your settings for starting text messages with service name', 'Start text messages with service name On Change your settings for starting text messages with service name',
'Send international text messages On Change your settings for sending international text messages', 'Send international text messages On Change your settings for sending international text messages',
# 'Label Value Action',
# 'Send emails On Change your settings for sending emails',
# 'Reply-to email addresses test@example.com Manage reply-to email addresses',
# 'Email branding Organisation name Change email branding',
# 'Send files by email Not set up Manage sending files by email',
# 'Receive text messages On Change your settings for receiving text messages',
]), ]),
(['email', 'sms', 'email_auth'], [ (['email', 'sms', 'email_auth'], [
@@ -238,12 +220,6 @@ def test_send_files_by_email_row_on_settings_page(
'Start text messages with service name On Change your settings for starting text messages with service name', 'Start text messages with service name On Change your settings for starting text messages with service name',
'Send international text messages Off Change your settings for sending international text messages', 'Send international text messages Off Change your settings for sending international text messages',
# 'Label Value Action',
# 'Send emails On Change your settings for sending emails',
# 'Reply-to email addresses test@example.com Manage reply-to email addresses',
# 'Email branding Organisation name Change email branding',
# 'Send files by email Not set up Manage sending files by email'
# 'Receive text messages Off Change your settings for receiving text messages',
]), ]),
]) ])
@@ -619,8 +595,6 @@ def test_should_check_if_estimated_volumes_provided(
'reply_to_email_addresses,' 'reply_to_email_addresses,'
'expected_reply_to_checklist_item' 'expected_reply_to_checklist_item'
), [ ), [
pytest.param(None, 0, [], '', marks=pytest.mark.xfail(raises=IndexError)),
pytest.param(0, 0, [], '', marks=pytest.mark.xfail(raises=IndexError)),
(None, 1, [], 'Add a reply-to email address Not completed'), (None, 1, [], 'Add a reply-to email address Not completed'),
(None, 1, [{}], 'Add a reply-to email address Completed'), (None, 1, [{}], 'Add a reply-to email address Completed'),
(1, 1, [], 'Add a reply-to email address Not completed'), (1, 1, [], 'Add a reply-to email address Not completed'),
@@ -674,6 +648,59 @@ def test_should_check_for_reply_to_on_go_live(
mock_get_reply_to_email_addresses.assert_called_once_with(SERVICE_ONE_ID) mock_get_reply_to_email_addresses.assert_called_once_with(SERVICE_ONE_ID)
@pytest.mark.parametrize((
'volume_email,'
'count_of_email_templates,'
'reply_to_email_addresses,'
'expected_reply_to_checklist_item'
), [
(None, 0, [], ''),
(0, 0, [], ''),
])
def test_should_check_for_reply_to_on_go_live_index_error(
client_request,
mocker,
service_one,
fake_uuid,
single_sms_sender,
volume_email,
count_of_email_templates,
reply_to_email_addresses,
expected_reply_to_checklist_item,
mock_get_invites_for_service,
mock_get_users_by_service,
):
mocker.patch(
'app.service_api_client.get_service_templates',
return_value={'data': [
create_template(template_type='email')
for _ in range(0, count_of_email_templates)
]}
)
mocker.patch(
'app.main.views.service_settings.service_api_client.get_reply_to_email_addresses',
return_value=reply_to_email_addresses
)
for channel, volume in (('email', volume_email), ('sms', 0)):
mocker.patch(
'app.models.service.Service.volume_{}'.format(channel),
create=True,
new_callable=PropertyMock,
return_value=volume,
)
with pytest.raises(expected_exception=IndexError):
page = client_request.get(
'main.request_to_go_live', service_id=SERVICE_ONE_ID
)
assert page.h1.text == 'Before you request to go live'
checklist_items = page.select('.task-list .task-list-item')
assert normalize_spaces(checklist_items[3].text) == expected_reply_to_checklist_item
@pytest.mark.parametrize(( @pytest.mark.parametrize((
'count_of_users_with_manage_service,' 'count_of_users_with_manage_service,'
'count_of_invites_with_manage_service,' 'count_of_invites_with_manage_service,'
@@ -835,55 +862,49 @@ def test_request_to_go_live_redirects_if_service_already_live(
'sms_senders,' 'sms_senders,'
'expected_sms_sender_checklist_item' 'expected_sms_sender_checklist_item'
), [ ), [
pytest.param( (
0, 0,
'state', 'state',
0, 0,
[], [],
'', '',
marks=pytest.mark.xfail(raises=IndexError)
), ),
pytest.param( (
None, None,
'state', 'state',
0, 0,
[{'is_default': True, 'sms_sender': 'GOVUK'}], [{'is_default': True, 'sms_sender': 'GOVUK'}],
'', '',
marks=pytest.mark.xfail(raises=IndexError)
), ),
pytest.param( (
1, 1,
'federal', 'federal',
99, 99,
[{'is_default': True, 'sms_sender': 'GOVUK'}], [{'is_default': True, 'sms_sender': 'GOVUK'}],
'', '',
marks=pytest.mark.xfail(raises=IndexError)
), ),
pytest.param( (
None, None,
'federal', 'federal',
99, 99,
[{'is_default': True, 'sms_sender': 'GOVUK'}], [{'is_default': True, 'sms_sender': 'GOVUK'}],
'', '',
marks=pytest.mark.xfail(raises=IndexError)
), ),
pytest.param( (
1, 1,
'federal', 'federal',
99, 99,
[{'is_default': True, 'sms_sender': 'GOVUK'}], [{'is_default': True, 'sms_sender': 'GOVUK'}],
'', '',
marks=pytest.mark.xfail(raises=IndexError)
), ),
pytest.param( (
1, 1,
'state', 'state',
1, 1,
[], [],
'Change your text message sender name Not completed', 'Change your text message sender name Not completed',
marks=pytest.mark.xfail(raises=IndexError),
), ),
pytest.param( (
1, 1,
'state', 'state',
1, 1,
@@ -892,7 +913,6 @@ def test_request_to_go_live_redirects_if_service_already_live(
{'is_default': True, 'sms_sender': 'KUVOG'}, {'is_default': True, 'sms_sender': 'KUVOG'},
], ],
'Change your text message sender name Completed', 'Change your text message sender name Completed',
marks=pytest.mark.xfail(raises=IndexError),
), ),
]) ])
def test_should_check_for_sms_sender_on_go_live( def test_should_check_for_sms_sender_on_go_live(
@@ -935,15 +955,16 @@ def test_should_check_for_sms_sender_on_go_live(
return_value=volume, return_value=volume,
) )
page = client_request.get( with pytest.raises(expected_exception=IndexError):
'main.request_to_go_live', service_id=SERVICE_ONE_ID page = client_request.get(
) 'main.request_to_go_live', service_id=SERVICE_ONE_ID
assert page.h1.text == 'Before you request to go live' )
assert page.h1.text == 'Before you request to go live'
checklist_items = page.select('.task-list .task-list-item') checklist_items = page.select('.task-list .task-list-item')
assert normalize_spaces(checklist_items[3].text) == expected_sms_sender_checklist_item assert normalize_spaces(checklist_items[3].text) == expected_sms_sender_checklist_item
mock_get_sms_senders.assert_called_once_with(SERVICE_ONE_ID) mock_get_sms_senders.assert_called_once_with(SERVICE_ONE_ID)
def test_non_gov_user_is_told_they_cant_go_live( def test_non_gov_user_is_told_they_cant_go_live(
@@ -1702,8 +1723,6 @@ def test_and_more_hint_appears_on_settings_with_more_than_just_a_single_sender(
"Reply-to email addresses test@example.com …and 2 more Manage reply-to email addresses" "Reply-to email addresses test@example.com …and 2 more Manage reply-to email addresses"
assert get_row(page, 'Text message senders') == \ assert get_row(page, 'Text message senders') == \
"Text message senders Example …and 2 more Manage text message senders" "Text message senders Example …and 2 more Manage text message senders"
# assert get_row(page, 'Sender addresses') == \
# "Sender addresses 1 Example Street …and 2 more Manage sender addresses"
@pytest.mark.parametrize('sender_list_page, index, expected_output', [ @pytest.mark.parametrize('sender_list_page, index, expected_output', [
@@ -2899,7 +2918,6 @@ def test_should_show_page_to_set_sms_allowance(
('0', 0), ('0', 0),
('1', 1), ('1', 1),
('250000', 250000), ('250000', 250000),
pytest.param('foo', 'foo', marks=pytest.mark.xfail),
]) ])
def test_should_set_sms_allowance( def test_should_set_sms_allowance(
client_request, client_request,
@@ -2929,6 +2947,34 @@ def test_should_set_sms_allowance(
) )
@freeze_time("2017-04-01 11:09:00.061258")
@pytest.mark.parametrize('given_allowance, expected_api_argument', [
pytest.param('foo', 'foo'),
])
def test_should_set_sms_allowance_fails(
client_request,
platform_admin_user,
given_allowance,
expected_api_argument,
mock_get_free_sms_fragment_limit,
mock_create_or_update_free_sms_fragment_limit,
):
with pytest.raises(expected_exception=AssertionError):
client_request.login(platform_admin_user)
client_request.post(
'main.set_free_sms_allowance',
service_id=SERVICE_ONE_ID,
_data={
'free_sms_allowance': given_allowance,
},
_expected_redirect=url_for(
'main.service_settings',
service_id=SERVICE_ONE_ID,
),
)
def test_should_show_page_to_set_message_limit( def test_should_show_page_to_set_message_limit(
client_request, client_request,
platform_admin_user, platform_admin_user,
@@ -3147,8 +3193,6 @@ def test_switch_service_enable_international_sms(
[create_platform_admin_user(), True], [create_platform_admin_user(), True],
[create_platform_admin_user(), False], [create_platform_admin_user(), False],
[create_active_user_with_permissions(), True], [create_active_user_with_permissions(), True],
pytest.param(create_active_user_with_permissions(), False, marks=pytest.mark.xfail),
pytest.param(create_active_user_no_settings_permission(), True, marks=pytest.mark.xfail),
)) ))
def test_archive_service_after_confirm( def test_archive_service_after_confirm(
client_request, client_request,
@@ -3186,12 +3230,41 @@ def test_archive_service_after_confirm(
assert call(f"user-{sample_uuid()}") in redis_delete_mock.call_args_list assert call(f"user-{sample_uuid()}") in redis_delete_mock.call_args_list
@pytest.mark.parametrize('user, is_trial_service', (
pytest.param(create_active_user_with_permissions(), False),
pytest.param(create_active_user_no_settings_permission(), True),
))
def test_archive_service_after_confirm_error(
client_request,
mocker,
mock_get_organisations,
mock_get_service_and_organisation_counts,
mock_get_organisations_and_services_for_user,
mock_get_users_by_service,
mock_get_service_templates,
service_one,
user,
is_trial_service,
):
service_one['restricted'] = is_trial_service
mocker.patch('app.service_api_client.post')
mocker.patch('app.main.views.service_settings.create_archive_service_event')
mocker.patch('app.notify_client.service_api_client.redis_client.delete')
mocker.patch('app.notify_client.service_api_client.redis_client.delete_by_pattern')
with pytest.raises(expected_exception=AssertionError):
client_request.login(user)
client_request.post(
'main.archive_service',
service_id=SERVICE_ONE_ID,
_follow_redirects=True,
)
@pytest.mark.parametrize('user, is_trial_service', ( @pytest.mark.parametrize('user, is_trial_service', (
[create_platform_admin_user(), True], [create_platform_admin_user(), True],
[create_platform_admin_user(), False], [create_platform_admin_user(), False],
[create_active_user_with_permissions(), True], [create_active_user_with_permissions(), True],
pytest.param(create_active_user_with_permissions(), False, marks=pytest.mark.xfail),
pytest.param(create_active_user_no_settings_permission(), True, marks=pytest.mark.xfail),
)) ))
def test_archive_service_prompts_user( def test_archive_service_prompts_user(
client_request, client_request,
@@ -3230,6 +3303,31 @@ def test_archive_service_prompts_user(
assert mock_api.called is False assert mock_api.called is False
@pytest.mark.parametrize('user, is_trial_service', (
pytest.param(create_active_user_with_permissions(), False),
pytest.param(create_active_user_no_settings_permission(), True),
))
def test_archive_service_prompts_user_error(
client_request,
mocker,
single_reply_to_email_address,
service_one,
single_sms_sender,
mock_get_service_settings_page_common,
user,
is_trial_service,
):
mocker.patch('app.service_api_client.post')
service_one['restricted'] = is_trial_service
client_request.login(user)
with pytest.raises(expected_exception=AssertionError):
client_request.get(
'main.archive_service',
service_id=SERVICE_ONE_ID
)
def test_cant_archive_inactive_service( def test_cant_archive_inactive_service(
client_request, client_request,
platform_admin_user, platform_admin_user,
@@ -3251,7 +3349,6 @@ def test_cant_archive_inactive_service(
@pytest.mark.parametrize('user', ( @pytest.mark.parametrize('user', (
create_platform_admin_user(), create_platform_admin_user(),
pytest.param(create_active_user_with_permissions(), marks=pytest.mark.xfail),
)) ))
def test_suspend_service_after_confirm( def test_suspend_service_after_confirm(
client_request, client_request,
@@ -3275,9 +3372,31 @@ def test_suspend_service_after_confirm(
mock_event.assert_called_once_with(service_id=SERVICE_ONE_ID, suspended_by_id=user['id']) mock_event.assert_called_once_with(service_id=SERVICE_ONE_ID, suspended_by_id=user['id'])
@pytest.mark.parametrize('user', (
pytest.param(create_active_user_with_permissions()),
))
def test_suspend_service_after_confirm_error(
client_request,
user,
mocker,
):
mocker.patch('app.service_api_client.post')
mocker.patch('app.main.views.service_settings.create_suspend_service_event')
with pytest.raises(expected_exception=AssertionError):
client_request.login(user)
client_request.post(
'main.suspend_service',
service_id=SERVICE_ONE_ID,
_expected_redirect=url_for(
'main.service_settings',
service_id=SERVICE_ONE_ID,
),
)
@pytest.mark.parametrize('user', ( @pytest.mark.parametrize('user', (
create_platform_admin_user(), create_platform_admin_user(),
pytest.param(create_active_user_with_permissions(), marks=pytest.mark.xfail), pytest.param(create_active_user_with_permissions()),
)) ))
def test_suspend_service_prompts_user( def test_suspend_service_prompts_user(
client_request, client_request,
@@ -3291,6 +3410,12 @@ def test_suspend_service_prompts_user(
mock_api = mocker.patch('app.service_api_client.post') mock_api = mocker.patch('app.service_api_client.post')
client_request.login(user) client_request.login(user)
if user['email_address'] != 'platform@admin.gsa.gov':
with pytest.raises(expected_exception=AssertionError):
client_request.get('main.suspend_service', service_id=service_one['id'])
return
page = client_request.get('main.suspend_service', service_id=service_one['id']) page = client_request.get('main.suspend_service', service_id=service_one['id'])
assert 'This will suspend the service and revoke all api keys. Are you sure you want to suspend this service?' in \ assert 'This will suspend the service and revoke all api keys. Are you sure you want to suspend this service?' in \
@@ -3319,7 +3444,7 @@ def test_cant_suspend_inactive_service(
@pytest.mark.parametrize('user', ( @pytest.mark.parametrize('user', (
create_platform_admin_user(), create_platform_admin_user(),
pytest.param(create_active_user_with_permissions(), marks=pytest.mark.xfail), create_active_user_with_permissions(),
)) ))
def test_resume_service_after_confirm( def test_resume_service_after_confirm(
mocker, mocker,
@@ -3332,6 +3457,14 @@ def test_resume_service_after_confirm(
mock_event = mocker.patch('app.main.views.service_settings.create_resume_service_event') mock_event = mocker.patch('app.main.views.service_settings.create_resume_service_event')
client_request.login(user) client_request.login(user)
if user['email_address'] != "platform@admin.gsa.gov":
client_request.post(
'main.resume_service',
service_id=SERVICE_ONE_ID,
_expected_status=403,
)
return
client_request.post( client_request.post(
'main.resume_service', 'main.resume_service',
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
@@ -3530,20 +3663,6 @@ def test_send_files_by_email_contact_details_does_not_update_invalid_contact_det
@pytest.mark.parametrize('endpoint, permissions, expected_p', [ @pytest.mark.parametrize('endpoint, permissions, expected_p', [
# (
# 'main.service_set_inbound_sms',
# ['sms'],
# (
# 'Contact us if you want to be able to receive text messages from your users.'
# )
# ),
# (
# 'main.service_set_inbound_sms',
# ['sms', 'inbound_sms'],
# (
# 'Your service can receive text messages sent to 2028675301.'
# )
# ),
( (
'main.service_set_auth_type', 'main.service_set_auth_type',
[], [],
@@ -3771,7 +3890,6 @@ def test_update_service_organisation_does_not_update_if_same_value(
@pytest.mark.skip(reason="Email currently deactivated") @pytest.mark.skip(reason="Email currently deactivated")
@pytest.mark.parametrize('single_branding_option, expected_href', [ @pytest.mark.parametrize('single_branding_option, expected_href', [
(True, f'/services/{SERVICE_ONE_ID}/service-settings/email-branding/something-else'), (True, f'/services/{SERVICE_ONE_ID}/service-settings/email-branding/something-else'),
# (False, f'/services/{SERVICE_ONE_ID}/service-settings/email-branding'),
]) ])
def test_service_settings_links_to_branding_request_page_for_emails( def test_service_settings_links_to_branding_request_page_for_emails(
service_one, service_one,
@@ -3785,10 +3903,6 @@ def test_service_settings_links_to_branding_request_page_for_emails(
# should only have a "something else" option # should only have a "something else" option
# so we go straight to that form # so we go straight to that form
service_one['organisation_type'] = 'other' service_one['organisation_type'] = 'other'
# else:
# # expect to have a "NHS" option as well as the
# # fallback one, so ask user to choose
# service_one['organisation_type'] = 'nhs_central'
page = client_request.get( page = client_request.get(
'.service_settings', service_id=SERVICE_ONE_ID '.service_settings', service_id=SERVICE_ONE_ID

View File

@@ -239,14 +239,13 @@ def test_css_is_served_from_correct_path(client_request):
][index]) ][index])
@pytest.mark.skip(reason="Update for TTS")
def test_resources_that_use_asset_path_variable_have_correct_path(client_request): def test_resources_that_use_asset_path_variable_have_correct_path(client_request):
page = client_request.get('main.documentation') # easy static page page = client_request.get('main.documentation') # easy static page
logo_svg_fallback = page.select_one('.govuk-header__logotype-fallback-image') logo_svg_fallback = page.select_one('.govuk-header__logotype-fallback-image')
assert logo_svg_fallback['src'].startswith('https://static.example.com/images/govuk-logotype.png') assert logo_svg_fallback['src'].startswith('https://static.example.com/images/email-template/us-flag.png')
@pytest.mark.parametrize('extra_args, email_branding_retrieved', ( @pytest.mark.parametrize('extra_args, email_branding_retrieved', (

View File

@@ -245,16 +245,19 @@ def test_should_show_job_with_sending_limit_exceeded_status(
)), )),
# Just started # Just started
(datetime(2020, 1, 10, 0, 0, 0), datetime(2020, 1, 10, 0, 0, 1), ( (datetime(2020, 1, 10, 0, 0, 0), datetime(2020, 1, 10, 0, 0, 1), (
'No messages to show yet…' 'No messages to show yet…'
)), )),
# Created a while ago, just started # Created a while ago, just started
(datetime(2020, 1, 1, 0, 0, 0), datetime(2020, 1, 10, 0, 0, 1), ( (datetime(2020, 1, 1, 0, 0, 0), datetime(2020, 1, 10, 0, 0, 1), (
'No messages to show yet…' 'No messages to show yet…'
)), )),
# Created a while ago, started just within the last 24h # Created a while ago, started just within the last 24h
(datetime(2020, 1, 1, 0, 0, 0), datetime(2020, 1, 9, 6, 0, 1), ( # TODO -- fails locally, should pass, tech debt due to timezone changes, re-evaluate after UTC changes
'No messages to show yet…' pytest.param(
)), datetime(2020, 1, 1, 0, 0, 0),
datetime(2020, 1, 9, 6, 0, 1),
('No messages to show yet…'),
),
# Created a while ago, started exactly 24h ago # Created a while ago, started exactly 24h ago
# --- # ---
# It doesnt matter that 24h (1 day) and 7 days (the services data # It doesnt matter that 24h (1 day) and 7 days (the services data

View File

@@ -191,7 +191,7 @@ def test_should_show_change_details_link(
@pytest.mark.parametrize('number_of_users', ( @pytest.mark.parametrize('number_of_users', (
pytest.param(7, marks=pytest.mark.xfail), pytest.param(7),
pytest.param(8), pytest.param(8),
)) ))
def test_should_show_live_search_if_more_than_7_users( def test_should_show_live_search_if_more_than_7_users(
@@ -213,6 +213,13 @@ def test_should_show_live_search_if_more_than_7_users(
page = client_request.get('main.manage_users', service_id=SERVICE_ONE_ID) page = client_request.get('main.manage_users', service_id=SERVICE_ONE_ID)
if number_of_users == 7:
with pytest.raises(expected_exception=TypeError):
assert page.select_one('div[data-module=live-search]')['data-targets'] == (
".user-list-item"
)
return
assert page.select_one('div[data-module=live-search]')['data-targets'] == ( assert page.select_one('div[data-module=live-search]')['data-targets'] == (
".user-list-item" ".user-list-item"
) )

View File

@@ -2172,9 +2172,7 @@ def test_check_messages_shows_trial_mode_error(
@pytest.mark.parametrize('uploaded_file_name', ( @pytest.mark.parametrize('uploaded_file_name', (
pytest.param('applicants.ods'), # normal job pytest.param('applicants.ods'), # normal job
pytest.param('thisisatest.csv', marks=pytest.mark.xfail), # different template version
pytest.param('send_me_later.csv'), # should look at scheduled job pytest.param('send_me_later.csv'), # should look at scheduled job
pytest.param('full_of_regret.csv', marks=pytest.mark.xfail), # job is cancelled
)) ))
def test_warns_if_file_sent_already( def test_warns_if_file_sent_already(
client_request, client_request,
@@ -2215,6 +2213,51 @@ def test_warns_if_file_sent_already(
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID, limit_days=0) mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID, limit_days=0)
@pytest.mark.parametrize('uploaded_file_name', (
pytest.param('thisisatest.csv'), # different template version
pytest.param('full_of_regret.csv'), # job is cancelled
))
def test_warns_if_file_sent_already_errors(
client_request,
mock_get_users_by_service,
mock_get_live_service,
mock_get_service_template,
mock_has_permissions,
mock_get_service_statistics,
mock_get_job_doesnt_exist,
mock_get_jobs,
fake_uuid,
mocker,
uploaded_file_name,
):
mocker.patch('app.main.views.send.s3download', return_value=(
'phone number,\n2028675209'
))
mocker.patch(
'app.main.views.send.get_csv_metadata',
return_value={'original_file_name': uploaded_file_name},
)
# Should be botocore.errorfactory.NoSuchKey but for some reason can't use that
with pytest.raises(expected_exception=Exception):
page = client_request.get(
'main.check_messages',
service_id=SERVICE_ONE_ID,
template_id="5d729fbd-239c-44ab-b498-75a985f3198f",
upload_id=fake_uuid,
original_file_name=uploaded_file_name,
_test_page_title=False,
)
assert normalize_spaces(
page.select_one('.banner-dangerous').text
) == (
'These messages have already been sent today '
'If you need to resend them, rename the file and upload it again.'
)
mock_get_jobs.assert_called_once_with(SERVICE_ONE_ID, limit_days=0)
def test_check_messages_column_error_doesnt_show_optional_columns( def test_check_messages_column_error_doesnt_show_optional_columns(
mocker, mocker,
client_request, client_request,

View File

@@ -985,14 +985,6 @@ def test_delete_folder(
pytest.param( pytest.param(
create_active_user_with_permissions() create_active_user_with_permissions()
), ),
pytest.param(
create_active_user_view_permissions(),
marks=pytest.mark.xfail(raises=AssertionError)
),
pytest.param(
create_active_caseworking_user(),
marks=pytest.mark.xfail(raises=AssertionError)
),
]) ])
def test_should_show_checkboxes_for_selecting_templates( def test_should_show_checkboxes_for_selecting_templates(
client_request, client_request,
@@ -1022,6 +1014,43 @@ def test_should_show_checkboxes_for_selecting_templates(
assert TEMPLATE_ONE_ID not in checkboxes[index]['id'] assert TEMPLATE_ONE_ID not in checkboxes[index]['id']
@pytest.mark.parametrize('user', [
pytest.param(
create_active_user_view_permissions(),
),
pytest.param(
create_active_caseworking_user(),
),
])
def test_should_show_checkboxes_for_selecting_templates_assertion_error(
client_request,
mocker,
service_one,
mock_get_service_templates,
mock_get_template_folders,
mock_has_no_jobs,
mock_get_no_api_keys,
user,
):
with pytest.raises(expected_exception=AssertionError):
client_request.login(user)
page = client_request.get(
'main.choose_template',
service_id=SERVICE_ONE_ID,
)
checkboxes = page.select('input[name=templates_and_folders]')
assert len(checkboxes) == 4
assert checkboxes[0]['value'] == TEMPLATE_ONE_ID
assert checkboxes[0]['id'] == 'templates-or-folder-{}'.format(TEMPLATE_ONE_ID)
for index in (1, 2, 3):
assert checkboxes[index]['value'] != TEMPLATE_ONE_ID
assert TEMPLATE_ONE_ID not in checkboxes[index]['id']
@pytest.mark.parametrize('user', [ @pytest.mark.parametrize('user', [
create_active_user_view_permissions(), create_active_user_view_permissions(),
create_active_caseworking_user(), create_active_caseworking_user(),

View File

@@ -352,11 +352,11 @@ def test_all_endpoints_are_covered(navigation_instance):
navigation_instances, navigation_instances,
ids=(x.__class__.__name__ for x in navigation_instances) ids=(x.__class__.__name__ for x in navigation_instances)
) )
@pytest.mark.xfail(raises=KeyError)
def test_raises_on_invalid_navigation_item( def test_raises_on_invalid_navigation_item(
client_request, navigation_instance client_request, navigation_instance
): ):
navigation_instance.is_selected('foo') with pytest.raises(expected_exception=KeyError):
navigation_instance.is_selected('foo')
@pytest.mark.parametrize('endpoint, selected_nav_item', [ @pytest.mark.parametrize('endpoint, selected_nav_item', [

View File

@@ -6,10 +6,6 @@ from app.utils.user import user_has_permissions
@pytest.mark.parametrize('permissions', ( @pytest.mark.parametrize('permissions', (
pytest.param([
# Route has a permission which the user doesnt have
'send_messages'
], marks=pytest.mark.xfail(raises=Forbidden)),
[ [
# Route has one of the permissions which the user has # Route has one of the permissions which the user has
'manage_service' 'manage_service'
@@ -45,6 +41,32 @@ def test_permissions(
index() index()
@pytest.mark.parametrize('permissions', (
[
# Route has a permission which the user doesnt have
'send_messages'
],
))
def test_permissions_forbidden(
client_request,
permissions,
api_user_active,
):
request.view_args.update({'service_id': 'foo'})
api_user_active['permissions'] = {'foo': ['manage_users', 'manage_templates', 'manage_settings']}
api_user_active['services'] = ['foo', 'bar']
client_request.login(api_user_active)
@user_has_permissions(*permissions)
def index():
pass
with pytest.raises(expected_exception=Forbidden):
index()
def test_restrict_admin_usage( def test_restrict_admin_usage(
client_request, client_request,
platform_admin_user, platform_admin_user,