Tests for CLI (#6)
* Completed List cmd and added API calls * Minor comments and add delete code to pass linting * Typo in descriptions * Minor comments * Validations * Validations-1 * improved branch flag validation * removed build * working after refactory with bad names * Command working, test not working * Corrected creation of service * Finalized structure using service * Deleted tests * cleanup * cleanup * cleanup * removed space with tab * aligned types in model.go * Update model.go * resolved comments * Refactor * removed long descriptions * Working incomplete tests * Completed tests * cleanup * checks * PR comments * PR comments * minor comment issue * minor comment issue * updated tests to work with workflow * Updated tests to support new option service * Improved eror handling for list * Improved error handling * Upgraded go-gh * reusing rest client error
This commit is contained in:
@@ -1,9 +1,7 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"net/url"
|
||||
"strconv"
|
||||
@@ -15,10 +13,10 @@ import (
|
||||
)
|
||||
|
||||
type ArtifactCacheService interface {
|
||||
GetCacheUsage() float64
|
||||
ListCaches(queryParams url.Values) types.ListApiResponse
|
||||
DeleteCaches(queryParams url.Values) int
|
||||
ListAllCaches(queryParams url.Values, key string) []types.ActionsCache
|
||||
GetCacheUsage() (float64, error)
|
||||
ListCaches(queryParams url.Values) (types.ListApiResponse, error)
|
||||
DeleteCaches(queryParams url.Values) (int, error)
|
||||
ListAllCaches(queryParams url.Values, key string) ([]types.ActionsCache, error)
|
||||
}
|
||||
|
||||
type ArtifactCache struct {
|
||||
@@ -26,66 +24,69 @@ type ArtifactCache struct {
|
||||
repo ghRepo.Repository
|
||||
}
|
||||
|
||||
func NewArtifactCache(repo ghRepo.Repository, command string, version string) ArtifactCacheService {
|
||||
func NewArtifactCache(repo ghRepo.Repository, command string, version string) (ArtifactCacheService, error) {
|
||||
opts := api.ClientOptions{
|
||||
Host: repo.Host(),
|
||||
Headers: map[string]string{"User-Agent": fmt.Sprintf("gh-actions-cache/%s/%s", version, command)},
|
||||
}
|
||||
restClient, err := gh.RESTClient(&opts)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return nil, err
|
||||
}
|
||||
return &ArtifactCache{HttpClient: restClient, repo: repo}
|
||||
return &ArtifactCache{HttpClient: restClient, repo: repo}, nil
|
||||
}
|
||||
|
||||
func (a *ArtifactCache) GetCacheUsage() float64 {
|
||||
func (a *ArtifactCache) GetCacheUsage() (float64, error) {
|
||||
pathComponent := fmt.Sprintf("repos/%s/%s/actions/cache/usage", a.repo.Owner(), a.repo.Name())
|
||||
var apiResults types.RepoLevelUsageApiResponse
|
||||
err := a.HttpClient.Get(pathComponent, &apiResults)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return -1, err
|
||||
}
|
||||
|
||||
return apiResults.ActiveCacheSizeInBytes
|
||||
return apiResults.ActiveCacheSizeInBytes, nil
|
||||
}
|
||||
|
||||
func (a *ArtifactCache) ListCaches(queryParams url.Values) types.ListApiResponse {
|
||||
func (a *ArtifactCache) ListCaches(queryParams url.Values) (types.ListApiResponse, error) {
|
||||
pathComponent := fmt.Sprintf("repos/%s/%s/actions/caches", a.repo.Owner(), a.repo.Name())
|
||||
var apiResults types.ListApiResponse
|
||||
err := a.HttpClient.Get(pathComponent+"?"+queryParams.Encode(), &apiResults)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return types.ListApiResponse{}, err
|
||||
}
|
||||
|
||||
return apiResults
|
||||
return apiResults, nil
|
||||
}
|
||||
|
||||
func (a *ArtifactCache) DeleteCaches(queryParams url.Values) int {
|
||||
func (a *ArtifactCache) DeleteCaches(queryParams url.Values) (int, error) {
|
||||
pathComponent := fmt.Sprintf("repos/%s/%s/actions/caches", a.repo.Owner(), a.repo.Name())
|
||||
var apiResults types.DeleteApiResponse
|
||||
err := a.HttpClient.Delete(pathComponent+"?"+queryParams.Encode(), &apiResults)
|
||||
if err != nil {
|
||||
var httpError api.HTTPError
|
||||
if errors.As(err, &httpError) && httpError.StatusCode == 404 {
|
||||
return 0
|
||||
} else {
|
||||
log.Fatal(err)
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
return apiResults.TotalCount
|
||||
return apiResults.TotalCount, nil
|
||||
}
|
||||
|
||||
func (a *ArtifactCache) ListAllCaches(queryParams url.Values, key string) []types.ActionsCache {
|
||||
func (a *ArtifactCache) ListAllCaches(queryParams url.Values, key string) ([]types.ActionsCache, error) {
|
||||
var listApiResponse types.ListApiResponse
|
||||
listApiResponse = a.ListCaches(queryParams)
|
||||
listApiResponse, err := a.ListCaches(queryParams)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
caches := listApiResponse.ActionsCaches
|
||||
totalCaches := listApiResponse.TotalCount
|
||||
if totalCaches > 100 {
|
||||
for page := 2; page <= int(math.Ceil(float64(listApiResponse.TotalCount)/100)); page++ {
|
||||
queryParams.Set("page", strconv.Itoa(page))
|
||||
listApiResponse = a.ListCaches(queryParams)
|
||||
listApiResponse, err := a.ListCaches(queryParams)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
caches = append(caches, listApiResponse.ActionsCaches...)
|
||||
}
|
||||
}
|
||||
return caches
|
||||
return caches, nil
|
||||
}
|
||||
|
||||
199
service/actions_cache_test.go
Normal file
199
service/actions_cache_test.go
Normal file
@@ -0,0 +1,199 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/url"
|
||||
"testing"
|
||||
|
||||
"github.com/actions/gh-actions-cache/internal"
|
||||
"github.com/actions/gh-actions-cache/types"
|
||||
"github.com/cli/go-gh/pkg/api"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gopkg.in/h2non/gock.v1"
|
||||
)
|
||||
|
||||
const VERSION string = "0.0.1"
|
||||
|
||||
func TestGetCacheUsage_CorrectRepo(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Get("/repos/testOrg/testRepo/actions/cache/usage").
|
||||
Reply(200).
|
||||
JSON(`{
|
||||
"full_name": "testOrg/testRepo",
|
||||
"active_caches_size_in_bytes": 291205,
|
||||
"active_caches_count": 12
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/testRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "list", VERSION)
|
||||
assert.Nil(t, err)
|
||||
totalCacheSize, err := artifactCache.GetCacheUsage()
|
||||
|
||||
assert.Equal(t, totalCacheSize, float64(291205))
|
||||
assert.Nil(t, err)
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
|
||||
func TestGetCacheUsage_IncorrectRepo(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Get("/repos/testOrg/wrongRepo/actions/cache/usage").
|
||||
Reply(404).
|
||||
JSON(`{
|
||||
"message": "Not Found",
|
||||
"documentation_url": "https://docs.github.com/rest/reference/actions#get-github-actions-cache-usage-for-a-repository"
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/wrongRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "list", VERSION)
|
||||
assert.Nil(t, err)
|
||||
totalCacheSize, err := artifactCache.GetCacheUsage()
|
||||
var httpError api.HTTPError
|
||||
errors.As(err, &httpError)
|
||||
|
||||
assert.NotNil(t, err)
|
||||
assert.Equal(t, httpError.StatusCode, 404)
|
||||
assert.Equal(t, httpError.Message, "Not Found")
|
||||
assert.Equal(t, totalCacheSize, float64(-1))
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
|
||||
func TestListCaches_Success(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Get("/repos/testOrg/testRepo/actions/caches").
|
||||
Reply(200).
|
||||
JSON(`{
|
||||
"total_count": 1,
|
||||
"actions_caches": [
|
||||
{
|
||||
"id": 29,
|
||||
"ref": "refs/heads/master",
|
||||
"key": "Linux-build-cache-node-modules-3fd22dd3a926d576e2562e8b76a5ff157cd3b986f3d44195acfe7efa6bc05919-8",
|
||||
"version": "7fcda33c1e1d849a13bcc06f49b9ab64efc01ca9dabe4d7a8d0d387feef4fc88",
|
||||
"last_accessed_at": "2022-06-22T20:32:45.550000000Z",
|
||||
"created_at": "2022-06-22T20:32:45.550000000Z",
|
||||
"size_in_bytes": 2432967
|
||||
}]
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/testRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
f := types.ListOptions{BaseOptions: types.BaseOptions{Repo: "testOrg/testRepo"}, Limit: 30}
|
||||
queryParams := url.Values{}
|
||||
f.GenerateQueryParams(queryParams)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "list", VERSION)
|
||||
assert.Nil(t, err)
|
||||
listCacheResponse, err := artifactCache.ListCaches(queryParams)
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.NotNil(t, listCacheResponse)
|
||||
assert.Equal(t, listCacheResponse.TotalCount, 1)
|
||||
assert.Equal(t, len(listCacheResponse.ActionsCaches), 1)
|
||||
assert.Equal(t, listCacheResponse.ActionsCaches[0].Id, 29)
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
|
||||
func TestListCaches_Failure(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Get("/repos/testOrg/testRepo/actions/caches").
|
||||
Reply(404).
|
||||
JSON(`{
|
||||
"message": "Not Found",
|
||||
"documentation_url": "https://docs.github.com/rest/reference/actions#get-github-actions-cache-list-for-a-repository"
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/testRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
f := types.ListOptions{BaseOptions: types.BaseOptions{Repo: "testOrg/testRepo"}, Limit: 30}
|
||||
queryParams := url.Values{}
|
||||
f.GenerateQueryParams(queryParams)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "list", VERSION)
|
||||
assert.Nil(t, err)
|
||||
listCacheResponse, err := artifactCache.ListCaches(queryParams)
|
||||
var httpError api.HTTPError
|
||||
errors.As(err, &httpError)
|
||||
|
||||
assert.NotNil(t, err)
|
||||
assert.Equal(t, httpError.StatusCode, 404)
|
||||
assert.Equal(t, httpError.Message, "Not Found")
|
||||
assert.Equal(t, listCacheResponse, types.ListApiResponse{})
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
|
||||
func TestDeleteCaches_Success(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Delete("/repos/testOrg/testRepo/actions/caches").
|
||||
Reply(200).
|
||||
JSON(`{
|
||||
"total_count": 1,
|
||||
"actions_caches": [
|
||||
{
|
||||
"id": 29,
|
||||
"ref": "refs/heads/master",
|
||||
"key": "Linux-build-cache-node-modules-3fd22dd3a926d576e2562e8b76a5ff157cd3b986f3d44195acfe7efa6bc05919-8",
|
||||
"version": "7fcda33c1e1d849a13bcc06f49b9ab64efc01ca9dabe4d7a8d0d387feef4fc88",
|
||||
"last_accessed_at": "2022-06-22T20:32:45.550000000Z",
|
||||
"created_at": "2022-06-22T20:32:45.550000000Z",
|
||||
"size_in_bytes": 2432967
|
||||
}]
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/testRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
f := types.DeleteOptions{BaseOptions: types.BaseOptions{Repo: "testOrg/testRepo"}}
|
||||
queryParams := url.Values{}
|
||||
f.GenerateBaseQueryParams(queryParams)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "delete", VERSION)
|
||||
assert.Nil(t, err)
|
||||
deletedCache, err := artifactCache.DeleteCaches(queryParams)
|
||||
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, deletedCache, 1)
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
|
||||
func TestDeleteCaches_Failure(t *testing.T) {
|
||||
t.Cleanup(gock.Off)
|
||||
|
||||
gock.New("https://api.github.com").
|
||||
Delete("/repos/testOrg/testRepo/actions/caches").
|
||||
Reply(404).
|
||||
JSON(`{
|
||||
"message": "Not Found",
|
||||
"documentation_url": "https://docs.github.com/rest/reference/actions#get-github-actions-cache-list-for-a-repository"
|
||||
}`)
|
||||
|
||||
repo, err := internal.GetRepo("testOrg/testRepo")
|
||||
assert.Nil(t, err)
|
||||
|
||||
f := types.DeleteOptions{BaseOptions: types.BaseOptions{Repo: "testOrg/testRepo"}}
|
||||
queryParams := url.Values{}
|
||||
f.GenerateBaseQueryParams(queryParams)
|
||||
|
||||
artifactCache, err := NewArtifactCache(repo, "delete", VERSION)
|
||||
assert.Nil(t, err)
|
||||
deletedCache, err := artifactCache.DeleteCaches(queryParams)
|
||||
|
||||
assert.NotNil(t, err)
|
||||
assert.Equal(t, deletedCache, 0)
|
||||
assert.True(t, gock.IsDone(), internal.PrintPendingMocks(gock.Pending()))
|
||||
}
|
||||
Reference in New Issue
Block a user