mirror of
https://github.com/goharbor/harbor.git
synced 2024-12-23 09:08:26 +01:00
Add more unit tests
Signed-off-by: 陈德 <chende@caicloud.io>
This commit is contained in:
parent
b648084d95
commit
a1b4729aa7
@ -235,3 +235,30 @@ func TestGetRolesByLDAPGroup(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestProjetExistsByName(t *testing.T) {
|
||||
name := "project_exist_by_name_test"
|
||||
exist := ProjectExistsByName(name)
|
||||
if exist {
|
||||
t.Errorf("project %s expected to be not exist", name)
|
||||
}
|
||||
|
||||
project := models.Project{
|
||||
OwnerID: currentUser.UserID,
|
||||
Name: name,
|
||||
}
|
||||
id, err := AddProject(project)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to add project: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if err := delProjPermanent(id); err != nil {
|
||||
t.Errorf("failed to clear up project %d: %v", id, err)
|
||||
}
|
||||
}()
|
||||
|
||||
exist = ProjectExistsByName(name)
|
||||
if !exist {
|
||||
t.Errorf("project %s expected to be exist", name)
|
||||
}
|
||||
}
|
||||
|
@ -206,3 +206,17 @@ func TestModifyOfStandardTokenAuthorizer(t *testing.T) {
|
||||
tk := req.Header.Get("Authorization")
|
||||
assert.Equal(t, strings.ToLower("Bearer "+token.Token), strings.ToLower(tk))
|
||||
}
|
||||
|
||||
func TestUserAgentModifier(t *testing.T) {
|
||||
agent := "harbor-registry-client"
|
||||
modifier := &UserAgentModifier{
|
||||
UserAgent: agent,
|
||||
}
|
||||
req, err := http.NewRequest(http.MethodGet, "http://registry/v2/", nil)
|
||||
require.Nil(t, err)
|
||||
modifier.Modify(req)
|
||||
actual := req.Header.Get("User-Agent")
|
||||
if actual != agent {
|
||||
t.Errorf("expect request to have header User-Agent=%s, but got User-Agent=%s", agent, actual)
|
||||
}
|
||||
}
|
||||
|
@ -422,3 +422,37 @@ func TestBuildMonolithicBlobUploadURL(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
assert.Equal(t, expected, url)
|
||||
}
|
||||
|
||||
func TestBuildMountBlobURL(t *testing.T) {
|
||||
endpoint := "http://192.169.0.1"
|
||||
repoName := "library/hello-world"
|
||||
digest := "sha256:ef15416724f6e2d5d5b422dc5105add931c1f2a45959cd4993e75e47957b3b55"
|
||||
from := "library/hi-world"
|
||||
expected := fmt.Sprintf("%s/v2/%s/blobs/uploads/?mount=%s&from=%s", endpoint, repoName, digest, from)
|
||||
|
||||
actual := buildMountBlobURL(endpoint, repoName, digest, from)
|
||||
assert.Equal(t, expected, actual)
|
||||
}
|
||||
|
||||
func TestMountBlob(t *testing.T) {
|
||||
mountHandler := func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusAccepted)
|
||||
}
|
||||
|
||||
server := test.NewServer(
|
||||
&test.RequestHandlerMapping{
|
||||
Method: "POST",
|
||||
Pattern: fmt.Sprintf("/v2/%s/blobs/uploads/", repository),
|
||||
Handler: mountHandler,
|
||||
})
|
||||
defer server.Close()
|
||||
|
||||
client, err := newRepository(server.URL)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create client for repository: %v", err)
|
||||
}
|
||||
|
||||
if err = client.MountBlob(digest, "library/hi-world"); err != nil {
|
||||
t.Fatalf("failed to mount blob: %v", err)
|
||||
}
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ func init() {
|
||||
beego.Router("/api/repositories/*/tags/:tag/labels", &RepositoryLabelAPI{}, "get:GetOfImage;post:AddToImage")
|
||||
beego.Router("/api/repositories/*/tags/:tag/labels/:id([0-9]+", &RepositoryLabelAPI{}, "delete:RemoveFromImage")
|
||||
beego.Router("/api/repositories/*/tags/:tag", &RepositoryAPI{}, "delete:Delete;get:GetTag")
|
||||
beego.Router("/api/repositories/*/tags", &RepositoryAPI{}, "get:GetTags")
|
||||
beego.Router("/api/repositories/*/tags", &RepositoryAPI{}, "get:GetTags;post:Retag")
|
||||
beego.Router("/api/repositories/*/tags/:tag/manifest", &RepositoryAPI{}, "get:GetManifests")
|
||||
beego.Router("/api/repositories/*/signatures", &RepositoryAPI{}, "get:GetSignatures")
|
||||
beego.Router("/api/repositories/top", &RepositoryAPI{}, "get:GetTopRepos")
|
||||
@ -617,6 +617,19 @@ func (a testapi) GetReposTags(authInfo usrInfo, repoName string) (int, interface
|
||||
return http.StatusOK, result, nil
|
||||
}
|
||||
|
||||
// RetagImage retag image to another tag
|
||||
func (a testapi) RetagImage(authInfo usrInfo, repoName string, retag *apilib.Retag) (int, error) {
|
||||
_sling := sling.New().Post(a.basePath)
|
||||
|
||||
path := fmt.Sprintf("/api/repositories/%s/tags", repoName)
|
||||
|
||||
_sling = _sling.Path(path)
|
||||
_sling = _sling.BodyJSON(retag)
|
||||
|
||||
httpStatusCode, _, err := request(_sling, jsonAcceptHeader, authInfo)
|
||||
return httpStatusCode, err
|
||||
}
|
||||
|
||||
// Get manifests of a relevant repository
|
||||
func (a testapi) GetReposManifests(authInfo usrInfo, repoName string, tag string) (int, error) {
|
||||
_sling := sling.New().Get(a.basePath)
|
||||
|
@ -21,6 +21,7 @@ import (
|
||||
"github.com/goharbor/harbor/src/common/dao"
|
||||
"github.com/goharbor/harbor/src/common/dao/project"
|
||||
"github.com/goharbor/harbor/src/common/models"
|
||||
"github.com/goharbor/harbor/tests/apitests/apilib"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@ -348,3 +349,96 @@ func TestPutOfRepository(t *testing.T) {
|
||||
require.NotNil(t, repository)
|
||||
assert.Equal(t, desc.Description, repository.Description)
|
||||
}
|
||||
|
||||
func TestRetag(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
apiTest := newHarborAPI()
|
||||
repo := "library/hello-world"
|
||||
|
||||
fmt.Println("Testing Image Retag API")
|
||||
// -------------------case 1 : response code = 200------------------------//
|
||||
fmt.Println("case 1 : response code = 200")
|
||||
retagReq := &apilib.Retag{
|
||||
Tag: "prd",
|
||||
SrcImage: "library/hello-world:latest",
|
||||
Override: true,
|
||||
}
|
||||
code, err := apiTest.RetagImage(*admin, repo, retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(200), code, "response code should be 200")
|
||||
}
|
||||
|
||||
// -------------------case 2 : response code = 400------------------------//
|
||||
fmt.Println("case 2 : response code = 400: invalid image value provided")
|
||||
retagReq = &apilib.Retag{
|
||||
Tag: "prd",
|
||||
SrcImage: "hello-world:latest",
|
||||
Override: true,
|
||||
}
|
||||
httpStatusCode, err := apiTest.RetagImage(*admin, repo, retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(400), httpStatusCode, "httpStatusCode should be 400")
|
||||
}
|
||||
|
||||
// -------------------case 3 : response code = 404------------------------//
|
||||
fmt.Println("case 3 : response code = 404: source image not exist")
|
||||
retagReq = &apilib.Retag{
|
||||
Tag: "prd",
|
||||
SrcImage: "release/hello-world:notexist",
|
||||
Override: true,
|
||||
}
|
||||
httpStatusCode, err = apiTest.RetagImage(*admin, repo, retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(404), httpStatusCode, "httpStatusCode should be 404")
|
||||
}
|
||||
|
||||
// -------------------case 4 : response code = 404------------------------//
|
||||
fmt.Println("case 4 : response code = 404: target project not exist")
|
||||
retagReq = &apilib.Retag{
|
||||
Tag: "prd",
|
||||
SrcImage: "library/hello-world:latest",
|
||||
Override: true,
|
||||
}
|
||||
httpStatusCode, err = apiTest.RetagImage(*admin, "nonexist/hello-world", retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(404), httpStatusCode, "httpStatusCode should be 404")
|
||||
}
|
||||
|
||||
// -------------------case 5 : response code = 401------------------------//
|
||||
fmt.Println("case 5 : response code = 401, unathorized")
|
||||
retagReq = &apilib.Retag{
|
||||
Tag: "prd",
|
||||
SrcImage: "library/hello-world:latest",
|
||||
Override: true,
|
||||
}
|
||||
httpStatusCode, err = apiTest.RetagImage(*unknownUsr, repo, retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(401), httpStatusCode, "httpStatusCode should be 401")
|
||||
}
|
||||
|
||||
// -------------------case 6 : response code = 409------------------------//
|
||||
fmt.Println("case 6 : response code = 409, conflict")
|
||||
retagReq = &apilib.Retag{
|
||||
Tag: "latest",
|
||||
SrcImage: "library/hello-world:latest",
|
||||
Override: false,
|
||||
}
|
||||
httpStatusCode, err = apiTest.RetagImage(*admin, repo, retagReq)
|
||||
if err != nil {
|
||||
t.Errorf("failed to retag: %v", err)
|
||||
} else {
|
||||
assert.Equal(int(409), httpStatusCode, "httpStatusCode should be 409")
|
||||
}
|
||||
|
||||
fmt.Printf("\n")
|
||||
}
|
||||
|
@ -48,3 +48,16 @@ type Repository struct {
|
||||
// OS of the image.
|
||||
Os string `json:"os,omitempty"`
|
||||
}
|
||||
|
||||
// Retag describes a retag request
|
||||
type Retag struct {
|
||||
|
||||
// The new tag
|
||||
Tag string `json:"tag"`
|
||||
|
||||
// Source images in format <project>/<repo>:<reference>
|
||||
SrcImage string `json:"src_image"`
|
||||
|
||||
// If target tag exists, whether override it
|
||||
Override bool `json:"override"`
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user