From e2472edba56d56e0127f0d4ca23c9f6d461ad2ec Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:48:21 +0200 Subject: [PATCH 1/7] feat: Add quiet mode option for package download and update related tests --- cli/cmd/download_package.go | 6 ++-- cli/cmd/download_package_test.go | 3 +- cli/cmd/update_oms.go | 2 +- cli/cmd/update_oms_test.go | 4 +-- internal/portal/http.go | 14 +++++--- internal/portal/http_test.go | 52 +++++++++++++++++++++++++-- internal/portal/mocks.go | 19 +++++----- internal/portal/write_counter_test.go | 35 ++++++++++++++++++ internal/util/mocks.go | 3 +- 9 files changed, 114 insertions(+), 24 deletions(-) create mode 100644 internal/portal/write_counter_test.go diff --git a/cli/cmd/download_package.go b/cli/cmd/download_package.go index 7f5839f8..2a12e418 100644 --- a/cli/cmd/download_package.go +++ b/cli/cmd/download_package.go @@ -26,10 +26,11 @@ type DownloadPackageOpts struct { Version string Hash string Filename string + Quiet bool } func (c *DownloadPackageCmd) RunE(_ *cobra.Command, args []string) error { - if c.Opts.Hash != "" { + if c.Opts.Hash != "" { log.Printf("Downloading package '%s' with hash '%s'\n", c.Opts.Version, c.Opts.Hash) } else { log.Printf("Downloading package '%s'\n", c.Opts.Version) @@ -66,6 +67,7 @@ func AddDownloadPackageCmd(download *cobra.Command, opts GlobalOptions) { pkg.cmd.Flags().StringVarP(&pkg.Opts.Version, "version", "V", "", "Codesphere version to download") pkg.cmd.Flags().StringVarP(&pkg.Opts.Hash, "hash", "H", "", "Hash of the version to download if multiple builds exist for the same version") pkg.cmd.Flags().StringVarP(&pkg.Opts.Filename, "file", "f", "installer.tar.gz", "Specify artifact to download") + pkg.cmd.Flags().BoolVarP(&pkg.Opts.Quiet, "quiet", "q", false, "Suppress progress output during download") download.AddCommand(pkg.cmd) pkg.cmd.RunE = pkg.RunE @@ -83,7 +85,7 @@ func (c *DownloadPackageCmd) DownloadBuild(p portal.Portal, build portal.Build, } defer func() { _ = out.Close() }() - err = p.DownloadBuildArtifact("codesphere", download, out) + err = p.DownloadBuildArtifact("codesphere", download, out, c.Opts.Quiet) if err != nil { return fmt.Errorf("failed to download build: %w", err) } diff --git a/cli/cmd/download_package_test.go b/cli/cmd/download_package_test.go index 519a42ce..4d080b5c 100644 --- a/cli/cmd/download_package_test.go +++ b/cli/cmd/download_package_test.go @@ -36,6 +36,7 @@ var _ = Describe("ListPackages", func() { Opts: cmd.DownloadPackageOpts{ Version: version, Filename: filename, + Quiet: false, }, FileWriter: mockFileWriter, } @@ -63,7 +64,7 @@ var _ = Describe("ListPackages", func() { fakeFile := os.NewFile(uintptr(0), filename) mockFileWriter.EXPECT().Create(version+"-"+filename).Return(fakeFile, nil) - mockPortal.EXPECT().DownloadBuildArtifact(portal.CodesphereProduct, expectedBuildToDownload, mock.Anything).Return(nil) + mockPortal.EXPECT().DownloadBuildArtifact(portal.CodesphereProduct, expectedBuildToDownload, mock.Anything, false).Return(nil) err := c.DownloadBuild(mockPortal, build, filename) Expect(err).NotTo(HaveOccurred()) }) diff --git a/cli/cmd/update_oms.go b/cli/cmd/update_oms.go index 8d14b26a..19b937d9 100644 --- a/cli/cmd/update_oms.go +++ b/cli/cmd/update_oms.go @@ -80,7 +80,7 @@ func (c *UpdateOmsCmd) SelfUpdate(p portal.Portal) error { eg := errgroup.Group{} eg.Go(func() error { defer func() { _ = writer.Close() }() - err = p.DownloadBuildArtifact(portal.OmsProduct, download, writer) + err = p.DownloadBuildArtifact(portal.OmsProduct, download, writer, false) if err != nil { return fmt.Errorf("failed to download latest OMS package: %w", err) } diff --git a/cli/cmd/update_oms_test.go b/cli/cmd/update_oms_test.go index 0a895b82..5a776a66 100644 --- a/cli/cmd/update_oms_test.go +++ b/cli/cmd/update_oms_test.go @@ -67,8 +67,8 @@ var _ = Describe("Update", func() { mockVersion.EXPECT().Version().Return("0.0.0") mockVersion.EXPECT().Os().Return("fakeos") mockPortal.EXPECT().GetBuild(portal.OmsProduct, "", "").Return(latestBuild, nil) - mockPortal.EXPECT().DownloadBuildArtifact(portal.OmsProduct, buildToDownload, mock.Anything).RunAndReturn( - func(product portal.Product, build portal.Build, file io.Writer) error { + mockPortal.EXPECT().DownloadBuildArtifact(portal.OmsProduct, buildToDownload, mock.Anything, false).RunAndReturn( + func(product portal.Product, build portal.Build, file io.Writer, quiet bool) error { embeddedFile, err := testdata.Open("testdata/testcli.tar.gz") if err != nil { Expect(err).NotTo(HaveOccurred()) diff --git a/internal/portal/http.go b/internal/portal/http.go index 8f1a383f..72e40def 100644 --- a/internal/portal/http.go +++ b/internal/portal/http.go @@ -22,7 +22,7 @@ import ( type Portal interface { ListBuilds(product Product) (availablePackages Builds, err error) GetBuild(product Product, version string, hash string) (Build, error) - DownloadBuildArtifact(product Product, build Build, file io.Writer) error + DownloadBuildArtifact(product Product, build Build, file io.Writer, quiet bool) error RegisterAPIKey(owner string, organization string, role string, expiresAt time.Time) error RevokeAPIKey(key string) error UpdateAPIKey(key string, expiresAt time.Time) error @@ -176,7 +176,7 @@ func (c *PortalClient) GetBuild(product Product, version string, hash string) (B return matchingPackages[len(matchingPackages)-1], nil } -func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file io.Writer) error { +func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file io.Writer, quiet bool) error { reqBody, err := json.Marshal(build) if err != nil { return fmt.Errorf("failed to generate request body: %w", err) @@ -188,10 +188,14 @@ func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file } defer func() { _ = resp.Body.Close() }() - // Create a WriteCounter to wrap the output file and report progress. - counter := NewWriteCounter(file) + // Create a WriteCounter to wrap the output file and report progress, unless quiet is requested. + // Default behavior: report progress. Quiet callers should pass true for quiet. + var writer io.Writer = file + if !quiet { + writer = NewWriteCounter(file) + } - _, err = io.Copy(counter, resp.Body) + _, err = io.Copy(writer, resp.Body) if err != nil { return fmt.Errorf("failed to copy response body to file: %w", err) } diff --git a/internal/portal/http_test.go b/internal/portal/http_test.go index a4981ba9..8c8aebe3 100644 --- a/internal/portal/http_test.go +++ b/internal/portal/http_test.go @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "io" + "log" "net/http" "net/url" "time" @@ -30,6 +31,29 @@ func NewFakeWriter() *FakeWriter { return &FakeWriter{} } +// slowReader splits the data into chunks and sleeps between reads to simulate chunked download +type slowReader struct { + data []byte + pos int +} + +func (s *slowReader) Read(p []byte) (int, error) { + if s.pos >= len(s.data) { + return 0, io.EOF + } + + // chunk size + chunk := 5 + n := min(copy(p, s.data[s.pos:]), chunk) + + // simulate delay for subsequent chunks so WriteCounter can trigger an update + if s.pos > 0 { + time.Sleep(150 * time.Millisecond) + } + s.pos += n + return n, nil +} + var _ = Describe("PortalClient", func() { var ( client portal.PortalClient @@ -186,18 +210,42 @@ var _ = Describe("PortalClient", func() { getUrl = *req.URL return &http.Response{ StatusCode: status, - Body: io.NopCloser(bytes.NewReader([]byte(downloadResponse))), + Body: io.NopCloser(&slowReader{data: []byte(downloadResponse)}), }, nil }) }) It("downloads the build", func() { fakeWriter := NewFakeWriter() - err := client.DownloadBuildArtifact(product, build, fakeWriter) + err := client.DownloadBuildArtifact(product, build, fakeWriter, false) Expect(err).NotTo(HaveOccurred()) Expect(fakeWriter.String()).To(Equal(downloadResponse)) Expect(getUrl.String()).To(Equal("fake-portal.com/packages/codesphere/download")) }) + + It("emits progress logs when not quiet", func() { + var logBuf bytes.Buffer + prev := log.Writer() + log.SetOutput(&logBuf) + defer log.SetOutput(prev) + + fakeWriter := NewFakeWriter() + err := client.DownloadBuildArtifact(product, build, fakeWriter, false) + Expect(err).NotTo(HaveOccurred()) + Expect(logBuf.String()).To(ContainSubstring("Downloading...")) + }) + + It("does not emit progress logs when quiet", func() { + var logBuf bytes.Buffer + prev := log.Writer() + log.SetOutput(&logBuf) + defer log.SetOutput(prev) + + fakeWriter := NewFakeWriter() + err := client.DownloadBuildArtifact(product, build, fakeWriter, true) + Expect(err).NotTo(HaveOccurred()) + Expect(logBuf.String()).NotTo(ContainSubstring("Downloading...")) + }) }) Describe("GetLatestOmsBuild", func() { diff --git a/internal/portal/mocks.go b/internal/portal/mocks.go index 6b85a82b..b3087607 100644 --- a/internal/portal/mocks.go +++ b/internal/portal/mocks.go @@ -39,16 +39,16 @@ func (_m *MockPortal) EXPECT() *MockPortal_Expecter { } // DownloadBuildArtifact provides a mock function for the type MockPortal -func (_mock *MockPortal) DownloadBuildArtifact(product Product, build Build, file io.Writer) error { - ret := _mock.Called(product, build, file) +func (_mock *MockPortal) DownloadBuildArtifact(product Product, build Build, file io.Writer, quiet bool) error { + ret := _mock.Called(product, build, file, quiet) if len(ret) == 0 { panic("no return value specified for DownloadBuildArtifact") } var r0 error - if returnFunc, ok := ret.Get(0).(func(Product, Build, io.Writer) error); ok { - r0 = returnFunc(product, build, file) + if returnFunc, ok := ret.Get(0).(func(Product, Build, io.Writer, bool) error); ok { + r0 = returnFunc(product, build, file, quiet) } else { r0 = ret.Error(0) } @@ -64,13 +64,14 @@ type MockPortal_DownloadBuildArtifact_Call struct { // - product // - build // - file -func (_e *MockPortal_Expecter) DownloadBuildArtifact(product interface{}, build interface{}, file interface{}) *MockPortal_DownloadBuildArtifact_Call { - return &MockPortal_DownloadBuildArtifact_Call{Call: _e.mock.On("DownloadBuildArtifact", product, build, file)} +// - quiet +func (_e *MockPortal_Expecter) DownloadBuildArtifact(product interface{}, build interface{}, file interface{}, quiet interface{}) *MockPortal_DownloadBuildArtifact_Call { + return &MockPortal_DownloadBuildArtifact_Call{Call: _e.mock.On("DownloadBuildArtifact", product, build, file, quiet)} } -func (_c *MockPortal_DownloadBuildArtifact_Call) Run(run func(product Product, build Build, file io.Writer)) *MockPortal_DownloadBuildArtifact_Call { +func (_c *MockPortal_DownloadBuildArtifact_Call) Run(run func(product Product, build Build, file io.Writer, quiet bool)) *MockPortal_DownloadBuildArtifact_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(Product), args[1].(Build), args[2].(io.Writer)) + run(args[0].(Product), args[1].(Build), args[2].(io.Writer), args[3].(bool)) }) return _c } @@ -80,7 +81,7 @@ func (_c *MockPortal_DownloadBuildArtifact_Call) Return(err error) *MockPortal_D return _c } -func (_c *MockPortal_DownloadBuildArtifact_Call) RunAndReturn(run func(product Product, build Build, file io.Writer) error) *MockPortal_DownloadBuildArtifact_Call { +func (_c *MockPortal_DownloadBuildArtifact_Call) RunAndReturn(run func(product Product, build Build, file io.Writer, quiet bool) error) *MockPortal_DownloadBuildArtifact_Call { _c.Call.Return(run) return _c } diff --git a/internal/portal/write_counter_test.go b/internal/portal/write_counter_test.go new file mode 100644 index 00000000..437b423a --- /dev/null +++ b/internal/portal/write_counter_test.go @@ -0,0 +1,35 @@ +// Copyright (c) Codesphere Inc. +// SPDX-License-Identifier: Apache-2.0 + +package portal + +import ( + "bytes" + "log" + "testing" + "time" +) + +func TestWriteCounterEmitsProgress(t *testing.T) { + // capture log output + var logBuf bytes.Buffer + prev := log.Writer() + log.SetOutput(&logBuf) + defer log.SetOutput(prev) + + var underlying bytes.Buffer + wc := NewWriteCounter(&underlying) + + // force an update by setting LastUpdate sufficiently in the past + wc.LastUpdate = time.Now().Add(-200 * time.Millisecond) + + _, err := wc.Write([]byte("hello world")) + if err != nil { + t.Fatalf("write failed: %v", err) + } + + out := logBuf.String() + if out == "" { + t.Fatalf("expected progress log output, got none") + } +} diff --git a/internal/util/mocks.go b/internal/util/mocks.go index c9fcabf6..23487339 100644 --- a/internal/util/mocks.go +++ b/internal/util/mocks.go @@ -5,10 +5,9 @@ package util import ( - "os" - "github.com/jedib0t/go-pretty/v6/table" mock "github.com/stretchr/testify/mock" + "os" ) // NewMockFileIO creates a new instance of MockFileIO. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. From 774e70f458fba870a0b2166edfdbd78f84287ae1 Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:57:57 +0200 Subject: [PATCH 2/7] fix: writer assignment in DownloadBuildArtifact --- internal/portal/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/portal/http.go b/internal/portal/http.go index 72e40def..d30f08cc 100644 --- a/internal/portal/http.go +++ b/internal/portal/http.go @@ -190,7 +190,7 @@ func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file // Create a WriteCounter to wrap the output file and report progress, unless quiet is requested. // Default behavior: report progress. Quiet callers should pass true for quiet. - var writer io.Writer = file + writer := file if !quiet { writer = NewWriteCounter(file) } From 51ba8ccc9eda6f31a8249d5a46234cd8a230095d Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:05:38 +0200 Subject: [PATCH 3/7] fix: Adjust WriteCounter behavior and test timing --- internal/portal/http.go | 6 +++--- internal/portal/http_test.go | 2 +- internal/portal/write_counter_test.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/portal/http.go b/internal/portal/http.go index d30f08cc..e261055b 100644 --- a/internal/portal/http.go +++ b/internal/portal/http.go @@ -190,12 +190,12 @@ func (c *PortalClient) DownloadBuildArtifact(product Product, build Build, file // Create a WriteCounter to wrap the output file and report progress, unless quiet is requested. // Default behavior: report progress. Quiet callers should pass true for quiet. - writer := file + counter := file if !quiet { - writer = NewWriteCounter(file) + counter = NewWriteCounter(file) } - _, err = io.Copy(writer, resp.Body) + _, err = io.Copy(counter, resp.Body) if err != nil { return fmt.Errorf("failed to copy response body to file: %w", err) } diff --git a/internal/portal/http_test.go b/internal/portal/http_test.go index 8c8aebe3..9d2b1d05 100644 --- a/internal/portal/http_test.go +++ b/internal/portal/http_test.go @@ -48,7 +48,7 @@ func (s *slowReader) Read(p []byte) (int, error) { // simulate delay for subsequent chunks so WriteCounter can trigger an update if s.pos > 0 { - time.Sleep(150 * time.Millisecond) + time.Sleep(50 * time.Millisecond) } s.pos += n return n, nil diff --git a/internal/portal/write_counter_test.go b/internal/portal/write_counter_test.go index 437b423a..3b35aca3 100644 --- a/internal/portal/write_counter_test.go +++ b/internal/portal/write_counter_test.go @@ -21,7 +21,7 @@ func TestWriteCounterEmitsProgress(t *testing.T) { wc := NewWriteCounter(&underlying) // force an update by setting LastUpdate sufficiently in the past - wc.LastUpdate = time.Now().Add(-200 * time.Millisecond) + wc.LastUpdate = time.Now().Add(-time.Second) _, err := wc.Write([]byte("hello world")) if err != nil { From 54fa58afcbf5f8e0774ecc5c73cfd622a765c6ed Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:23:02 +0200 Subject: [PATCH 4/7] refactor: Change WriteCounter test to use Ginkgo --- internal/portal/write_counter_test.go | 52 ++++++++++++++------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/internal/portal/write_counter_test.go b/internal/portal/write_counter_test.go index 3b35aca3..dad493b0 100644 --- a/internal/portal/write_counter_test.go +++ b/internal/portal/write_counter_test.go @@ -1,35 +1,37 @@ // Copyright (c) Codesphere Inc. // SPDX-License-Identifier: Apache-2.0 -package portal +package portal_test import ( "bytes" "log" - "testing" "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/codesphere-cloud/oms/internal/portal" ) -func TestWriteCounterEmitsProgress(t *testing.T) { - // capture log output - var logBuf bytes.Buffer - prev := log.Writer() - log.SetOutput(&logBuf) - defer log.SetOutput(prev) - - var underlying bytes.Buffer - wc := NewWriteCounter(&underlying) - - // force an update by setting LastUpdate sufficiently in the past - wc.LastUpdate = time.Now().Add(-time.Second) - - _, err := wc.Write([]byte("hello world")) - if err != nil { - t.Fatalf("write failed: %v", err) - } - - out := logBuf.String() - if out == "" { - t.Fatalf("expected progress log output, got none") - } -} +var _ = Describe("WriteCounter", func() { + It("emits progress logs on write", func() { + // capture log output + var logBuf bytes.Buffer + prev := log.Writer() + log.SetOutput(&logBuf) + defer log.SetOutput(prev) + + var underlying bytes.Buffer + wc := portal.NewWriteCounter(&underlying) + + // force an update by setting LastUpdate sufficiently in the past + wc.LastUpdate = time.Now().Add(-time.Second) + + _, err := wc.Write([]byte("hello world")) + Expect(err).NotTo(HaveOccurred()) + + out := logBuf.String() + Expect(out).NotTo(BeEmpty()) + }) +}) From b27c3c1e09338569a7eea8dbc73c5dd9e7561b3d Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:39:15 +0200 Subject: [PATCH 5/7] fix: Improve slowReader behavior in tests --- internal/portal/http_test.go | 17 ++++++++++++++++- internal/portal/write_counter.go | 5 +++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/internal/portal/http_test.go b/internal/portal/http_test.go index 9d2b1d05..d95095b7 100644 --- a/internal/portal/http_test.go +++ b/internal/portal/http_test.go @@ -37,6 +37,8 @@ type slowReader struct { pos int } +var slowReaderSleep = func(d time.Duration) { time.Sleep(d) } + func (s *slowReader) Read(p []byte) (int, error) { if s.pos >= len(s.data) { return 0, io.EOF @@ -48,7 +50,7 @@ func (s *slowReader) Read(p []byte) (int, error) { // simulate delay for subsequent chunks so WriteCounter can trigger an update if s.pos > 0 { - time.Sleep(50 * time.Millisecond) + slowReaderSleep(50 * time.Millisecond) } s.pos += n return n, nil @@ -196,6 +198,19 @@ var _ = Describe("PortalClient", func() { build portal.Build downloadResponse string ) + + var _origSlowReaderSleep = slowReaderSleep + + BeforeEach(func() { + // override to avoid real delays in tests + slowReaderSleep = func(d time.Duration) { /* no-op for tests */ } + }) + + AfterEach(func() { + // restore original behavior + slowReaderSleep = _origSlowReaderSleep + }) + BeforeEach(func() { buildDate, _ := time.Parse("2006-01-02", "2025-05-01") diff --git a/internal/portal/write_counter.go b/internal/portal/write_counter.go index 51c56a8c..2a427182 100644 --- a/internal/portal/write_counter.go +++ b/internal/portal/write_counter.go @@ -21,8 +21,9 @@ type WriteCounter struct { // NewWriteCounter creates a new WriteCounter. func NewWriteCounter(writer io.Writer) *WriteCounter { return &WriteCounter{ - Writer: writer, - LastUpdate: time.Now(), // Initialize last update time + Writer: writer, + // Initialize to zero so the first Write triggers an immediate log + LastUpdate: time.Time{}, } } From 378c6dac8893be782298cda2833a2c3a6d205d68 Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:15:20 +0200 Subject: [PATCH 6/7] refactor(tests): remove slowReader and related sleep logic for faster test execution --- internal/portal/http_test.go | 39 ++---------------------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/internal/portal/http_test.go b/internal/portal/http_test.go index d95095b7..f020c534 100644 --- a/internal/portal/http_test.go +++ b/internal/portal/http_test.go @@ -31,31 +31,6 @@ func NewFakeWriter() *FakeWriter { return &FakeWriter{} } -// slowReader splits the data into chunks and sleeps between reads to simulate chunked download -type slowReader struct { - data []byte - pos int -} - -var slowReaderSleep = func(d time.Duration) { time.Sleep(d) } - -func (s *slowReader) Read(p []byte) (int, error) { - if s.pos >= len(s.data) { - return 0, io.EOF - } - - // chunk size - chunk := 5 - n := min(copy(p, s.data[s.pos:]), chunk) - - // simulate delay for subsequent chunks so WriteCounter can trigger an update - if s.pos > 0 { - slowReaderSleep(50 * time.Millisecond) - } - s.pos += n - return n, nil -} - var _ = Describe("PortalClient", func() { var ( client portal.PortalClient @@ -199,17 +174,7 @@ var _ = Describe("PortalClient", func() { downloadResponse string ) - var _origSlowReaderSleep = slowReaderSleep - - BeforeEach(func() { - // override to avoid real delays in tests - slowReaderSleep = func(d time.Duration) { /* no-op for tests */ } - }) - - AfterEach(func() { - // restore original behavior - slowReaderSleep = _origSlowReaderSleep - }) + // No artificial sleeps needed for the slowReader in tests. BeforeEach(func() { buildDate, _ := time.Parse("2006-01-02", "2025-05-01") @@ -225,7 +190,7 @@ var _ = Describe("PortalClient", func() { getUrl = *req.URL return &http.Response{ StatusCode: status, - Body: io.NopCloser(&slowReader{data: []byte(downloadResponse)}), + Body: io.NopCloser(bytes.NewReader([]byte(downloadResponse))), }, nil }) }) From ee162c83f68322fd78bca6d4d913fd8d82ffd50a Mon Sep 17 00:00:00 2001 From: OliverTrautvetter <66372584+OliverTrautvetter@users.noreply.github.com> Date: Fri, 17 Oct 2025 14:16:27 +0200 Subject: [PATCH 7/7] fix remove old comment --- internal/portal/http_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/portal/http_test.go b/internal/portal/http_test.go index f020c534..9aff801d 100644 --- a/internal/portal/http_test.go +++ b/internal/portal/http_test.go @@ -174,8 +174,6 @@ var _ = Describe("PortalClient", func() { downloadResponse string ) - // No artificial sleeps needed for the slowReader in tests. - BeforeEach(func() { buildDate, _ := time.Parse("2006-01-02", "2025-05-01")