Skip to content
This repository was archived by the owner on Feb 16, 2023. It is now read-only.

Commit 1f941e1

Browse files
committed
Merge branch 'develop' into feature/repeatable-migrate-apply
2 parents 2ca5555 + 17f760e commit 1f941e1

17 files changed

Lines changed: 743 additions & 123 deletions

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: 2.1
22
jobs:
33
lint:
44
docker:
5-
- image: golangci/golangci-lint:v1.23.8-alpine
5+
- image: golangci/golangci-lint:v1.41.1-alpine
66
steps:
77
- checkout
88
- restore_cache:
@@ -67,6 +67,6 @@ workflows:
6767
arch: ["amd64", "386"]
6868
exclude:
6969
- os: darwin
70-
arch: 386
70+
arch: "386"
7171
- test
7272
- verify-goreleaser

go.sum

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022 h1:y8Gs8CzNf
3333
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
3434
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
3535
github.com/alecthomas/kingpin v1.3.8-0.20200323085623-b6657d9477a6/go.mod h1:b6br6/pDFSfMkBgC96TbpOji05q5pa+v5rIlS0Y6XtI=
36-
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
3736
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
38-
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
3937
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
4038
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
4139
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco=
@@ -61,7 +59,6 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
6159
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
6260
github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU=
6361
github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U=
64-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
6562
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6663
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
6764
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -178,7 +175,6 @@ github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq
178175
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
179176
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
180177
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
181-
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
182178
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
183179
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
184180
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
@@ -204,9 +200,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
204200
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
205201
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
206202
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
207-
github.com/secrethub/demo-app v0.5.1-0.20201221075813-cc159373e2d5 h1:8Uw+Rrui2SnITOhoWfWfJ8Hj2Vq/qPXW0Z3V5WckyXw=
208203
github.com/secrethub/demo-app v0.5.1-0.20201221075813-cc159373e2d5/go.mod h1:XR0VknPwSudqu/qphA4I4f7B7i2CPGydD59G02y8mBM=
209-
github.com/secrethub/demo-app v0.5.1-0.20201221173924-a1c686b2340e h1:cK/03EQgKYKxl/Yg7zPXOEh2nO1bysOGW+1RBznfMJc=
210204
github.com/secrethub/demo-app v0.5.1-0.20201221173924-a1c686b2340e/go.mod h1:WYS7Q0nigGv+iFdRsnWWXZYl3FpSrU5qtz9h7qBxbq0=
211205
github.com/secrethub/demo-app v0.5.1-0.20210105185858-ad55afc2cb87 h1:s7gYqlql2EV2LI7NwrSUomSXMFHs/v/rBUq6qTuFQwY=
212206
github.com/secrethub/demo-app v0.5.1-0.20210105185858-ad55afc2cb87/go.mod h1:3H4px7f30uHbwMLo19ooijzi4JZlZbGxvnL8VlIcAps=
@@ -228,14 +222,11 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
228222
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
229223
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
230224
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
231-
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
232225
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
233226
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
234227
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
235228
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
236-
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
237229
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
238-
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
239230
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
240231
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
241232
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -298,7 +289,6 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r
298289
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
299290
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
300291
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
301-
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
302292
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
303293
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
304294
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -333,9 +323,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
333323
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
334324
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
335325
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
336-
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
337326
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
338-
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
339327
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
340328
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
341329
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -354,14 +342,12 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w
354342
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
355343
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
356344
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
357-
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e h1:hq86ru83GdWTlfQFZGO4nZJTU4Bs2wfHl8oFHRaXsfc=
358345
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
359346
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
360347
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
361348
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
362349
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
363350
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
364-
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
365351
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
366352
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
367353
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
@@ -471,7 +457,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
471457
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
472458
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
473459
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
474-
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
475460
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
476461
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
477462
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

internals/secrethub/clear_clipboard.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import (
1111
"golang.org/x/crypto/bcrypt"
1212
)
1313

14-
// defaultClearClipboardAfter defines the default TTL for data written to the clipboard.
15-
const defaultClearClipboardAfter = 45 * time.Second
14+
// clearClipboardAfter defines the TTL for data written to the clipboard.
15+
const clearClipboardAfter = 45 * time.Second
1616

1717
// ClearClipboardCommand is a command to clear the contents of the clipboard after some time passed.
1818
type ClearClipboardCommand struct {
@@ -62,21 +62,29 @@ func (cmd *ClearClipboardCommand) Run() error {
6262
return nil
6363
}
6464

65-
// WriteClipboardAutoClear writes data to the clipboard and clears it after the timeout.
66-
func WriteClipboardAutoClear(data []byte, timeout time.Duration, clipper clip.Clipper) error {
65+
type ClipboardWriter interface {
66+
Write(data []byte) error
67+
}
68+
69+
type ClipboardWriterAutoClear struct {
70+
clipper clip.Clipper
71+
}
72+
73+
// Write writes data to the clipboard and clears it after the timeout.
74+
func (clipWriter *ClipboardWriterAutoClear) Write(data []byte) error {
6775
hash, err := bcrypt.GenerateFromPassword(data, bcrypt.DefaultCost)
6876
if err != nil {
6977
return err
7078
}
7179

72-
err = clipper.WriteAll(data)
80+
err = clipWriter.clipper.WriteAll(data)
7381
if err != nil {
7482
return err
7583
}
7684

7785
err = cloneproc.Spawn(
7886
"clipboard-clear", hex.EncodeToString(hash),
79-
"--timeout", timeout.String())
87+
"--timeout", clearClipboardAfter.String())
8088

8189
return err
8290
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package secrethub
2+
3+
import "bytes"
4+
5+
type FakeClipboardWriter struct {
6+
Buffer bytes.Buffer
7+
}
8+
9+
func (clipWriter *FakeClipboardWriter) Write(data []byte) error {
10+
_, err := clipWriter.Buffer.Write(data)
11+
return err
12+
}

internals/secrethub/generate.go

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"os"
66
"strconv"
77
"strings"
8-
"time"
98

109
"github.com/secrethub/secrethub-cli/internals/cli"
1110
"github.com/secrethub/secrethub-cli/internals/cli/clip"
@@ -35,28 +34,28 @@ const defaultLength = 22
3534

3635
// GenerateSecretCommand generates a new secret and writes to the output path.
3736
type GenerateSecretCommand struct {
38-
symbolsFlag bool
39-
generator randchar.Generator
40-
io ui.IO
41-
lengthFlag intValue
42-
firstArg cli.StringValue
43-
secondArg cli.StringValue
44-
lengthArg intValue
45-
charsetFlag charsetValue
46-
mins minRuleValue
47-
copyToClipboard bool
48-
clearClipboardAfter time.Duration
49-
clipper clip.Clipper
50-
newClient newClientFunc
37+
symbolsFlag bool
38+
generator randchar.Generator
39+
io ui.IO
40+
lengthFlag intValue
41+
firstArg cli.StringValue
42+
secondArg cli.StringValue
43+
lengthArg intValue
44+
charsetFlag charsetValue
45+
mins minRuleValue
46+
copyToClipboard bool
47+
newClient newClientFunc
48+
clipWriter ClipboardWriter
5149
}
5250

5351
// NewGenerateSecretCommand creates a new GenerateSecretCommand.
5452
func NewGenerateSecretCommand(io ui.IO, newClient newClientFunc) *GenerateSecretCommand {
5553
return &GenerateSecretCommand{
56-
io: io,
57-
newClient: newClient,
58-
clearClipboardAfter: defaultClearClipboardAfter,
59-
clipper: clip.NewClipboard(),
54+
io: io,
55+
newClient: newClient,
56+
clipWriter: &ClipboardWriterAutoClear{
57+
clipper: clip.NewClipboard(),
58+
},
6059
}
6160
}
6261

@@ -66,7 +65,7 @@ func (cmd *GenerateSecretCommand) Register(r cli.Registerer) {
6665
clause.Flags().VarP(&cmd.lengthFlag, "length", "l", "The length of the generated secret.")
6766
clause.Cmd.Flag("length").DefValue = strconv.Itoa(defaultLength)
6867
clause.Flags().Var(&cmd.mins, "min", "<charset>:<n> Ensure that the resulting password contains at least n characters from the given character set. Note that adding constraints reduces the strength of the secret. When possible, avoid any constraints.")
69-
clause.Flags().BoolVarP(&cmd.copyToClipboard, "clip", "c", false, "Copy the generated value to the clipboard. The clipboard is automatically cleared after "+units.HumanDuration(cmd.clearClipboardAfter)+".")
68+
clause.Flags().BoolVarP(&cmd.copyToClipboard, "clip", "c", false, "Copy the generated value to the clipboard. The clipboard is automatically cleared after "+units.HumanDuration(clearClipboardAfter)+".")
7069
_ = cmd.charsetFlag.Set("alphanumeric")
7170
clause.Flags().Var(&cmd.charsetFlag, "charset", "Define the set of characters to randomly generate a password from. Options are all, alphanumeric, numeric, lowercase, uppercase, letters, symbols and human-readable. Multiple character sets can be combined by supplying them in a comma separated list.")
7271
clause.Cmd.Flag("charset").DefValue = "alphanumeric"
@@ -147,15 +146,15 @@ func (cmd *GenerateSecretCommand) run() error {
147146
fmt.Fprintf(cmd.io.Output(), "A randomly generated secret has been written to %s:%d.\n", path, version.Version)
148147

149148
if cmd.copyToClipboard {
150-
err = WriteClipboardAutoClear(data, cmd.clearClipboardAfter, cmd.clipper)
149+
err = cmd.clipWriter.Write(data)
151150
if err != nil {
152151
return err
153152
}
154153

155154
fmt.Fprintf(
156155
cmd.io.Output(),
157156
"The generated value has been copied to the clipboard. It will be cleared after %s.\n",
158-
units.HumanDuration(cmd.clearClipboardAfter),
157+
units.HumanDuration(clearClipboardAfter),
159158
)
160159
}
161160

internals/secrethub/generate_test.go

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"testing"
66

77
"github.com/secrethub/secrethub-cli/internals/cli"
8-
"github.com/secrethub/secrethub-cli/internals/cli/clip/fakeclip"
98
"github.com/secrethub/secrethub-cli/internals/cli/ui/fakeui"
109

1110
"github.com/secrethub/secrethub-go/internals/api"
@@ -42,7 +41,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
4241
Err: nil,
4342
},
4443
firstArg: cli.StringValue{Value: testPath},
45-
clipper: fakeclip.New(),
4644
},
4745
writeFunc: func(path string, data []byte) (*api.SecretVersion, error) {
4846
return &api.SecretVersion{Version: 1}, nil
@@ -60,7 +58,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
6058
},
6159
firstArg: cli.StringValue{Value: testPath},
6260
copyToClipboard: true,
63-
clipper: fakeclip.New(),
6461
},
6562
writeFunc: func(path string, data []byte) (*api.SecretVersion, error) {
6663
return &api.SecretVersion{Version: 1}, nil
@@ -69,7 +66,7 @@ func TestGenerateSecretCommand_run(t *testing.T) {
6966
data: testData,
7067
expectedClip: testData,
7168
expectedOut: "A randomly generated secret has been written to namespace/repo/secret:1.\n" +
72-
"The generated value has been copied to the clipboard. It will be cleared after Less than a second.\n",
69+
"The generated value has been copied to the clipboard. It will be cleared after 45 seconds.\n",
7370
},
7471
"length flag": {
7572
cmd: GenerateSecretCommand{
@@ -79,7 +76,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
7976
},
8077
firstArg: cli.StringValue{Value: testPath},
8178
lengthFlag: newIntValue(24),
82-
clipper: fakeclip.New(),
8379
},
8480
writeFunc: func(path string, data []byte) (*api.SecretVersion, error) {
8581
return &api.SecretVersion{Version: 1}, nil
@@ -99,7 +95,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
9995
secondArg: cli.StringValue{Value: testPath},
10096
lengthFlag: newIntValue(24),
10197
lengthArg: newIntValue(24),
102-
clipper: fakeclip.New(),
10398
},
10499
expectedErr: ErrCannotUseLengthArgAndFlag,
105100
},
@@ -112,7 +107,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
112107
firstArg: cli.StringValue{Value: "rand"},
113108
secondArg: cli.StringValue{Value: testPath},
114109
lengthArg: newIntValue(23),
115-
clipper: fakeclip.New(),
116110
},
117111
writeFunc: func(path string, data []byte) (*api.SecretVersion, error) {
118112
return &api.SecretVersion{Version: 1}, nil
@@ -127,7 +121,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
127121
firstArg: cli.StringValue{Value: "rand"},
128122
secondArg: cli.StringValue{Value: testPath},
129123
lengthArg: newIntValue(0),
130-
clipper: fakeclip.New(),
131124
},
132125
expectedErr: ErrInvalidRandLength,
133126
expectedOut: "",
@@ -137,7 +130,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
137130
firstArg: cli.StringValue{Value: "rand"},
138131
secondArg: cli.StringValue{Value: testPath},
139132
lengthArg: newIntValue(-1),
140-
clipper: fakeclip.New(),
141133
},
142134
expectedErr: ErrInvalidRandLength,
143135
expectedOut: "",
@@ -147,7 +139,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
147139
cmd: GenerateSecretCommand{
148140
firstArg: cli.StringValue{Value: testPath},
149141
lengthArg: newIntValue(24),
150-
clipper: fakeclip.New(),
151142
},
152143
expectedErr: errors.New("unexpected 24"),
153144
},
@@ -156,7 +147,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
156147
cmd: GenerateSecretCommand{
157148
firstArg: cli.StringValue{Value: testPath},
158149
secondArg: cli.StringValue{Value: "namespace/repo/secret2"},
159-
clipper: fakeclip.New(),
160150
},
161151
expectedErr: errors.New("unexpected namespace/repo/secret2"),
162152
},
@@ -167,7 +157,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
167157
Err: testErr,
168158
},
169159
firstArg: cli.StringValue{Value: testPath},
170-
clipper: fakeclip.New(),
171160
},
172161
expectedErr: testErr,
173162
},
@@ -178,7 +167,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
178167
Err: nil,
179168
},
180169
firstArg: cli.StringValue{Value: testPath},
181-
clipper: fakeclip.New(),
182170
},
183171
newClientErr: testErr,
184172
expectedErr: testErr,
@@ -190,7 +178,6 @@ func TestGenerateSecretCommand_run(t *testing.T) {
190178
Err: nil,
191179
},
192180
firstArg: cli.StringValue{Value: testPath},
193-
clipper: fakeclip.New(),
194181
},
195182
writeFunc: func(path string, data []byte) (*api.SecretVersion, error) {
196183
return nil, testErr
@@ -210,6 +197,9 @@ func TestGenerateSecretCommand_run(t *testing.T) {
210197
testIO := fakeui.NewIO(t)
211198
tc.cmd.io = testIO
212199

200+
clipWriter := &FakeClipboardWriter{}
201+
tc.cmd.clipWriter = clipWriter
202+
213203
tc.cmd.newClient = func() (secrethub.ClientInterface, error) {
214204
return fakeclient.Client{
215205
SecretService: &fakeclient.SecretService{
@@ -224,14 +214,12 @@ func TestGenerateSecretCommand_run(t *testing.T) {
224214

225215
// Act
226216
err := tc.cmd.run()
227-
resClip, clipErr := tc.cmd.clipper.ReadAll()
228217

229218
// Assert
230-
assert.OK(t, clipErr)
231219
assert.Equal(t, err, tc.expectedErr)
232220
assert.Equal(t, argPath, tc.path)
233221
assert.Equal(t, argData, tc.data)
234-
assert.Equal(t, resClip, tc.expectedClip)
222+
assert.Equal(t, clipWriter.Buffer.Bytes(), tc.expectedClip)
235223
assert.Equal(t, testIO.Out.String(), tc.expectedOut)
236224
})
237225
}

0 commit comments

Comments
 (0)