Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions go.work.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
charm.land/lipgloss/v2 v2.0.5/go.mod h1:9oqhxt4yxIMe6q5A4kHr44DremZk7J9UNh74GlWa5nc=
cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M=
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
Expand All @@ -17,6 +18,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.33.0/go.mod h1:pJTkW8hEUIIi3Pf65lPZOnn4Y81yCllX6IWk2jNXdkM=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
Expand All @@ -25,10 +27,16 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aymanbagabas/go-udiff v0.4.1/go.mod h1:0L9PGwj20lrtmEMeyw4WKJ/TMyDtvAoK9bf2u/mNo3w=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8=
github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f/go.mod h1:IfZAMTHB6XkZSeXUqriemErjAWCCzT0LwjKFYCZyw0I=
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY=
github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
Expand Down Expand Up @@ -57,6 +65,7 @@ github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vma
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
github.com/docker/secrets-engine v0.0.7/go.mod h1:Gs9tyhVJC28cd8XEqGf0MSV4Qni+k+T2YE2LPxBxs+Y=
github.com/docker/secrets-engine/mysecret v0.0.12/go.mod h1:5Q47SUB+HGV+CdFuXBMqA00mf5ZuvWwKh+hcHF1NxSA=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=
github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs=
github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=
Expand Down Expand Up @@ -172,6 +181,7 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
github.com/sahilm/fuzzy v0.1.3/go.mod h1:au6//VbVSqu6DFrkL2CfjlJ5iURpNCPeE+1GwY3XsT8=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
Expand Down
2 changes: 1 addition & 1 deletion plugin/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ require (
github.com/kr/text v0.2.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
golang.org/x/mod v0.36.0 // indirect
golang.org/x/sys v0.45.0 // indirect
golang.org/x/sys v0.46.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
4 changes: 2 additions & 2 deletions plugin/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
2 changes: 1 addition & 1 deletion plugins/credentialhelper/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ require (
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
golang.org/x/mod v0.36.0 // indirect
golang.org/x/sys v0.45.0 // indirect
golang.org/x/sys v0.46.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
4 changes: 2 additions & 2 deletions plugins/credentialhelper/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand Down
217 changes: 217 additions & 0 deletions plugins/pass/commands/command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ package commands
import (
"bytes"
"errors"
"io"
"os"
"path/filepath"
"strings"
"testing"
"time"

tea "charm.land/bubbletea/v2"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -436,3 +440,216 @@ func assertStoredMetadata(t *testing.T, kc store.Store, want map[string]string)
require.True(t, ok)
assert.Equal(t, want, impl.Metadata())
}

func Test_promptModel(t *testing.T) {
t.Parallel()
typeText := func(m promptModel, text string) promptModel {
for _, r := range text {
next, _ := m.Update(tea.KeyPressMsg{Code: r, Text: string(r)})
m = next.(promptModel)
}
return m
}
press := func(m promptModel, keys ...tea.KeyPressMsg) (promptModel, tea.Cmd) {
var cmd tea.Cmd
for _, k := range keys {
var next tea.Model
next, cmd = m.Update(k)
m = next.(promptModel)
}
return m, cmd
}
ctrl := func(r rune) tea.KeyPressMsg { return tea.KeyPressMsg{Code: r, Mod: tea.ModCtrl} }
enter := tea.KeyPressMsg{Code: tea.KeyEnter}
backspace := tea.KeyPressMsg{Code: tea.KeyBackspace}
tab := tea.KeyPressMsg{Code: tea.KeyTab}

t.Run("masks typed input", func(t *testing.T) {
t.Parallel()
m := typeText(newPromptModel("foo"), "hunter2")
view := m.View().Content
assert.Contains(t, view, "Enter secret for foo: ")
assert.Contains(t, view, "*******")
assert.NotContains(t, view, "hunter2")
assert.Equal(t, "hunter2", string(m.value))
assert.True(t, strings.HasSuffix(view, "\n"), "trailing newline keeps the line on screen at exit")
})
t.Run("enter submits", func(t *testing.T) {
t.Parallel()
m, cmd := press(typeText(newPromptModel("foo"), "hunter2"), enter)
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd())
assert.NoError(t, m.err)
assert.Equal(t, "hunter2", string(m.value))
})
t.Run("enter on empty input errors", func(t *testing.T) {
t.Parallel()
m, cmd := press(newPromptModel("foo"), enter)
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd())
assert.ErrorIs(t, m.err, errEmptyValue)
})
t.Run("ctrl+j and ctrl+d submit like enter", func(t *testing.T) {
t.Parallel()
for _, k := range []tea.KeyPressMsg{ctrl('j'), ctrl('d')} {
m, cmd := press(typeText(newPromptModel("foo"), "hunter2"), k)
require.NotNil(t, cmd, k.String())
assert.IsType(t, tea.QuitMsg{}, cmd(), k.String())
assert.NoError(t, m.err, k.String())
assert.Equal(t, "hunter2", string(m.value), k.String())
}
})
t.Run("ctrl+c interrupts", func(t *testing.T) {
t.Parallel()
_, cmd := press(newPromptModel("foo"), ctrl('c'))
require.NotNil(t, cmd)
assert.IsType(t, tea.InterruptMsg{}, cmd())
})
t.Run("input after enter is ignored", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "line1"), enter)
m = typeText(m, "line2")
next, cmd := m.Update(tea.PasteMsg{Content: "line3"})
assert.Nil(t, cmd)
m = next.(promptModel)
assert.NoError(t, m.err)
assert.Equal(t, "line1", string(m.value))
})
t.Run("backspace erases one rune", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "héllo"), backspace, backspace, backspace)
assert.Equal(t, "hé", string(m.value))
m, _ = press(m, backspace, backspace, backspace)
assert.Equal(t, "", string(m.value), "erasing past the start is a no-op")
})
t.Run("ctrl+w erases the last word", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "two words \t"), ctrl('w'))
assert.Equal(t, "two ", string(m.value))
m, _ = press(m, ctrl('w'), ctrl('w'))
assert.Equal(t, "", string(m.value))
})
t.Run("ctrl+u clears the line", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "hunter2"), ctrl('u'))
assert.Equal(t, "", string(m.value))
assert.Equal(t, "x", string(typeText(m, "x").value), "typing continues after the kill")
})
t.Run("tab is stored verbatim", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "a"), tab)
m = typeText(m, "b")
assert.Equal(t, "a\tb", string(m.value))
assert.Contains(t, m.View().Content, "***")
})
t.Run("ctrl+v inserts the next key literally", func(t *testing.T) {
t.Parallel()
m, _ := press(newPromptModel("foo"), ctrl('v'), ctrl('a'), ctrl('v'), enter, ctrl('v'), ctrl('u'))
m = typeText(m, "x")
assert.Equal(t, "\x01\r\x15x", string(m.value))
assert.NoError(t, m.err)
_, cmd := press(m, ctrl('v'), ctrl('c'))
require.NotNil(t, cmd)
assert.IsType(t, tea.InterruptMsg{}, cmd(), "ctrl+c always interrupts")
})
t.Run("keys without text are ignored", func(t *testing.T) {
t.Parallel()
m, _ := press(typeText(newPromptModel("foo"), "hunter2"), tea.KeyPressMsg{Code: tea.KeyUp}, tea.KeyPressMsg{Code: tea.KeyF1})
assert.Equal(t, "hunter2", string(m.value))
})
t.Run("paste is stored verbatim", func(t *testing.T) {
t.Parallel()
next, _ := newPromptModel("foo").Update(tea.PasteMsg{Content: "a\tb\x01 \xff\n"})
m := next.(promptModel)
assert.NoError(t, m.err)
assert.Equal(t, "a\tb\x01 \xff", string(m.value), "only the trailing newline is dropped")
})
t.Run("multi-line paste is rejected", func(t *testing.T) {
t.Parallel()
next, cmd := newPromptModel("foo").Update(tea.PasteMsg{Content: "line1\nline2\n"})
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd())
assert.ErrorIs(t, next.(promptModel).err, errMultilinePaste)
})
t.Run("modifiers on enter, backspace and tab follow the tty", func(t *testing.T) {
t.Parallel()
shiftEnter := tea.KeyPressMsg{Code: tea.KeyEnter, Mod: tea.ModShift}
shiftBackspace := tea.KeyPressMsg{Code: tea.KeyBackspace, Mod: tea.ModShift}
m, cmd := press(typeText(newPromptModel("foo"), "hunter23"), shiftBackspace, shiftEnter)
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd())
assert.Equal(t, "hunter2", string(m.value))
ctrlBackspace := tea.KeyPressMsg{Code: tea.KeyBackspace, Mod: tea.ModCtrl}
shiftTab := tea.KeyPressMsg{Code: tea.KeyTab, Mod: tea.ModShift}
m, _ = press(typeText(newPromptModel("foo"), "ab"), ctrlBackspace, ctrl('i'), shiftTab)
assert.Equal(t, "a\t", string(m.value), "ctrl+backspace erases, ctrl+i is a tab, shift+tab is ignored")
_, cmd = press(typeText(newPromptModel("foo"), "x"), ctrl('m'))
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd(), "ctrl+m is CR")
_, cmd = press(newPromptModel("foo"), tea.KeyPressMsg{Code: 'c', Mod: tea.ModCtrl | tea.ModShift})
require.NotNil(t, cmd)
assert.IsType(t, tea.InterruptMsg{}, cmd(), "shift does not mask ctrl+c")
})
t.Run("a paste spends the ctrl+v quote", func(t *testing.T) {
t.Parallel()
m, _ := press(newPromptModel("foo"), ctrl('v'))
next, _ := m.Update(tea.PasteMsg{Content: "ab"})
m, cmd := press(next.(promptModel), enter)
require.NotNil(t, cmd)
assert.IsType(t, tea.QuitMsg{}, cmd(), "enter after the paste submits instead of inserting a literal CR")
assert.NoError(t, m.err)
assert.Equal(t, "ab", string(m.value))
})
t.Run("ctrl+v quotes every key that has bytes", func(t *testing.T) {
t.Parallel()
alt := func(r rune, mod tea.KeyMod) tea.KeyPressMsg { return tea.KeyPressMsg{Code: r, Mod: tea.ModAlt | mod} }
m, _ := press(newPromptModel("foo"),
ctrl('v'), tea.KeyPressMsg{Code: tea.KeySpace, Mod: tea.ModCtrl},
ctrl('v'), ctrl('\\'),
ctrl('v'), ctrl('_'),
ctrl('v'), alt('x', 0),
ctrl('v'), alt('x', tea.ModShift),
ctrl('v'), alt('a', tea.ModCtrl),
ctrl('v'), alt(tea.KeyEnter, 0),
ctrl('v'), tea.KeyPressMsg{Code: tea.KeyUp}, tea.KeyPressMsg{Code: 'a', Text: "a"},
)
assert.Equal(t, "\x00\x1c\x1f\x1bx\x1bX\x1b\x01\x1b\ra", string(m.value), "an arrow has no bytes, so the quote waits for the next key")
assert.False(t, m.literal)
})
}

type fileWrapper struct {
io.Reader
f *os.File
}

func (w fileWrapper) File() (*os.File, bool) { return w.f, w.f != nil }

func Test_unwrapFile(t *testing.T) {
t.Parallel()
f, err := os.Open(os.DevNull)
require.NoError(t, err)
t.Cleanup(func() { _ = f.Close() })
t.Run("plain file", func(t *testing.T) {
t.Parallel()
got, ok := unwrapFile(f)
require.True(t, ok)
assert.Same(t, f, got)
})
t.Run("docker stream wrapper", func(t *testing.T) {
t.Parallel()
got, ok := unwrapFile(fileWrapper{Reader: &bytes.Buffer{}, f: f})
require.True(t, ok)
assert.Same(t, f, got)
})
t.Run("wrapper without a file", func(t *testing.T) {
t.Parallel()
_, ok := unwrapFile(fileWrapper{Reader: &bytes.Buffer{}})
assert.False(t, ok)
})
t.Run("buffer", func(t *testing.T) {
t.Parallel()
_, ok := unwrapFile(&bytes.Buffer{})
assert.False(t, ok)
})
}
Loading
Loading