Skip to content

Commit

Permalink
tests: Include UT tests to pkg/api/download
Browse files Browse the repository at this point in the history
Add unit tests for `pkg/api/download` coverage as 85%

Signed-off-by: Kairo de Araujo <kairo.araujo@testifysec.com>
  • Loading branch information
kairoaraujo committed Dec 20, 2023
1 parent a8035c3 commit aac35d3
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pkg/api/download.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
172 changes: 172 additions & 0 deletions pkg/api/download_test.go
Original file line number Diff line number Diff line change
@@ -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")
}

0 comments on commit aac35d3

Please sign in to comment.