diff options
author | Evans Murithi <murithievans80@gmail.com> | 2022-08-03 20:33:46 +0300 |
---|---|---|
committer | Evans Murithi <murithievans80@gmail.com> | 2022-08-03 20:33:46 +0300 |
commit | 8cd8523dd4610a14c10fbba5891686316b275bd7 (patch) | |
tree | 56a24bdfe08a0323d1877c2f3bbf382e21b46143 | |
parent | 2acfe835daf50e73a2a462615de68f627450d39d (diff) |
Update dependencies and add more integration tests
-rw-r--r-- | Cargo.lock | 199 | ||||
-rw-r--r-- | Cargo.toml | 8 | ||||
-rw-r--r-- | src/cmd/add.rs | 35 | ||||
-rw-r--r-- | src/cmd/delete.rs | 8 | ||||
-rw-r--r-- | src/cmd/list.rs | 6 | ||||
-rw-r--r-- | src/cmd/view.rs | 40 | ||||
-rw-r--r-- | src/main.rs | 4 | ||||
-rw-r--r-- | tests/add.rs | 29 | ||||
-rw-r--r-- | tests/common.rs | 41 | ||||
-rw-r--r-- | tests/delete.rs | 34 | ||||
-rw-r--r-- | tests/integration_tests.rs | 116 | ||||
-rw-r--r-- | tests/list.rs | 16 | ||||
-rw-r--r-- | tests/view.rs | 44 |
13 files changed, 311 insertions, 269 deletions
@@ -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", @@ -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( |