From aac35d3cdda9043b6b14540bf465afa6cee5b390 Mon Sep 17 00:00:00 2001 From: Kairo de Araujo Date: Wed, 20 Dec 2023 17:00:04 +0100 Subject: [PATCH] tests: Include UT tests to pkg/api/download Add unit tests for `pkg/api/download` coverage as 85% Signed-off-by: Kairo de Araujo --- pkg/api/download.go | 2 +- pkg/api/download_test.go | 172 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 pkg/api/download_test.go diff --git a/pkg/api/download.go b/pkg/api/download.go index f6f86149..06c67883 100644 --- a/pkg/api/download.go +++ b/pkg/api/download.go @@ -56,7 +56,7 @@ func DownloadWithWriter(ctx context.Context, baseUrl, gitoid string, dst io.Writ hc := &http.Client{} resp, err := hc.Do(req) if err != nil { - return nil + return err } defer resp.Body.Close() diff --git a/pkg/api/download_test.go b/pkg/api/download_test.go new file mode 100644 index 00000000..000a6db4 --- /dev/null +++ b/pkg/api/download_test.go @@ -0,0 +1,172 @@ +// Copyright 2023 The Archivista Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package api_test + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "path" + "testing" + + "github.com/in-toto/archivista/pkg/api" + "github.com/in-toto/go-witness/dsse" + "github.com/stretchr/testify/suite" +) + +// Test Suite: UT APIDownload +type UTAPIDownloadSuite struct { + suite.Suite +} + +func TestAPIDownloadSuite(t *testing.T) { + suite.Run(t, new(UTAPIDownloadSuite)) +} + +func (ut *UTAPIDownloadSuite) Test_Download() { + + testEnvelope, err := os.ReadFile("../../test/package.attestation.json") + if err != nil { + ut.FailNow(err.Error()) + } + expectedEnvelop := dsse.Envelope{} + err = json.Unmarshal(testEnvelope, &expectedEnvelop) + if err != nil { + ut.FailNow(err.Error()) + } + + testServer := httptest.NewServer( + http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, err = w.Write(testEnvelope) + if err != nil { + ut.FailNow(err.Error()) + } + }, + ), + ) + defer testServer.Close() + ctx := context.TODO() + + // test api.Download happy flow + resp, err := api.Download(ctx, testServer.URL, "gitoid_test") + if err != nil { + ut.FailNow(err.Error()) + } + + ut.Equal(expectedEnvelop, resp) +} + +func (ut *UTAPIDownloadSuite) Test_Download_DecodeFailure() { + testServer := httptest.NewServer( + http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, err := w.Write([]byte(`invalid`)) + if err != nil { + ut.FailNow(err.Error()) + } + }, + ), + ) + defer testServer.Close() + ctx := context.TODO() + + // test api.Download happy flow + resp, err := api.Download(ctx, testServer.URL, "gitoid_test") + ut.Error(err) + ut.Equal(dsse.Envelope{}, resp) +} + +func (ut *UTAPIDownloadSuite) Test_DownloadWithReader() { + + // mock server + expected := `{"body":"body"}` + testServer := httptest.NewServer( + http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, err := w.Write([]byte(expected)) + if err != nil { + ut.FailNow(err.Error()) + } + }, + ), + ) + defer testServer.Close() + + // context + ctx := context.TODO() + + // temporary file + tempDir := os.TempDir() + dst, err := os.Create(path.Join(tempDir, "test")) + if err != nil { + ut.FailNow(err.Error()) + } + err = api.DownloadWithWriter(ctx, testServer.URL, "gitoid", dst) + if err != nil { + ut.FailNow(err.Error()) + } + + // validate result + result, err := os.ReadFile(path.Join(tempDir, "test")) + if err != nil { + ut.FailNow(err.Error()) + } + ut.Equal(expected, string(result)) +} + +func (ut *UTAPIDownloadSuite) Test_DownloadWithWriter_NoServer() { + + // context + ctx := context.TODO() + + // dst as stdout + var dst io.Writer = os.Stdout + + err := api.DownloadWithWriter(ctx, "http://invalid-archivista", "gitoid_test", dst) + ut.ErrorContains(err, "dial tcp: lookup invalid-archivista: no such host") +} + +func (ut *UTAPIDownloadSuite) Test_DownloadWithWriter_BadStatusCode() { + + // mock server + testServer := httptest.NewServer( + http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + _, err := w.Write([]byte(`Internal Server Error`)) + if err != nil { + ut.FailNow(err.Error()) + } + }, + ), + ) + defer testServer.Close() + + // dst as stdout + var dst io.Writer = os.Stdout + + // context + ctx := context.TODO() + + err := api.DownloadWithWriter(ctx, testServer.URL, "gitoid_test", dst) + ut.ErrorContains(err, "Internal Server Error") +}