summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvans Murithi <murithievans80@gmail.com>2022-08-03 20:33:46 +0300
committerEvans Murithi <murithievans80@gmail.com>2022-08-03 20:33:46 +0300
commit8cd8523dd4610a14c10fbba5891686316b275bd7 (patch)
tree56a24bdfe08a0323d1877c2f3bbf382e21b46143
parent2acfe835daf50e73a2a462615de68f627450d39d (diff)
Update dependencies and add more integration tests
-rw-r--r--Cargo.lock199
-rw-r--r--Cargo.toml8
-rw-r--r--src/cmd/add.rs35
-rw-r--r--src/cmd/delete.rs8
-rw-r--r--src/cmd/list.rs6
-rw-r--r--src/cmd/view.rs40
-rw-r--r--src/main.rs4
-rw-r--r--tests/add.rs29
-rw-r--r--tests/common.rs41
-rw-r--r--tests/delete.rs34
-rw-r--r--tests/integration_tests.rs116
-rw-r--r--tests/list.rs16
-rw-r--r--tests/view.rs44
13 files changed, 311 insertions, 269 deletions
diff --git a/Cargo.lock b/Cargo.lock
index de242bc..8197572 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -52,9 +52,9 @@ dependencies = [
[[package]]
name = "autocfg"
-version = "1.0.1"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bitflags"
@@ -75,15 +75,15 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.9.1"
+version = "3.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899"
+checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
[[package]]
name = "cc"
-version = "1.0.72"
+version = "1.0.73"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
[[package]]
name = "cfg-if"
@@ -93,15 +93,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "clap"
-version = "3.0.13"
+version = "3.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08799f92c961c7a1cf0cc398a9073da99e21ce388b46372c37f3191f2f3eed3e"
+checksum = "a3dbbb6653e7c55cc8595ad3e1f7be8f32aba4eb7ff7f0fd1163d4f3d137c0a9"
dependencies = [
"atty",
"bitflags",
+ "clap_lex",
"indexmap",
- "lazy_static",
- "os_str_bytes",
+ "once_cell",
"strsim",
"termcolor",
"terminal_size",
@@ -109,6 +109,15 @@ dependencies = [
]
[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
name = "cloak"
version = "0.3.0"
dependencies = [
@@ -129,12 +138,12 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.6"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
dependencies = [
"cfg-if",
- "lazy_static",
+ "once_cell",
]
[[package]]
@@ -178,9 +187,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "either"
-version = "1.6.1"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
[[package]]
name = "escargot"
@@ -196,9 +205,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "1.7.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
dependencies = [
"instant",
]
@@ -220,9 +229,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "getrandom"
-version = "0.2.4"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c"
+checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
dependencies = [
"cfg-if",
"libc",
@@ -231,9 +240,9 @@ dependencies = [
[[package]]
name = "globset"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd"
+checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a"
dependencies = [
"aho-corasick",
"bstr",
@@ -255,9 +264,9 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.11.2"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hermit-abi"
@@ -288,9 +297,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "1.8.0"
+version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
+checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
dependencies = [
"autocfg",
"hashbrown",
@@ -316,15 +325,15 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.1"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
+checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
[[package]]
name = "js-sys"
-version = "0.3.56"
+version = "0.3.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04"
+checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
dependencies = [
"wasm-bindgen",
]
@@ -337,24 +346,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.116"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
[[package]]
name = "log"
-version = "0.4.14"
+version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "memchr"
-version = "2.4.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "normalize-line-endings"
@@ -364,27 +373,24 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
[[package]]
name = "num-traits"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
-version = "1.9.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
+checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
[[package]]
name = "os_str_bytes"
-version = "6.0.0"
+version = "6.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
-dependencies = [
- "memchr",
-]
+checksum = "648001efe5d5c0102d8cea768e348da85d90af8ba91f0bea908f157951493cd4"
[[package]]
name = "predicates"
@@ -418,46 +424,47 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.36"
+version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029"
+checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
dependencies = [
- "unicode-xid",
+ "unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.15"
+version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145"
+checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
-version = "0.2.10"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [
"bitflags",
]
[[package]]
name = "redox_users"
-version = "0.4.0"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [
"getrandom",
"redox_syscall",
+ "thiserror",
]
[[package]]
name = "regex"
-version = "1.5.4"
+version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
dependencies = [
"aho-corasick",
"memchr",
@@ -472,9 +479,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
[[package]]
name = "regex-syntax"
-version = "0.6.25"
+version = "0.6.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
[[package]]
name = "remove_dir_all"
@@ -502,9 +509,9 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.9"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
+checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
[[package]]
name = "same-file"
@@ -517,18 +524,18 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.136"
+version = "1.0.142"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
+checksum = "e590c437916fb6b221e1d00df6e3294f3fccd70ca7e92541c475d6ed6ef5fee2"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.136"
+version = "1.0.142"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
+checksum = "34b5b8d809babe02f538c2cfec6f2c1ed10804c0e5a6a041a049a4f5588ccc2e"
dependencies = [
"proc-macro2",
"quote",
@@ -537,9 +544,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.78"
+version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085"
+checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7"
dependencies = [
"itoa",
"ryu",
@@ -560,13 +567,13 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "syn"
-version = "1.0.86"
+version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b"
+checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
dependencies = [
"proc-macro2",
"quote",
- "unicode-xid",
+ "unicode-ident",
]
[[package]]
@@ -585,9 +592,9 @@ dependencies = [
[[package]]
name = "termcolor"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
dependencies = [
"winapi-util",
]
@@ -610,27 +617,27 @@ checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
[[package]]
name = "textwrap"
-version = "0.14.2"
+version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
+checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
dependencies = [
"terminal_size",
]
[[package]]
name = "thiserror"
-version = "1.0.30"
+version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417"
+checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.30"
+version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
+checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21"
dependencies = [
"proc-macro2",
"quote",
@@ -648,18 +655,18 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.5.8"
+version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
+checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
dependencies = [
"serde",
]
[[package]]
-name = "unicode-xid"
-version = "0.2.2"
+name = "unicode-ident"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf"
[[package]]
name = "untrusted"
@@ -689,15 +696,15 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.10.2+wasi-snapshot-preview1"
+version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.79"
+version = "0.2.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06"
+checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -705,13 +712,13 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.79"
+version = "0.2.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca"
+checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f"
dependencies = [
"bumpalo",
- "lazy_static",
"log",
+ "once_cell",
"proc-macro2",
"quote",
"syn",
@@ -720,9 +727,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.79"
+version = "0.2.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01"
+checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -730,9 +737,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.79"
+version = "0.2.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc"
+checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da"
dependencies = [
"proc-macro2",
"quote",
@@ -743,15 +750,15 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.79"
+version = "0.2.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2"
+checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a"
[[package]]
name = "web-sys"
-version = "0.3.56"
+version = "0.3.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb"
+checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1"
dependencies = [
"js-sys",
"wasm-bindgen",
diff --git a/Cargo.toml b/Cargo.toml
index 57c5a7d..55dda39 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,14 +13,14 @@ description = "A Command Line OTP (One Time Password) Authenticator application.
edition = "2018"
[dependencies]
-clap = { version = "3.0.13", features = ["cargo", "wrap_help"] }
+clap = { version = "3.2.2", features = ["cargo", "wrap_help"] }
ring = "0.16.20"
data-encoding = "2.3.2"
-toml = "0.5.8"
-serde = "1.0.136"
+toml = "0.5.9"
+serde = "1.0.141"
serde_derive = "1.0.119"
dirs-next = "2.0.0"
-thiserror = "1.0.30"
+thiserror = "1.0.31"
lazy_static = "1.4.0"
[dev-dependencies]
diff --git a/src/cmd/add.rs b/src/cmd/add.rs
index 4c227dc..bf749c7 100644
--- a/src/cmd/add.rs
+++ b/src/cmd/add.rs
@@ -1,10 +1,11 @@
use crate::account::{Account, AccountStore};
-use clap::{App, Arg, ArgMatches};
+use clap::builder::PossibleValuesParser;
+use clap::{Arg, ArgMatches, Command};
use data_encoding::BASE32_NOPAD;
// Create arguments for `add` subcommand
-pub fn subcommand<'a>() -> App<'a> {
- App::new("add")
+pub fn subcommand<'a>() -> Command<'a> {
+ Command::new("add")
.about("Add a new account")
.arg(
Arg::new("account")
@@ -15,7 +16,7 @@ pub fn subcommand<'a>() -> App<'a> {
Arg::new("key")
.required(true)
.help("Secret key of the OTP")
- .validator(is_base32_key),
+ .value_parser(is_base32_key),
)
.arg(
Arg::new("totp")
@@ -29,27 +30,34 @@ pub fn subcommand<'a>() -> App<'a> {
.short('a')
.long("algorithm")
.takes_value(true)
- .possible_values(&["SHA1", "SHA256", "SHA384", "SHA512", "SHA512_256"])
+ .value_parser(PossibleValuesParser::new([
+ "SHA1",
+ "SHA256",
+ "SHA384",
+ "SHA512",
+ "SHA512_256",
+ ]))
+ .default_value("SHA1")
.value_name("ALGORITHM")
.help("Algorithm to use to generate the OTP code"),
)
}
// Validate key provided in arguments is a valid base32 encoding
-fn is_base32_key(value: &str) -> Result<(), String> {
+fn is_base32_key(value: &str) -> Result<String, String> {
let value = value.to_uppercase();
match BASE32_NOPAD.decode(value.as_bytes()) {
- Ok(_) => Ok(()),
+ Ok(_) => Ok(value.to_string()),
Err(_) => Err(String::from("the key is not a valid base32 encoding")),
}
}
// Implementation for the `add` subcommand
pub fn run(args: &ArgMatches, account_store: &mut AccountStore) {
- let totp = !args.is_present("hotp");
- let hash_function = args.value_of("algorithm").unwrap_or("SHA1");
- let account_name = args.value_of("account").unwrap();
- let key = args.value_of("key").unwrap().to_uppercase();
+ let totp = !args.contains_id("hotp");
+ let hash_function = args.get_one::<String>("algorithm").unwrap();
+ let account_name = args.get_one::<String>("account").unwrap();
+ let key = args.get_one::<String>("key").unwrap().to_uppercase();
let counter = if !totp { Some(0) } else { None };
let account = Account {
@@ -83,6 +91,9 @@ mod tests {
let result = super::is_base32_key("4AZJFQFIGYM2KMTOO72I6FAOZ6ZFWJR6");
assert!(result.is_ok());
- assert_eq!(result.ok(), Some(()));
+ assert_eq!(
+ result.ok(),
+ Some(String::from("4AZJFQFIGYM2KMTOO72I6FAOZ6ZFWJR6"))
+ );
}
}
diff --git a/src/cmd/delete.rs b/src/cmd/delete.rs
index 80128c4..e310b33 100644
--- a/src/cmd/delete.rs
+++ b/src/cmd/delete.rs
@@ -1,10 +1,10 @@
use crate::account::AccountStore;
-use clap::{App, Arg, ArgMatches};
+use clap::{Arg, ArgMatches, Command};
use std::io::{self, Write};
// Create arguments for `delete` subcommand
-pub fn subcommand<'a>() -> App<'a> {
- App::new("delete").about("Delete an account").arg(
+pub fn subcommand<'a>() -> Command<'a> {
+ Command::new("delete").about("Delete an account").arg(
Arg::new("account")
.required(true)
.help("Name of the account"),
@@ -13,7 +13,7 @@ pub fn subcommand<'a>() -> App<'a> {
// Implementation for the `delete` subcommand
pub fn run(args: &ArgMatches, account_store: &mut AccountStore) {
- let account_name = args.value_of("account").unwrap();
+ let account_name = args.get_one::<String>("account").unwrap();
print!("Are you sure you want to delete {} [N/y]? ", account_name);
io::stdout().flush().unwrap();
let mut answer = String::new();
diff --git a/src/cmd/list.rs b/src/cmd/list.rs
index 3aa5ce1..48a74bb 100644
--- a/src/cmd/list.rs
+++ b/src/cmd/list.rs
@@ -1,10 +1,10 @@
use crate::account::AccountStore;
use crate::otp::OneTimePassword;
-use clap::App;
+use clap::Command;
// `list` subcommand
-pub fn subcommand<'a>() -> App<'a> {
- App::new("list").about("List OTP for all accounts")
+pub fn subcommand<'a>() -> Command<'a> {
+ Command::new("list").about("List OTP for all accounts")
}
// Implementation for the `list` subcommand
diff --git a/src/cmd/view.rs b/src/cmd/view.rs
index 03e088b..edba3b1 100644
--- a/src/cmd/view.rs
+++ b/src/cmd/view.rs
@@ -1,10 +1,10 @@
use crate::account::AccountStore;
use crate::otp::OneTimePassword;
-use clap::{App, Arg, ArgMatches};
+use clap::{value_parser, Arg, ArgMatches, Command};
// Create arguments for `view` subcommand
-pub fn subcommand<'a>() -> App<'a> {
- App::new("view")
+pub fn subcommand<'a>() -> Command<'a> {
+ Command::new("view")
.about("View the OTP for an account")
.arg(
Arg::new("account")
@@ -17,26 +17,16 @@ pub fn subcommand<'a>() -> App<'a> {
.long("length")
.takes_value(true)
.value_name("NUMBER")
+ .default_value("6")
.help("Length of the OTP")
- .validator(is_number),
+ .value_parser(value_parser!(usize)),
)
}
-// Validate length provided in arguments is a number
-fn is_number(value: &str) -> Result<(), String> {
- match value.parse::<usize>() {
- Ok(_) => Ok(()),
- Err(_) => Err(String::from("length must be a number")),
- }
-}
-
// Implementation for the `view` subcommand
pub fn run(args: &ArgMatches, account_store: &mut AccountStore) {
- let length = match args.value_of("length") {
- Some(length) => length.parse::<usize>().unwrap(),
- None => 6,
- };
- let account_name = args.value_of("account").unwrap();
+ let length = args.get_one::<usize>("length").unwrap();
+ let account_name = args.get_one::<String>("account").unwrap();
match account_store.get(account_name) {
Some(account) => {
let otp = OneTimePassword::new(
@@ -44,7 +34,7 @@ pub fn run(args: &ArgMatches, account_store: &mut AccountStore) {
account.totp,
&account.hash_function,
account.counter,
- Some(length),
+ Some(*length),
);
match otp {
Ok(otp) => {
@@ -59,17 +49,3 @@ pub fn run(args: &ArgMatches, account_store: &mut AccountStore) {
),
};
}
-
-#[cfg(test)]
-mod tests {
- #[test]
- fn test_is_number() {
- let result = super::is_number("meow");
- assert!(result.is_err());
- assert_eq!(result.err(), Some(String::from("length must be a number")));
-
- let result = super::is_number("8");
- assert!(result.is_ok());
- assert_eq!(result.ok(), Some(()));
- }
-}
diff --git a/src/main.rs b/src/main.rs
index f98d7bb..fc685d1 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -11,7 +11,7 @@ extern crate toml;
extern crate lazy_static;
use crate::account::AccountStore;
-use clap::app_from_crate;
+use clap::command;
mod account;
mod cmd;
@@ -21,7 +21,7 @@ mod otp;
fn main() {
// Define list of subcommand for the `cloak` app
- let matches = app_from_crate!()
+ let matches = command!()
.subcommand(cmd::add::subcommand())
.subcommand(cmd::view::subcommand())
.subcommand(cmd::list::subcommand())
diff --git a/tests/add.rs b/tests/add.rs
new file mode 100644
index 0000000..4118fbd
--- /dev/null
+++ b/tests/add.rs
@@ -0,0 +1,29 @@
+mod common;
+
+use crate::common::cloak;
+use assert_fs::fixture::TempDir;
+use predicates::prelude::*;
+
+#[test]
+fn no_subcommands() {
+ let temp_dir = TempDir::new().unwrap();
+ cloak(&temp_dir)
+ .assert()
+ .success()
+ .stderr("No subcommand chosen. Add --help | -h to view the subcommands.\n");
+ temp_dir.close().unwrap();
+}
+
+#[test]
+fn add_account() {
+ let temp_dir = TempDir::new().unwrap();
+ cloak(&temp_dir)
+ .arg("add")
+ .arg("test_app")
+ .arg("MFZWIYLTMRQXGZDRO5YWK4LXMVYXOZLRO4FA")
+ .assert()
+ .success()
+ .stdout("Account successfully created\n");
+ assert!(predicates::path::is_file().eval(&temp_dir.path().join("accounts")));
+ temp_dir.close().unwrap();
+}
diff --git a/tests/common.rs b/tests/common.rs
new file mode 100644
index 0000000..103f3a2
--- /dev/null
+++ b/tests/common.rs
@@ -0,0 +1,41 @@
+extern crate assert_cmd;
+extern crate assert_fs;
+extern crate escargot;
+extern crate lazy_static;
+extern crate predicates;
+
+use assert_cmd::Command;
+use assert_fs::fixture::TempDir;
+use assert_fs::prelude::*;
+use escargot::CargoRun;
+use lazy_static::lazy_static;
+
+lazy_static! {
+ static ref CARGO_RUN: CargoRun = escargot::CargoBuild::new()
+ .bin("cloak")
+ .current_release()
+ .run()
+ .unwrap();
+}
+
+#[allow(dead_code)]
+pub fn cloak(temp_dir: &TempDir) -> Command {
+ let mut cmd = Command::from(CARGO_RUN.command());
+ cmd.env("CLOAK_ACCOUNTS_DIR", temp_dir.path().to_str().unwrap());
+ cmd
+}
+
+#[allow(dead_code)]
+pub fn load_accounts_file(temp_dir: &TempDir) {
+ temp_dir
+ .child("accounts")
+ .write_str(
+ "
+[test_app]
+key = \"MFZWIYLTMRQXGZCBBI\"
+totp = true
+hash_function = \"SHA1\"
+",
+ )
+ .unwrap();
+}
diff --git a/tests/delete.rs b/tests/delete.rs
new file mode 100644
index 0000000..b915ac2
--- /dev/null
+++ b/tests/delete.rs
@@ -0,0 +1,34 @@
+mod common;
+
+use crate::common::{cloak, load_accounts_file};
+use assert_fs::fixture::TempDir;
+use std::fs;
+
+#[test]
+fn delete_existent_account() {
+ let temp_dir = TempDir::new().unwrap();
+ load_accounts_file(&temp_dir);
+ cloak(&temp_dir)
+ .arg("delete")
+ .arg("test_app")
+ .write_stdin("y\n")
+ .assert()
+ .success()
+ .stdout("Are you sure you want to delete test_app [N/y]? Account successfully deleted\n");
+ assert!(fs::read_to_string(&temp_dir.path().join("accounts"))
+ .unwrap()
+ .is_empty());
+ temp_dir.close().unwrap();
+}
+
+#[test]
+fn delete_non_existent_account() {
+ let temp_dir = TempDir::new().unwrap();
+ cloak(&temp_dir)
+ .arg("delete")
+ .arg("404app")
+ .write_stdin("y\n")
+ .assert()
+ .success()
+ .stdout("Are you sure you want to delete 404app [N/y]? Account does not exist\n");
+}
diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs
deleted file mode 100644
index dab0f0a..0000000
--- a/tests/integration_tests.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-extern crate assert_cmd;
-extern crate assert_fs;
-extern crate escargot;
-#[macro_use]
-extern crate lazy_static;
-extern crate predicates;
-
-use assert_cmd::Command;
-use assert_fs::fixture::TempDir;
-use assert_fs::prelude::*;
-use escargot::CargoRun;
-use predicates::prelude::*;
-use std::fs;
-
-lazy_static! {
- static ref CARGO_RUN: CargoRun = escargot::CargoBuild::new()
- .bin("cloak")
- .current_release()
- .run()
- .unwrap();
-}
-
-fn cloak(temp_dir: &TempDir) -> Command {
- let mut cmd = Command::from(CARGO_RUN.command());
- cmd.env("CLOAK_ACCOUNTS_DIR", temp_dir.path().to_str().unwrap());
- cmd
-}
-
-fn load_accounts_file(temp_dir: &TempDir) {
- temp_dir
- .child("accounts")
- .write_str(
- "
-[test_app]
-key = \"MFZWIYLTMRQXGZCBBI\"
-totp = true
-hash_function = \"SHA1\"
-",
- )
- .unwrap();
-}
-
-#[test]
-fn no_subcommands() {
- let temp_dir = TempDir::new().unwrap();
- cloak(&temp_dir)
- .assert()
- .success()
- .stderr("No subcommand chosen. Add --help | -h to view the subcommands.\n");
- temp_dir.close().unwrap();
-}
-
-#[test]
-fn add_account() {
- let temp_dir = TempDir::new().unwrap();
- cloak(&temp_dir)
- .arg("add")
- .arg("test_app")
- .arg("MFZWIYLTMRQXGZDRO5YWK4LXMVYXOZLRO4FA")
- .assert()
- .success()
- .stdout("Account successfully created\n");
- assert!(predicates::path::is_file().eval(&temp_dir.path().join("accounts")));
- temp_dir.close().unwrap();
-}
-
-#[test]
-fn view_account() {
- let temp_dir = TempDir::new().unwrap();
- load_accounts_file(&temp_dir);
- // normal view subcommand
- cloak(&temp_dir)
- .arg("view")
- .arg("test_app")
- .assert()
- .success()
- .stdout(predicates::str::is_match(r"^\d{6}\n$").unwrap());
- // view subcommand with length argument
- cloak(&temp_dir)
- .arg("view")
- .arg("test_app")
- .arg("--length=8")
- .assert()
- .success()
- .stdout(predicates::str::is_match(r"^\d{8}\n$").unwrap());
- temp_dir.close().unwrap();
-}
-
-#[test]
-fn list_account() {
- let temp_dir = TempDir::new().unwrap();
- load_accounts_file(&temp_dir);
- cloak(&temp_dir)
- .arg("list")
- .assert()
- .success()
- .stdout(