diff --git a/integration/admin_api_integration_test.go b/integration/admin_api_integration_test.go new file mode 100644 index 000000000..d6cfb579f --- /dev/null +++ b/integration/admin_api_integration_test.go @@ -0,0 +1,168 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2021 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// These tests are for AdminAPI Tag based on swagger-console.yml + +package integration + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "net/http" + "testing" + "time" + + "github.com/minio/console/models" + + "github.com/stretchr/testify/assert" +) + +func RestartService() (*http.Response, error) { + /* + Helper function to restart service + HTTP Verb: POST + URL: /api/v1/service/restart + */ + request, err := http.NewRequest( + "POST", + "http://localhost:9090/api/v1/service/restart", + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2000 * time.Second, // increased timeout since restart takes time, more than other APIs. + } + response, err := client.Do(request) + return response, err +} + +func NotifyPostgres() (*http.Response, error) { + /* + Helper function to add Postgres Notification + HTTP Verb: PUT + URL: api/v1/configs/notify_postgres + Body: + { + "key_values":[ + { + "key":"connection_string", + "value":"user=postgres password=password host=localhost dbname=postgres port=5432 sslmode=disable" + }, + { + "key":"table", + "value":"accountsssss" + }, + { + "key":"format", + "value":"namespace" + }, + { + "key":"queue_limit", + "value":"10000" + }, + { + "key":"comment", + "value":"comment" + } + ] + } + */ + Body := models.SetConfigRequest{ + KeyValues: []*models.ConfigurationKV{ + { + Key: "connection_string", + Value: "user=postgres password=password host=173.18.0.3 dbname=postgres port=5432 sslmode=disable", + }, + { + Key: "table", + Value: "accountsssss", + }, + { + Key: "format", + Value: "namespace", + }, + { + Key: "queue_limit", + Value: "10000", + }, + { + Key: "comment", + Value: "comment", + }, + }, + } + + requestDataJSON, _ := json.Marshal(Body) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/configs/notify_postgres", + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func TestNotifyPostgres(t *testing.T) { + + // Variables + assert := assert.New(t) + + // Test + response, err := NotifyPostgres() + finalResponse := inspectHTTPResponse(response) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail(finalResponse) + return + } + if response != nil { + assert.Equal(200, response.StatusCode, finalResponse) + } +} + +func TestRestartService(t *testing.T) { + assert := assert.New(t) + restartResponse, restartError := RestartService() + assert.Nil(restartError) + if restartError != nil { + log.Println(restartError) + return + } + addObjRsp := inspectHTTPResponse(restartResponse) + if restartResponse != nil { + assert.Equal( + 204, + restartResponse.StatusCode, + addObjRsp, + ) + } +} diff --git a/integration/buckets_test.go b/integration/buckets_test.go index a121668da..d3c49ebc2 100644 --- a/integration/buckets_test.go +++ b/integration/buckets_test.go @@ -20,25 +20,18 @@ import ( "bytes" b64 "encoding/base64" "encoding/json" - "errors" "fmt" "io" - "io/ioutil" "log" "net/http" "os" "strconv" - "strings" "testing" "time" "github.com/go-openapi/loads" "github.com/minio/console/restapi" "github.com/minio/console/restapi/operations" - - "github.com/minio/console/models" - - "github.com/stretchr/testify/assert" ) var token string @@ -198,2662 +191,3 @@ func TestMain(m *testing.M) { os.Exit(code) } - -func AddBucket(name string, locking bool, versioning bool, quota map[string]interface{}, retention map[string]interface{}) (*http.Response, error) { - /* - This is an atomic function that we can re-use to create a bucket on any - desired test. - */ - // Needed Parameters for API Call - requestDataAdd := map[string]interface{}{ - "name": name, - "locking": locking, - "versioning": versioning, - "quota": quota, - "retention": retention, - } - - // Creating the Call by adding the URL and Headers - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest("POST", "http://localhost:9090/api/v1/buckets", requestDataBody) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - - // Performing the call - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func ListBuckets() (*http.Response, error) { - /* - Helper function to list buckets - HTTP Verb: GET - {{baseUrl}}/buckets?sort_by=proident velit&offset=-5480083&limit=-5480083 - */ - request, err := http.NewRequest( - "GET", "http://localhost:9090/api/v1/buckets", nil) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func DeleteBucket(name string) (*http.Response, error) { - /* - Helper function to delete bucket. - DELETE: {{baseUrl}}/buckets/:name - */ - request, err := http.NewRequest( - "DELETE", "http://localhost:9090/api/v1/buckets/"+name, nil) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func BucketInfo(name string) (*http.Response, error) { - /* - Helper function to test Bucket Info End Point - GET: {{baseUrl}}/buckets/:name - */ - bucketInformationRequest, bucketInformationError := http.NewRequest( - "GET", "http://localhost:9090/api/v1/buckets/"+name, nil) - if bucketInformationError != nil { - log.Println(bucketInformationError) - } - bucketInformationRequest.Header.Add("Cookie", - fmt.Sprintf("token=%s", token)) - bucketInformationRequest.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(bucketInformationRequest) - return response, err -} - -func PutBucketsTags(bucketName string, tags map[string]string) (*http.Response, error) { - /* - Helper function to put bucket's tags. - PUT: {{baseUrl}}/buckets/:bucket_name/tags - { - "tags": {} - } - */ - requestDataAdd := map[string]interface{}{ - "tags": tags, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest("PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/tags", - requestDataBody) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func SetBucketRetention(bucketName string, mode string, unit string, validity int) (*http.Response, error) { - /* - Helper function to set bucket's retention - PUT: {{baseUrl}}/buckets/:bucket_name/retention - { - "mode":"compliance", - "unit":"years", - "validity":2 - } - */ - requestDataAdd := map[string]interface{}{ - "mode": mode, - "unit": unit, - "validity": validity, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest("PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/retention", - requestDataBody) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func GetBucketRetention(bucketName string) (*http.Response, error) { - /* - Helper function to get the bucket's retention - */ - request, err := http.NewRequest("GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/retention", - nil) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func PutObjectTags(bucketName string, prefix string, tags map[string]string, versionID string) (*http.Response, error) { - /* - Helper function to put object's tags. - PUT: /buckets/{bucket_name}/objects/tags?prefix=prefix - { - "tags": {} - } - */ - requestDataAdd := map[string]interface{}{ - "tags": tags, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+ - bucketName+"/objects/tags?prefix="+prefix+"&version_id="+versionID, - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func DownloadObject(bucketName string, path string) (*http.Response, error) { - /* - Helper function to download an object from a bucket. - GET: {{baseUrl}}/buckets/bucketName/objects/download?prefix=file - */ - request, err := http.NewRequest( - "GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/download?prefix="+ - path, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func UploadAnObject(bucketName string, fileName string) (*http.Response, error) { - /* - Helper function to upload a file to a bucket for testing. - POST {{baseUrl}}/buckets/:bucket_name/objects/upload - */ - boundary := "WebKitFormBoundaryWtayBM7t9EUQb8q3" - boundaryStart := "------" + boundary + "\r\n" - contentDispositionOne := "Content-Disposition: form-data; name=\"2\"; " - contentDispositionTwo := "filename=\"" + fileName + "\"\r\n" - contenType := "Content-Type: text/plain\r\n\r\na\n\r\n" - boundaryEnd := "------" + boundary + "--\r\n" - file := boundaryStart + contentDispositionOne + contentDispositionTwo + - contenType + boundaryEnd - arrayOfBytes := []byte(file) - requestDataBody := bytes.NewReader(arrayOfBytes) - request, err := http.NewRequest( - "POST", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/upload", - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add( - "Content-Type", - "multipart/form-data; boundary=----"+boundary, - ) - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func DeleteMultipleObjects(bucketName string, files []map[string]interface{}) (*http.Response, error) { - /* - Helper function to delete multiple objects in a container. - POST: /buckets/{bucket_name}/delete-objects - files: [ - { - "path": "veniam tempor in", - "versionID": "ea dolor Duis", - "recursive": false - }, - { - "path": "proident eu esse", - "versionID": "eiusmod amet commodo", - "recursive": true - } - ] - */ - requestDataAdd := map[string]interface{}{ - "files": files, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "POST", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/delete-objects", - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func DeleteObject(bucketName string, path string, recursive bool, allVersions bool) (*http.Response, error) { - /* - Helper function to delete an object from a given bucket. - DELETE: - {{baseUrl}}/buckets/bucketName/objects?path=Y2VzYXJpby50eHQ=&recursive=false&all_versions=false - */ - url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects?path=" + - path + "&recursive=" + strconv.FormatBool(recursive) + "&all_versions=" + - strconv.FormatBool(allVersions) - request, err := http.NewRequest( - "DELETE", - url, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func ListObjects(bucketName string, prefix string, withVersions string) (*http.Response, error) { - /* - Helper function to list objects in a bucket. - GET: {{baseUrl}}/buckets/:bucket_name/objects - */ - request, err := http.NewRequest("GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects?prefix="+prefix+"&with_versions="+withVersions, - nil) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func SharesAnObjectOnAUrl(bucketName string, prefix string, versionID string, expires string) (*http.Response, error) { - // Helper function to share an object on a url - request, err := http.NewRequest( - "GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/share?prefix="+prefix+"&version_id="+versionID+"&expires="+expires, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func PutObjectsRetentionStatus(bucketName string, prefix string, versionID string, mode string, expires string, governanceBypass bool) (*http.Response, error) { - requestDataAdd := map[string]interface{}{ - "mode": mode, - "expires": expires, - "governance_bypass": governanceBypass, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/retention?prefix="+prefix+"&version_id="+versionID, - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func GetsTheMetadataOfAnObject(bucketName string, prefix string) (*http.Response, error) { - /* - Gets the metadata of an object - GET - {{baseUrl}}/buckets/:bucket_name/objects/metadata?prefix=proident velit - */ - request, err := http.NewRequest( - "GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/metadata?prefix="+prefix, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func RestoreObjectToASelectedVersion(bucketName string, prefix string, versionID string) (*http.Response, error) { - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/restore?prefix="+prefix+"&version_id="+versionID, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func BucketSetPolicy(bucketName string, access string, definition string) (*http.Response, error) { - /* - Helper function to set policy on a bucket - Name: Bucket Set Policy - HTTP Verb: PUT - URL: {{baseUrl}}/buckets/:name/set-policy - Body: - { - "access": "PRIVATE", - "definition": "dolo" - } - */ - requestDataAdd := map[string]interface{}{ - "access": access, - "definition": definition, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/set-policy", - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func DeleteObjectsRetentionStatus(bucketName string, prefix string, versionID string) (*http.Response, error) { - /* - Helper function to Delete Object Retention Status - DELETE: - {{baseUrl}}/buckets/:bucket_name/objects/retention?prefix=proident velit&version_id=proident velit - */ - url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects/retention?prefix=" + - prefix + "&version_id=" + versionID - request, err := http.NewRequest( - "DELETE", - url, - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func ListBucketEvents(bucketName string) (*http.Response, error) { - /* - Helper function to list bucket's events - Name: List Bucket Events - HTTP Verb: GET - URL: {{baseUrl}}/buckets/:bucket_name/events - */ - request, err := http.NewRequest( - "GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/events", - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func NotifyPostgres() (*http.Response, error) { - /* - Helper function to add Postgres Notification - HTTP Verb: PUT - URL: api/v1/configs/notify_postgres - Body: - { - "key_values":[ - { - "key":"connection_string", - "value":"user=postgres password=password host=localhost dbname=postgres port=5432 sslmode=disable" - }, - { - "key":"table", - "value":"accountsssss" - }, - { - "key":"format", - "value":"namespace" - }, - { - "key":"queue_limit", - "value":"10000" - }, - { - "key":"comment", - "value":"comment" - } - ] - } - */ - Body := models.SetConfigRequest{ - KeyValues: []*models.ConfigurationKV{ - { - Key: "connection_string", - Value: "user=postgres password=password host=173.18.0.3 dbname=postgres port=5432 sslmode=disable", - }, - { - Key: "table", - Value: "accountsssss", - }, - { - Key: "format", - Value: "namespace", - }, - { - Key: "queue_limit", - Value: "10000", - }, - { - Key: "comment", - Value: "comment", - }, - }, - } - - requestDataJSON, _ := json.Marshal(Body) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/configs/notify_postgres", - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func PutBucketQuota(bucketName string, enabled bool, quotaType string, amount int) (*http.Response, error) { - /* - Helper function to put bucket quota - Name: Bucket Quota - URL: {{baseUrl}}/buckets/:name/quota - HTTP Verb: PUT - Body: - { - "enabled": false, - "quota_type": "fifo", - "amount": 18462288 - } - */ - requestDataAdd := map[string]interface{}{ - "enabled": enabled, - "quota_type": quotaType, - "amount": amount, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/quota", - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func GetBucketQuota(bucketName string) (*http.Response, error) { - /* - Helper function to get bucket quota - Name: Get Bucket Quota - URL: {{baseUrl}}/buckets/:name/quota - HTTP Verb: GET - */ - request, err := http.NewRequest( - "GET", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/quota", - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func TestAddBucket(t *testing.T) { - assert := assert.New(t) - type args struct { - bucketName string - } - tests := []struct { - name string - args args - expectedStatus int - }{ - { - name: "Add Bucket with valid name", - expectedStatus: 201, - args: args{ - bucketName: "test1", - }, - }, - { - name: "Add Bucket with invalid name", - expectedStatus: 500, - args: args{ - bucketName: "*&^###Test1ThisMightBeInvalid555", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - response, err := AddBucket( - tt.args.bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error while adding the bucket") - return - } - finalResponse := inspectHTTPResponse(response) - if response != nil { - assert.Equal(tt.expectedStatus, - response.StatusCode, finalResponse) - } - }) - } -} - -func TestAddBucketLocking(t *testing.T) { - /* - This function is to test that locking can't be activated if versioning - is not enabled. - Then, locking will be activated because versioning is activated as well. - */ - assert := assert.New(t) - - /* - This is invalid, versioning has to be true for locking to be true, but - test will see and make sure this is not allowed and that we get proper - error for this scenario. - */ - response, err := AddBucket("test1", true, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - if response != nil { - assert.Equal(400, response.StatusCode, "400 is expected for this test") - } - - msg := "TestAddBucketLocking(): Valid scenario versioning true locking true" - fmt.Println(msg) - - /* - This is valid, versioning is true, then locking can be true as well. - */ - response, err = AddBucket("thujun", true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - // Verification part, bucket should be created with versioning enabled and - // locking enabled, we expect 201 when created. - if response != nil { - assert.Equal(201, response.StatusCode, "201 is expected for this test") - } - - defer response.Body.Close() - - /* - To convert an HTTP response body to a string in Go, so you can read the - error from the API in case the bucket is invalid for some reason - */ - b, err := io.ReadAll(response.Body) - if err != nil { - log.Fatalln(err) - } - fmt.Println(string(b)) - -} - -func TestGetBucket(t *testing.T) { - assert := assert.New(t) - - client := &http.Client{ - Timeout: 2 * time.Second, - } - - response, err := AddBucket("test3", false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - // get bucket - request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/buckets/test3", nil) - if err != nil { - log.Println(err) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - - response, err = client.Do(request) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - if response != nil { - assert.Equal(200, response.StatusCode, "Status Code is incorrect") - } -} - -func TestSetBucketTags(t *testing.T) { - assert := assert.New(t) - - client := &http.Client{ - Timeout: 2 * time.Second, - } - - // put bucket - response, err := AddBucket("test4", false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - requestDataTags := map[string]interface{}{ - "tags": map[string]interface{}{ - "test": "TAG", - }, - } - - requestTagsJSON, _ := json.Marshal(requestDataTags) - - requestTagsBody := bytes.NewBuffer(requestTagsJSON) - - request, err := http.NewRequest(http.MethodPut, "http://localhost:9090/api/v1/buckets/test4/tags", requestTagsBody) - request.Close = true - if err != nil { - log.Println(err) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - - response, err = client.Do(request) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - // get bucket - request, err = http.NewRequest("GET", "http://localhost:9090/api/v1/buckets/test4", nil) - request.Close = true - if err != nil { - log.Println(err) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - - response, err = client.Do(request) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - bodyBytes, _ := ioutil.ReadAll(response.Body) - - bucket := models.Bucket{} - err = json.Unmarshal(bodyBytes, &bucket) - if err != nil { - log.Println(err) - } - - assert.Equal("TAG", bucket.Details.Tags["test"], "Failed to add tag") -} - -func TestBucketVersioning(t *testing.T) { - assert := assert.New(t) - - client := &http.Client{ - Timeout: 2 * time.Second, - } - - request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/session", nil) - if err != nil { - log.Println(err) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - - response, err := client.Do(request) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - var distributedSystem bool - - if response != nil { - - bodyBytes, _ := ioutil.ReadAll(response.Body) - - sessionResponse := models.SessionResponse{} - err = json.Unmarshal(bodyBytes, &sessionResponse) - if err != nil { - log.Println(err) - } - - distributedSystem = sessionResponse.DistributedMode - - } - - requestDataVersioning := map[string]interface{}{ - "name": "test2", - "versioning": true, - "locking": false, - } - - requestDataJSON, _ := json.Marshal(requestDataVersioning) - - requestDataBody := bytes.NewReader(requestDataJSON) - - response, err = AddBucket("test2", true, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - fmt.Println("Versioned bucket creation test status:", response.Status) - if distributedSystem { - assert.Equal(201, response.StatusCode, "Versioning test Status Code is incorrect - bucket failed to create") - } else { - assert.NotEqual(201, response.StatusCode, "Versioning test Status Code is incorrect - versioned bucket created on non-distributed system") - } - - request, error := http.NewRequest("DELETE", "http://localhost:9090/api/v1/buckets/test2", requestDataBody) - if error != nil { - log.Println(error) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - - response, err = client.Do(request) - if err != nil { - log.Println(err) - return - } - - if response != nil { - fmt.Println("DELETE StatusCode:", response.StatusCode) - } - -} - -func TestBucketsGet(t *testing.T) { - assert := assert.New(t) - - client := &http.Client{ - Timeout: 2 * time.Second, - } - - // get list of buckets - request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/buckets", nil) - if err != nil { - log.Println(err) - return - } - - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - - response, err := client.Do(request) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - - if response != nil { - assert.Equal(200, response.StatusCode, "Status Code is incorrect") - bodyBytes, _ := ioutil.ReadAll(response.Body) - - listBuckets := models.ListBucketsResponse{} - err = json.Unmarshal(bodyBytes, &listBuckets) - if err != nil { - log.Println(err) - assert.Nil(err) - } - - assert.Greater(len(listBuckets.Buckets), 0, "No bucket was returned") - assert.Greater(listBuckets.Total, int64(0), "Total buckets is 0") - - } - -} - -func TestListBuckets(t *testing.T) { - /* - Test the list of buckets without query parameters. - */ - assert := assert.New(t) - - // 1. Create buckets - var numberOfBuckets = 3 - for i := 1; i <= numberOfBuckets; i++ { - response, err := AddBucket( - "testlistbuckets"+strconv.Itoa(i), false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the buckets") - return - } - if response != nil { - b, err := io.ReadAll(response.Body) - if err != nil { - log.Fatalln(err) - } - assert.Equal(201, response.StatusCode, - "Status Code is incorrect: "+string(b)+ - " Bucket name: TestListBuckets"+strconv.Itoa(i)) - } - } - - // 2. List buckets - listBucketsResponse, listBucketsError := ListBuckets() - assert.Nil(listBucketsError) - if listBucketsError != nil { - log.Println(listBucketsError) - assert.Fail("Error listing the buckets") - return - } - - // 3. Verify list of buckets - b, err := io.ReadAll(listBucketsResponse.Body) - if listBucketsResponse != nil { - if err != nil { - log.Fatalln(err) - } - assert.Equal(200, listBucketsResponse.StatusCode, - "Status Code is incorrect: "+string(b)) - } - for i := 1; i <= numberOfBuckets; i++ { - assert.True(strings.Contains(string(b), - "testlistbuckets"+strconv.Itoa(i))) - } -} - -func TestDeleteBucket(t *testing.T) { - /* - Test to delete a bucket - */ - // 1. Create the bucket - assert := assert.New(t) - response, err := AddBucket("testdeletebucket1", false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Delete the bucket - deleteBucketResponse, deleteBucketError := DeleteBucket("testdeletebucket1") - assert.Nil(deleteBucketError) - if deleteBucketError != nil { - log.Println(deleteBucketError) - return - } - if deleteBucketResponse != nil { - assert.Equal( - 204, deleteBucketResponse.StatusCode, "Status Code is incorrect") - } - - // 3. Verify the bucket is gone by trying to put a tag - tags := make(map[string]string) - tags["tag1"] = "tag1" - putBucketTagResponse, putBucketTagError := PutBucketsTags( - "testdeletebucket1", tags) - if putBucketTagError != nil { - log.Println(putBucketTagError) - assert.Fail("Error adding a tag to the bucket") - return - } - finalResponse := inspectHTTPResponse(putBucketTagResponse) - if putBucketTagResponse != nil { - assert.Equal( - 500, putBucketTagResponse.StatusCode, - finalResponse) - } - assert.True( - strings.Contains(finalResponse, "The specified bucket does not exist")) -} - -func TestBucketInformationSuccessfulResponse(t *testing.T) { - /* - Test Bucket Info End Point with a Successful Response. - */ - - // 1. Create the bucket - assert := assert.New(t) - response, err := AddBucket("bucketinformation1", false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add a tag to the bucket - tags := make(map[string]string) - tags["tag1"] = "tag1" - putBucketTagResponse, putBucketTagError := PutBucketsTags( - "bucketinformation1", tags) - if putBucketTagError != nil { - log.Println(putBucketTagError) - assert.Fail("Error creating the bucket") - return - } - if putBucketTagResponse != nil { - assert.Equal( - 200, putBucketTagResponse.StatusCode, - inspectHTTPResponse(putBucketTagResponse)) - } - - // 3. Get the information - bucketInfoResponse, bucketInfoError := BucketInfo("bucketinformation1") - if bucketInfoError != nil { - log.Println(bucketInfoError) - assert.Fail("Error getting the bucket information") - return - } - debugResponse := inspectHTTPResponse(bucketInfoResponse) // call it once - if bucketInfoResponse != nil { - assert.Equal(200, bucketInfoResponse.StatusCode, - debugResponse) - } - printMessage(debugResponse) - - // 4. Verify the information - assert.True( - strings.Contains(debugResponse, "bucketinformation1"), - inspectHTTPResponse(bucketInfoResponse)) - assert.True( - strings.Contains(debugResponse, "tag1"), - inspectHTTPResponse(bucketInfoResponse)) -} - -func TestBucketInformationGenericErrorResponse(t *testing.T) { - /* - Test Bucket Info End Point with a Generic Error Response. - */ - // 1. Create the bucket - assert := assert.New(t) - response, err := AddBucket("bucketinformation2", false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add a tag to the bucket - tags := make(map[string]string) - tags["tag2"] = "tag2" - putBucketTagResponse, putBucketTagError := PutBucketsTags( - "bucketinformation2", tags) - if putBucketTagError != nil { - log.Println(putBucketTagError) - assert.Fail("Error creating the bucket") - return - } - if putBucketTagResponse != nil { - assert.Equal( - 200, putBucketTagResponse.StatusCode, - inspectHTTPResponse(putBucketTagResponse)) - } - - // 3. Get the information - bucketInfoResponse, bucketInfoError := BucketInfo("bucketinformation3") - if bucketInfoError != nil { - log.Println(bucketInfoError) - assert.Fail("Error getting the bucket information") - return - } - finalResponse := inspectHTTPResponse(bucketInfoResponse) - if bucketInfoResponse != nil { - assert.Equal(200, bucketInfoResponse.StatusCode) - } - - // 4. Verify the information - // Since bucketinformation3 hasn't been created, then it is expected that - // tag2 is not part of the response, this is why assert.False is used. - assert.False(strings.Contains(finalResponse, "tag2"), finalResponse) -} - -func TestBucketRetention(t *testing.T) { - /* - To test bucket retention feature - */ - // 1. Create the bucket with 2 years validity retention - assert := assert.New(t) - /* - { - "name":"setbucketretention1", - "versioning":true, - "locking":true, - "retention": - { - "mode":"compliance", - "unit":"years", - "validity":2 - } - } - */ - retention := make(map[string]interface{}) - retention["mode"] = "compliance" - retention["unit"] = "years" - retention["validity"] = 2 - response, err := AddBucket("setbucketretention1", true, true, nil, retention) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Set the bucket's retention from 2 years to 3 years - setBucketRetentionResponse, setBucketRetentionError := SetBucketRetention( - "setbucketretention1", - "compliance", - "years", - 3, - ) - assert.Nil(setBucketRetentionError) - if setBucketRetentionError != nil { - log.Println(setBucketRetentionError) - assert.Fail("Error creating the bucket") - return - } - if setBucketRetentionResponse != nil { - assert.Equal(200, setBucketRetentionResponse.StatusCode, - inspectHTTPResponse(setBucketRetentionResponse)) - } - - // 3. Verify the bucket's retention was properly set. - getBucketRetentionResponse, getBucketRetentionError := GetBucketRetention( - "setbucketretention1", - ) - assert.Nil(getBucketRetentionError) - if getBucketRetentionError != nil { - log.Println(getBucketRetentionError) - assert.Fail("Error creating the bucket") - return - } - finalResponse := inspectHTTPResponse(getBucketRetentionResponse) - if getBucketRetentionResponse != nil { - assert.Equal( - 200, - getBucketRetentionResponse.StatusCode, - finalResponse, - ) - } - expected := "Http Response: {\"mode\":\"compliance\",\"unit\":\"years\",\"validity\":3}\n" - assert.Equal(expected, finalResponse, finalResponse) -} - -func TestPutObjectTag(t *testing.T) { - /* - Test to put a tag to an object - */ - - // Vars - assert := assert.New(t) - bucketName := "testputobjecttagbucketone" - fileName := "testputobjecttagbucketone.txt" - path := encodeBase64(fileName) - tags := make(map[string]string) - tags["tag"] = "testputobjecttagbucketonetagone" - versionID := "null" - - // 1. Create the bucket - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Upload the object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse), - ) - } - - // 3. Put a tag to the object - putTagResponse, putTagError := PutObjectTags( - bucketName, path, tags, versionID) - assert.Nil(putTagError) - if putTagError != nil { - log.Println(putTagError) - return - } - putObjectTagresult := inspectHTTPResponse(putTagResponse) - if putTagResponse != nil { - assert.Equal( - 200, putTagResponse.StatusCode, putObjectTagresult) - } - - // 4. Verify the object's tag is set - listResponse, listError := ListObjects(bucketName, path, "false") - assert.Nil(listError) - if listError != nil { - log.Println(listError) - return - } - finalResponse := inspectHTTPResponse(listResponse) - if listResponse != nil { - assert.Equal(200, listResponse.StatusCode, - finalResponse) - } - assert.True( - strings.Contains(finalResponse, tags["tag"]), - finalResponse) -} - -func TestDeleteMultipleObjects(t *testing.T) { - /* - Function to test the deletion of multiple objects from a given bucket. - */ - - // Variables - assert := assert.New(t) - bucketName := "testdeletemultipleobjsbucket1" - numberOfFiles := 5 - fileName := "testdeletemultipleobjs" - - // 1. Create a bucket for this particular test - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Add couple of objects to this bucket - for i := 1; i <= numberOfFiles; i++ { - uploadResponse, uploadError := UploadAnObject( - bucketName, fileName+strconv.Itoa(i)+".txt") - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal(200, uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse)) - } - } - - // 3. Delete these objects - for i := 1; i <= numberOfFiles; i++ { - deleteResponse, deleteError := DeleteObject( - bucketName, encodeBase64( - fileName+strconv.Itoa(i)+".txt"), false, false) - assert.Nil(deleteError) - if deleteError != nil { - log.Println(deleteError) - return - } - if deleteResponse != nil { - assert.Equal(200, deleteResponse.StatusCode, - inspectHTTPResponse(deleteResponse)) - } - } - - // 4. List the objects, empty list is expected! - listResponse, listError := ListObjects(bucketName, "", "false") - assert.Nil(listError) - if listError != nil { - log.Println(listError) - return - } - finalResponse := inspectHTTPResponse(listResponse) - if listResponse != nil { - assert.Equal(200, listResponse.StatusCode, - finalResponse) - } - - // 5. Verify empty list is obtained as we deleted all the objects - expected := "Http Response: {\"objects\":null}\n" - assert.Equal(expected, finalResponse, finalResponse) -} - -func TestDownloadObject(t *testing.T) { - /* - Test to download an object from a given bucket. - */ - - // Vars - assert := assert.New(t) - bucketName := "testdownloadobjbucketone" - fileName := "testdownloadobjectfilenameone" - path := encodeBase64(fileName) - workingDirectory, getWdErr := os.Getwd() - if getWdErr != nil { - assert.Fail("Couldn't get the directory") - } - - // 1. Create the bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Upload an object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse), - ) - } - - // 3. Download the object from the bucket - downloadResponse, downloadError := DownloadObject(bucketName, path) - assert.Nil(downloadError) - if downloadError != nil { - log.Println(downloadError) - assert.Fail("Error downloading the object") - return - } - finalResponse := inspectHTTPResponse(downloadResponse) - if downloadResponse != nil { - assert.Equal( - 200, - downloadResponse.StatusCode, - finalResponse, - ) - } - - // 4. Verify the file was downloaded - files, err := ioutil.ReadDir(workingDirectory) - if err != nil { - log.Fatal(err) - } - for _, file := range files { - fmt.Println(file.Name(), file.IsDir()) - } - if _, err := os.Stat(workingDirectory); errors.Is(err, os.ErrNotExist) { - // path/to/whatever does not exist - assert.Fail("File wasn't downloaded") - } -} - -func TestUploadObjectToBucket(t *testing.T) { - /* - Function to test the upload of an object to a bucket. - */ - - // Test's variables - assert := assert.New(t) - bucketName := "testuploadobjecttobucket1" - fileName := "sample.txt" - - // 1. Create the bucket - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Upload the object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - - // 3. Verify the object was uploaded - finalResponse := inspectHTTPResponse(uploadResponse) - if uploadResponse != nil { - assert.Equal(200, uploadResponse.StatusCode, finalResponse) - } -} - -func TestDeleteObject(t *testing.T) { - /* - Test to delete an object from a given bucket. - */ - - // Variables - assert := assert.New(t) - bucketName := "testdeleteobjectbucket1" - fileName := "testdeleteobjectfile" - path := "dGVzdGRlbGV0ZW9iamVjdGZpbGUxLnR4dA==" // fileName encoded base64 - numberOfFiles := 2 - - // 1. Create bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add two objects to the bucket created. - for i := 1; i <= numberOfFiles; i++ { - uploadResponse, uploadError := UploadAnObject( - bucketName, fileName+strconv.Itoa(i)+".txt") - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal(200, uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse)) - } - } - - // 3. Delete only one object from the bucket. - deleteResponse, deleteError := DeleteObject(bucketName, path, false, false) - assert.Nil(deleteError) - if deleteError != nil { - log.Println(deleteError) - return - } - if deleteResponse != nil { - assert.Equal(200, deleteResponse.StatusCode, - inspectHTTPResponse(deleteResponse)) - } - - // 4. List the objects in the bucket and make sure the object is gone - listResponse, listError := ListObjects(bucketName, "", "false") - assert.Nil(listError) - if listError != nil { - log.Println(listError) - return - } - finalResponse := inspectHTTPResponse(listResponse) - if listResponse != nil { - assert.Equal(200, listResponse.StatusCode, - finalResponse) - } - // Expected only one file: "testdeleteobjectfile2.txt" - // "testdeleteobjectfile1.txt" should be gone by now. - assert.True( - strings.Contains( - finalResponse, - "testdeleteobjectfile2.txt"), finalResponse) // Still there - assert.False( - strings.Contains( - finalResponse, - "testdeleteobjectfile1.txt"), finalResponse) // Gone -} - -func TestListObjects(t *testing.T) { - /* - To test list objects end point. - */ - - // Test's variables - assert := assert.New(t) - bucketName := "testlistobjecttobucket1" - fileName := "testlistobjecttobucket1.txt" - - // 1. Create the bucket - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Upload the object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal(200, uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse)) - } - - // 3. List the object - listResponse, listError := ListObjects(bucketName, "", "false") - assert.Nil(listError) - if listError != nil { - log.Println(listError) - return - } - finalResponse := inspectHTTPResponse(listResponse) - if listResponse != nil { - assert.Equal(200, listResponse.StatusCode, - finalResponse) - } - - // 4. Verify the object was listed - assert.True( - strings.Contains(finalResponse, "testlistobjecttobucket1"), - finalResponse) -} - -func TestShareObjectOnURL(t *testing.T) { - /* - Test to share an object via URL - */ - - // Vars - assert := assert.New(t) - bucketName := "testshareobjectonurl" - fileName := "testshareobjectonurl.txt" - validPrefix := encodeBase64(fileName) - tags := make(map[string]string) - tags["tag"] = "testputobjecttagbucketonetagone" - versionID := "null" - - // 1. Create the bucket - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Upload the object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse), - ) - } - - type args struct { - prefix string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Share File with valid prefix", - expectedStatus: 200, - args: args{ - prefix: validPrefix, - }, - }, - { - name: "Share file with invalid prefix", - expectedStatus: 500, - args: args{ - prefix: "invalidprefix", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - // 3. Share the object on a URL - shareResponse, shareError := SharesAnObjectOnAUrl(bucketName, tt.args.prefix, versionID, "604800s") - assert.Nil(shareError) - if shareError != nil { - log.Println(shareError) - return - } - finalResponse := inspectHTTPResponse(shareResponse) - if shareResponse != nil { - assert.Equal( - tt.expectedStatus, - shareResponse.StatusCode, - finalResponse, - ) - } - - }) - } -} - -func TestPutObjectsRetentionStatus(t *testing.T) { - - // Variables - assert := assert.New(t) - bucketName := "testputobjectsretentionstatus" - fileName := "testputobjectsretentionstatus.txt" - prefix := encodeBase64(fileName) - - // 1. Create bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add object - uploadResponse, uploadError := UploadAnObject( - bucketName, - fileName, - ) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - addObjRsp := inspectHTTPResponse(uploadResponse) - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - addObjRsp, - ) - } - - // Get versionID - listResponse, listError := ListObjects(bucketName, prefix, "true") - fmt.Println(listError) - bodyBytes, _ := ioutil.ReadAll(listResponse.Body) - listObjs := models.ListObjectsResponse{} - err = json.Unmarshal(bodyBytes, &listObjs) - if err != nil { - log.Println(err) - assert.Nil(err) - } - validVersionID := listObjs.Objects[0].VersionID - - type args struct { - versionID string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid VersionID when putting object's retention status", - expectedStatus: 200, - args: args{ - versionID: validVersionID, - }, - }, - { - name: "Invalid VersionID when putting object's retention status", - expectedStatus: 500, - args: args{ - versionID: "*&^###Test1ThisMightBeInvalid555", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // 3. Put Objects Legal Status - putResponse, putError := PutObjectsRetentionStatus( - bucketName, - prefix, - tt.args.versionID, - "compliance", - "2033-01-13T23:59:59Z", - false, - ) - if putError != nil { - log.Println(putError) - assert.Fail("Error creating the bucket") - } - if putResponse != nil { - assert.Equal( - tt.expectedStatus, - putResponse.StatusCode, - inspectHTTPResponse(putResponse), - ) - } - }) - } -} - -func TestGetsTheMetadataOfAnObject(t *testing.T) { - - // Vars - assert := assert.New(t) - bucketName := "testgetsthemetadataofanobject" - fileName := "testshareobjectonurl.txt" - validPrefix := encodeBase64(fileName) - tags := make(map[string]string) - tags["tag"] = "testputobjecttagbucketonetagone" - - // 1. Create the bucket - response, err := AddBucket(bucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - return - } - if response != nil { - assert.Equal(201, response.StatusCode, "Status Code is incorrect") - } - - // 2. Upload the object to the bucket - uploadResponse, uploadError := UploadAnObject(bucketName, fileName) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - inspectHTTPResponse(uploadResponse), - ) - } - - type args struct { - prefix string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Get metadata with valid prefix", - expectedStatus: 200, - args: args{ - prefix: validPrefix, - }, - }, - { - name: "Get metadata with invalid prefix", - expectedStatus: 500, - args: args{ - prefix: "invalidprefix", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - // 3. Get the metadata from an object - getRsp, getErr := GetsTheMetadataOfAnObject( - bucketName, tt.args.prefix) - assert.Nil(getErr) - if getErr != nil { - log.Println(getErr) - return - } - if getRsp != nil { - assert.Equal( - tt.expectedStatus, - getRsp.StatusCode, - inspectHTTPResponse(getRsp), - ) - } - - }) - } -} - -func TestPutBucketsTags(t *testing.T) { - // Focused test for "Put Bucket's tags" endpoint - - // 1. Create the bucket - assert := assert.New(t) - validBucketName := "testputbuckettags1" - response, err := AddBucket(validBucketName, false, false, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - type args struct { - bucketName string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Put a tag to a valid bucket", - expectedStatus: 200, - args: args{ - bucketName: validBucketName, - }, - }, - { - name: "Put a tag to an invalid bucket", - expectedStatus: 500, - args: args{ - bucketName: "invalidbucketname", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - // 2. Add a tag to the bucket - tags := make(map[string]string) - tags["tag2"] = "tag2" - putBucketTagResponse, putBucketTagError := PutBucketsTags( - tt.args.bucketName, tags) - if putBucketTagError != nil { - log.Println(putBucketTagError) - assert.Fail("Error creating the bucket") - return - } - if putBucketTagResponse != nil { - assert.Equal( - tt.expectedStatus, putBucketTagResponse.StatusCode, - inspectHTTPResponse(putBucketTagResponse)) - } - - }) - } -} - -func TestRestoreObjectToASelectedVersion(t *testing.T) { - - // Variables - assert := assert.New(t) - bucketName := "testrestoreobjectstoselectedversion" - fileName := "testrestoreobjectstoselectedversion.txt" - validPrefix := encodeBase64(fileName) - - // 1. Create bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add object - uploadResponse, uploadError := UploadAnObject( - bucketName, - fileName, - ) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - addObjRsp := inspectHTTPResponse(uploadResponse) - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - addObjRsp, - ) - } - - // 3. Get versionID - listResponse, listError := ListObjects(bucketName, validPrefix, "true") - fmt.Println(listError) - bodyBytes, _ := ioutil.ReadAll(listResponse.Body) - listObjs := models.ListObjectsResponse{} - err = json.Unmarshal(bodyBytes, &listObjs) - if err != nil { - log.Println(err) - assert.Nil(err) - } - versionID := listObjs.Objects[0].VersionID - - type args struct { - prefix string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid prefix when restoring object", - expectedStatus: 200, - args: args{ - prefix: validPrefix, - }, - }, - { - name: "Invalid prefix when restoring object", - expectedStatus: 500, - args: args{ - prefix: "fakefile", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // 4. Restore Object to a selected version - restResp, restErr := RestoreObjectToASelectedVersion( - bucketName, - tt.args.prefix, - versionID, - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - tt.expectedStatus, - restResp.StatusCode, - finalResponse, - ) - } - }) - } -} - -func TestBucketSetPolicy(t *testing.T) { - - // Variables - assert := assert.New(t) - validBucketName := "testbucketsetpolicy" - - // 1. Create bucket - response, err := AddBucket(validBucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Set a bucket's policy using table driven tests - type args struct { - bucketName string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid bucket when setting a policy", - expectedStatus: 200, - args: args{ - bucketName: validBucketName, - }, - }, - { - name: "Invalid bucket when setting a bucket", - expectedStatus: 500, - args: args{ - bucketName: "wlkjsdkalsjdklajsdlkajsdlkajsdlkajsdklajsdkljaslkdjaslkdj", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - // Set Policy - restResp, restErr := BucketSetPolicy( - tt.args.bucketName, - "PUBLIC", - "", - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - tt.expectedStatus, - restResp.StatusCode, - finalResponse, - ) - } - - }) - } -} - -func TestDeleteObjectsRetentionStatus(t *testing.T) { - - // Variables - assert := assert.New(t) - bucketName := "testdeleteobjectslegalholdstatus" - fileName := "testdeleteobjectslegalholdstatus.txt" - validPrefix := encodeBase64(fileName) - - // 1. Create bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add object - uploadResponse, uploadError := UploadAnObject( - bucketName, - fileName, - ) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - addObjRsp := inspectHTTPResponse(uploadResponse) - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - addObjRsp, - ) - } - - // Get versionID - listResponse, listError := ListObjects(bucketName, validPrefix, "true") - fmt.Println(listError) - bodyBytes, _ := ioutil.ReadAll(listResponse.Body) - listObjs := models.ListObjectsResponse{} - err = json.Unmarshal(bodyBytes, &listObjs) - if err != nil { - log.Println(err) - assert.Nil(err) - } - versionID := listObjs.Objects[0].VersionID - - // 3. Put Objects Retention Status - putResponse, putError := PutObjectsRetentionStatus( - bucketName, - validPrefix, - versionID, - "governance", - "2033-01-11T23:59:59Z", - false, - ) - if putError != nil { - log.Println(putError) - assert.Fail("Error creating the bucket") - } - if putResponse != nil { - assert.Equal( - 200, - putResponse.StatusCode, - inspectHTTPResponse(putResponse), - ) - } - - type args struct { - prefix string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid prefix when deleting object's retention status", - expectedStatus: 200, - args: args{ - prefix: validPrefix, - }, - }, - { - name: "Invalid prefix when deleting object's retention status", - expectedStatus: 500, - args: args{ - prefix: "fakefile", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // 4. Delete Objects Retention Status - putResponse, putError := DeleteObjectsRetentionStatus( - bucketName, - tt.args.prefix, - versionID, - ) - if putError != nil { - log.Println(putError) - assert.Fail("Error creating the bucket") - } - if putResponse != nil { - assert.Equal( - tt.expectedStatus, - putResponse.StatusCode, - inspectHTTPResponse(putResponse), - ) - } - }) - } - -} - -func TestListBucketEvents(t *testing.T) { - - // Variables - assert := assert.New(t) - validBucket := "testlistbucketevents" - - // 1. Create bucket - response, err := AddBucket(validBucket, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. List bucket events - type args struct { - bucketName string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid bucket when listing events", - expectedStatus: 200, - args: args{ - bucketName: validBucket, - }, - }, - { - name: "Invalid bucket when listing events", - expectedStatus: 500, - args: args{ - bucketName: "alksdjalksdjklasjdklasjdlkasjdkljaslkdjaskldjaklsjd", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - - restResp, restErr := ListBucketEvents( - tt.args.bucketName, - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - tt.expectedStatus, - restResp.StatusCode, - finalResponse, - ) - } - - }) - } -} - -func TestNotifyPostgres(t *testing.T) { - - // Variables - assert := assert.New(t) - - // Test - response, err := NotifyPostgres() - finalResponse := inspectHTTPResponse(response) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail(finalResponse) - return - } - if response != nil { - assert.Equal(200, response.StatusCode, finalResponse) - } -} - -func TestPutBucketQuota(t *testing.T) { - - // Variables - assert := assert.New(t) - validBucket := "testputbucketquota" - - // 1. Create bucket - response, err := AddBucket(validBucket, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Put Bucket Quota - type args struct { - bucketName string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid bucket when putting quota", - expectedStatus: 200, - args: args{ - bucketName: validBucket, - }, - }, - { - name: "Invalid bucket when putting quota", - expectedStatus: 500, - args: args{ - bucketName: "lksdjakldjklajdlkasjdklasjdkljaskdljaslkdjalksjdklasjdklajsdlkajs", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - restResp, restErr := PutBucketQuota( - tt.args.bucketName, - true, // enabled - "hard", // quotaType - 1099511627776, // amount - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - tt.expectedStatus, - restResp.StatusCode, - finalResponse, - ) - } - }) - } - -} - -func TestGetBucketQuota(t *testing.T) { - - // Variables - assert := assert.New(t) - validBucket := "testgetbucketquota" - - // 1. Create bucket - response, err := AddBucket(validBucket, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Put Bucket Quota - restResp, restErr := PutBucketQuota( - validBucket, - true, // enabled - "hard", // quotaType - 1099511627776, // amount - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - 200, - restResp.StatusCode, - finalResponse, - ) - } - - // 3. Get Bucket Quota - type args struct { - bucketName string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid bucket when getting quota", - expectedStatus: 200, - args: args{ - bucketName: validBucket, - }, - }, - { - name: "Invalid bucket when getting quota", - expectedStatus: 500, - args: args{ - bucketName: "askdaklsjdkasjdklasjdklasjdklajsdklasjdklasjdlkas", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - restResp, restErr := GetBucketQuota( - tt.args.bucketName, - ) - assert.Nil(restErr) - if restErr != nil { - log.Println(restErr) - return - } - finalResponse := inspectHTTPResponse(restResp) - if restResp != nil { - assert.Equal( - tt.expectedStatus, - restResp.StatusCode, - finalResponse, - ) - } - }) - } - -} - -func PutObjectsLegalholdStatus(bucketName string, prefix string, status string, versionID string) (*http.Response, error) { - // Helper function to test "Put Object's legalhold status" end point - requestDataAdd := map[string]interface{}{ - "status": status, - } - requestDataJSON, _ := json.Marshal(requestDataAdd) - requestDataBody := bytes.NewReader(requestDataJSON) - request, err := http.NewRequest( - "PUT", - "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/legalhold?prefix="+prefix+"&version_id="+versionID, - requestDataBody, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2 * time.Second, - } - response, err := client.Do(request) - return response, err -} - -func TestPutObjectsLegalholdStatus(t *testing.T) { - // Variables - assert := assert.New(t) - bucketName := "testputobjectslegalholdstatus" - fileName := "testputobjectslegalholdstatus.txt" - prefix := "dGVzdHB1dG9iamVjdHNsZWdhbGhvbGRzdGF0dXMudHh0" // encoded base64 - status := "enabled" - - // 1. Create bucket - response, err := AddBucket(bucketName, true, true, nil, nil) - assert.Nil(err) - if err != nil { - log.Println(err) - assert.Fail("Error creating the bucket") - return - } - if response != nil { - assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) - } - - // 2. Add object - uploadResponse, uploadError := UploadAnObject( - bucketName, - fileName, - ) - assert.Nil(uploadError) - if uploadError != nil { - log.Println(uploadError) - return - } - addObjRsp := inspectHTTPResponse(uploadResponse) - if uploadResponse != nil { - assert.Equal( - 200, - uploadResponse.StatusCode, - addObjRsp, - ) - } - - // Get versionID - listResponse, listError := ListObjects(bucketName, prefix, "true") - fmt.Println(listError) - bodyBytes, _ := ioutil.ReadAll(listResponse.Body) - listObjs := models.ListObjectsResponse{} - err = json.Unmarshal(bodyBytes, &listObjs) - if err != nil { - log.Println(err) - assert.Nil(err) - } - validVersionID := listObjs.Objects[0].VersionID - - type args struct { - versionID string - } - tests := []struct { - name string - expectedStatus int - args args - }{ - { - name: "Valid VersionID when putting object's legal hold status", - expectedStatus: 200, - args: args{ - versionID: validVersionID, - }, - }, - { - name: "Invalid VersionID when putting object's legal hold status", - expectedStatus: 500, - args: args{ - versionID: "*&^###Test1ThisMightBeInvalid555", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // 3. Put Objects Legal Status - putResponse, putError := PutObjectsLegalholdStatus( - bucketName, - prefix, - status, - tt.args.versionID, - ) - if putError != nil { - log.Println(putError) - assert.Fail("Error putting object's legal hold status") - } - if putResponse != nil { - assert.Equal( - tt.expectedStatus, - putResponse.StatusCode, - inspectHTTPResponse(putResponse), - ) - } - }) - } -} - -func RestartService() (*http.Response, error) { - /* - Helper function to restart service - HTTP Verb: POST - URL: /api/v1/service/restart - */ - request, err := http.NewRequest( - "POST", - "http://localhost:9090/api/v1/service/restart", - nil, - ) - if err != nil { - log.Println(err) - } - request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) - request.Header.Add("Content-Type", "application/json") - client := &http.Client{ - Timeout: 2000 * time.Second, // increased timeout since restart takes time, more than other APIs. - } - response, err := client.Do(request) - return response, err -} - -func TestRestartService(t *testing.T) { - assert := assert.New(t) - restartResponse, restartError := RestartService() - assert.Nil(restartError) - if restartError != nil { - log.Println(restartError) - return - } - addObjRsp := inspectHTTPResponse(restartResponse) - if restartResponse != nil { - assert.Equal( - 204, - restartResponse.StatusCode, - addObjRsp, - ) - } -} diff --git a/integration/user_api_bucket_test.go b/integration/user_api_bucket_test.go new file mode 100644 index 000000000..7a1dcf0e8 --- /dev/null +++ b/integration/user_api_bucket_test.go @@ -0,0 +1,2537 @@ +// This file is part of MinIO Console Server +// Copyright (c) 2021 MinIO, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// These tests are for UserAPI Tag based on swagger-console.yml + +package integration + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "strconv" + "strings" + "testing" + "time" + + "github.com/minio/console/models" + "github.com/stretchr/testify/assert" +) + +func AddBucket(name string, locking bool, versioning bool, quota map[string]interface{}, retention map[string]interface{}) (*http.Response, error) { + /* + This is an atomic function that we can re-use to create a bucket on any + desired test. + */ + // Needed Parameters for API Call + requestDataAdd := map[string]interface{}{ + "name": name, + "locking": locking, + "versioning": versioning, + "quota": quota, + "retention": retention, + } + + // Creating the Call by adding the URL and Headers + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest("POST", "http://localhost:9090/api/v1/buckets", requestDataBody) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + + // Performing the call + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func ListBuckets() (*http.Response, error) { + /* + Helper function to list buckets + HTTP Verb: GET + {{baseUrl}}/buckets?sort_by=proident velit&offset=-5480083&limit=-5480083 + */ + request, err := http.NewRequest( + "GET", "http://localhost:9090/api/v1/buckets", nil) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func DeleteBucket(name string) (*http.Response, error) { + /* + Helper function to delete bucket. + DELETE: {{baseUrl}}/buckets/:name + */ + request, err := http.NewRequest( + "DELETE", "http://localhost:9090/api/v1/buckets/"+name, nil) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func BucketInfo(name string) (*http.Response, error) { + /* + Helper function to test Bucket Info End Point + GET: {{baseUrl}}/buckets/:name + */ + bucketInformationRequest, bucketInformationError := http.NewRequest( + "GET", "http://localhost:9090/api/v1/buckets/"+name, nil) + if bucketInformationError != nil { + log.Println(bucketInformationError) + } + bucketInformationRequest.Header.Add("Cookie", + fmt.Sprintf("token=%s", token)) + bucketInformationRequest.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(bucketInformationRequest) + return response, err +} + +func SetBucketRetention(bucketName string, mode string, unit string, validity int) (*http.Response, error) { + /* + Helper function to set bucket's retention + PUT: {{baseUrl}}/buckets/:bucket_name/retention + { + "mode":"compliance", + "unit":"years", + "validity":2 + } + */ + requestDataAdd := map[string]interface{}{ + "mode": mode, + "unit": unit, + "validity": validity, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest("PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/retention", + requestDataBody) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func GetBucketRetention(bucketName string) (*http.Response, error) { + /* + Helper function to get the bucket's retention + */ + request, err := http.NewRequest("GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/retention", + nil) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func PutObjectTags(bucketName string, prefix string, tags map[string]string, versionID string) (*http.Response, error) { + /* + Helper function to put object's tags. + PUT: /buckets/{bucket_name}/objects/tags?prefix=prefix + { + "tags": {} + } + */ + requestDataAdd := map[string]interface{}{ + "tags": tags, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+ + bucketName+"/objects/tags?prefix="+prefix+"&version_id="+versionID, + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func DeleteMultipleObjects(bucketName string, files []map[string]interface{}) (*http.Response, error) { + /* + Helper function to delete multiple objects in a container. + POST: /buckets/{bucket_name}/delete-objects + files: [ + { + "path": "veniam tempor in", + "versionID": "ea dolor Duis", + "recursive": false + }, + { + "path": "proident eu esse", + "versionID": "eiusmod amet commodo", + "recursive": true + } + ] + */ + requestDataAdd := map[string]interface{}{ + "files": files, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "POST", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/delete-objects", + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func DownloadObject(bucketName string, path string) (*http.Response, error) { + /* + Helper function to download an object from a bucket. + GET: {{baseUrl}}/buckets/bucketName/objects/download?prefix=file + */ + request, err := http.NewRequest( + "GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/download?prefix="+ + path, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func UploadAnObject(bucketName string, fileName string) (*http.Response, error) { + /* + Helper function to upload a file to a bucket for testing. + POST {{baseUrl}}/buckets/:bucket_name/objects/upload + */ + boundary := "WebKitFormBoundaryWtayBM7t9EUQb8q3" + boundaryStart := "------" + boundary + "\r\n" + contentDispositionOne := "Content-Disposition: form-data; name=\"2\"; " + contentDispositionTwo := "filename=\"" + fileName + "\"\r\n" + contenType := "Content-Type: text/plain\r\n\r\na\n\r\n" + boundaryEnd := "------" + boundary + "--\r\n" + file := boundaryStart + contentDispositionOne + contentDispositionTwo + + contenType + boundaryEnd + arrayOfBytes := []byte(file) + requestDataBody := bytes.NewReader(arrayOfBytes) + request, err := http.NewRequest( + "POST", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/upload", + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add( + "Content-Type", + "multipart/form-data; boundary=----"+boundary, + ) + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func DeleteObject(bucketName string, path string, recursive bool, allVersions bool) (*http.Response, error) { + /* + Helper function to delete an object from a given bucket. + DELETE: + {{baseUrl}}/buckets/bucketName/objects?path=Y2VzYXJpby50eHQ=&recursive=false&all_versions=false + */ + url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects?path=" + + path + "&recursive=" + strconv.FormatBool(recursive) + "&all_versions=" + + strconv.FormatBool(allVersions) + request, err := http.NewRequest( + "DELETE", + url, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func ListObjects(bucketName string, prefix string, withVersions string) (*http.Response, error) { + /* + Helper function to list objects in a bucket. + GET: {{baseUrl}}/buckets/:bucket_name/objects + */ + request, err := http.NewRequest("GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects?prefix="+prefix+"&with_versions="+withVersions, + nil) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func SharesAnObjectOnAUrl(bucketName string, prefix string, versionID string, expires string) (*http.Response, error) { + // Helper function to share an object on a url + request, err := http.NewRequest( + "GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/share?prefix="+prefix+"&version_id="+versionID+"&expires="+expires, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func PutObjectsRetentionStatus(bucketName string, prefix string, versionID string, mode string, expires string, governanceBypass bool) (*http.Response, error) { + requestDataAdd := map[string]interface{}{ + "mode": mode, + "expires": expires, + "governance_bypass": governanceBypass, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/retention?prefix="+prefix+"&version_id="+versionID, + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func GetsTheMetadataOfAnObject(bucketName string, prefix string) (*http.Response, error) { + /* + Gets the metadata of an object + GET + {{baseUrl}}/buckets/:bucket_name/objects/metadata?prefix=proident velit + */ + request, err := http.NewRequest( + "GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/metadata?prefix="+prefix, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func PutBucketsTags(bucketName string, tags map[string]string) (*http.Response, error) { + /* + Helper function to put bucket's tags. + PUT: {{baseUrl}}/buckets/:bucket_name/tags + { + "tags": {} + } + */ + requestDataAdd := map[string]interface{}{ + "tags": tags, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest("PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/tags", + requestDataBody) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func RestoreObjectToASelectedVersion(bucketName string, prefix string, versionID string) (*http.Response, error) { + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/restore?prefix="+prefix+"&version_id="+versionID, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func BucketSetPolicy(bucketName string, access string, definition string) (*http.Response, error) { + /* + Helper function to set policy on a bucket + Name: Bucket Set Policy + HTTP Verb: PUT + URL: {{baseUrl}}/buckets/:name/set-policy + Body: + { + "access": "PRIVATE", + "definition": "dolo" + } + */ + requestDataAdd := map[string]interface{}{ + "access": access, + "definition": definition, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/set-policy", + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func DeleteObjectsRetentionStatus(bucketName string, prefix string, versionID string) (*http.Response, error) { + /* + Helper function to Delete Object Retention Status + DELETE: + {{baseUrl}}/buckets/:bucket_name/objects/retention?prefix=proident velit&version_id=proident velit + */ + url := "http://localhost:9090/api/v1/buckets/" + bucketName + "/objects/retention?prefix=" + + prefix + "&version_id=" + versionID + request, err := http.NewRequest( + "DELETE", + url, + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func ListBucketEvents(bucketName string) (*http.Response, error) { + /* + Helper function to list bucket's events + Name: List Bucket Events + HTTP Verb: GET + URL: {{baseUrl}}/buckets/:bucket_name/events + */ + request, err := http.NewRequest( + "GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/events", + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func PutBucketQuota(bucketName string, enabled bool, quotaType string, amount int) (*http.Response, error) { + /* + Helper function to put bucket quota + Name: Bucket Quota + URL: {{baseUrl}}/buckets/:name/quota + HTTP Verb: PUT + Body: + { + "enabled": false, + "quota_type": "fifo", + "amount": 18462288 + } + */ + requestDataAdd := map[string]interface{}{ + "enabled": enabled, + "quota_type": quotaType, + "amount": amount, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/quota", + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func GetBucketQuota(bucketName string) (*http.Response, error) { + /* + Helper function to get bucket quota + Name: Get Bucket Quota + URL: {{baseUrl}}/buckets/:name/quota + HTTP Verb: GET + */ + request, err := http.NewRequest( + "GET", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/quota", + nil, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func PutObjectsLegalholdStatus(bucketName string, prefix string, status string, versionID string) (*http.Response, error) { + // Helper function to test "Put Object's legalhold status" end point + requestDataAdd := map[string]interface{}{ + "status": status, + } + requestDataJSON, _ := json.Marshal(requestDataAdd) + requestDataBody := bytes.NewReader(requestDataJSON) + request, err := http.NewRequest( + "PUT", + "http://localhost:9090/api/v1/buckets/"+bucketName+"/objects/legalhold?prefix="+prefix+"&version_id="+versionID, + requestDataBody, + ) + if err != nil { + log.Println(err) + } + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + client := &http.Client{ + Timeout: 2 * time.Second, + } + response, err := client.Do(request) + return response, err +} + +func TestPutObjectsLegalholdStatus(t *testing.T) { + // Variables + assert := assert.New(t) + bucketName := "testputobjectslegalholdstatus" + fileName := "testputobjectslegalholdstatus.txt" + prefix := "dGVzdHB1dG9iamVjdHNsZWdhbGhvbGRzdGF0dXMudHh0" // encoded base64 + status := "enabled" + + // 1. Create bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add object + uploadResponse, uploadError := UploadAnObject( + bucketName, + fileName, + ) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + addObjRsp := inspectHTTPResponse(uploadResponse) + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + addObjRsp, + ) + } + + // Get versionID + listResponse, listError := ListObjects(bucketName, prefix, "true") + fmt.Println(listError) + bodyBytes, _ := ioutil.ReadAll(listResponse.Body) + listObjs := models.ListObjectsResponse{} + err = json.Unmarshal(bodyBytes, &listObjs) + if err != nil { + log.Println(err) + assert.Nil(err) + } + validVersionID := listObjs.Objects[0].VersionID + + type args struct { + versionID string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid VersionID when putting object's legal hold status", + expectedStatus: 200, + args: args{ + versionID: validVersionID, + }, + }, + { + name: "Invalid VersionID when putting object's legal hold status", + expectedStatus: 500, + args: args{ + versionID: "*&^###Test1ThisMightBeInvalid555", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // 3. Put Objects Legal Status + putResponse, putError := PutObjectsLegalholdStatus( + bucketName, + prefix, + status, + tt.args.versionID, + ) + if putError != nil { + log.Println(putError) + assert.Fail("Error putting object's legal hold status") + } + if putResponse != nil { + assert.Equal( + tt.expectedStatus, + putResponse.StatusCode, + inspectHTTPResponse(putResponse), + ) + } + }) + } +} + +func TestGetBucketQuota(t *testing.T) { + + // Variables + assert := assert.New(t) + validBucket := "testgetbucketquota" + + // 1. Create bucket + response, err := AddBucket(validBucket, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Put Bucket Quota + restResp, restErr := PutBucketQuota( + validBucket, + true, // enabled + "hard", // quotaType + 1099511627776, // amount + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + 200, + restResp.StatusCode, + finalResponse, + ) + } + + // 3. Get Bucket Quota + type args struct { + bucketName string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid bucket when getting quota", + expectedStatus: 200, + args: args{ + bucketName: validBucket, + }, + }, + { + name: "Invalid bucket when getting quota", + expectedStatus: 500, + args: args{ + bucketName: "askdaklsjdkasjdklasjdklasjdklajsdklasjdklasjdlkas", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + restResp, restErr := GetBucketQuota( + tt.args.bucketName, + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + tt.expectedStatus, + restResp.StatusCode, + finalResponse, + ) + } + }) + } +} + +func TestPutBucketQuota(t *testing.T) { + + // Variables + assert := assert.New(t) + validBucket := "testputbucketquota" + + // 1. Create bucket + response, err := AddBucket(validBucket, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Put Bucket Quota + type args struct { + bucketName string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid bucket when putting quota", + expectedStatus: 200, + args: args{ + bucketName: validBucket, + }, + }, + { + name: "Invalid bucket when putting quota", + expectedStatus: 500, + args: args{ + bucketName: "lksdjakldjklajdlkasjdklasjdkljaskdljaslkdjalksjdklasjdklajsdlkajs", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + restResp, restErr := PutBucketQuota( + tt.args.bucketName, + true, // enabled + "hard", // quotaType + 1099511627776, // amount + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + tt.expectedStatus, + restResp.StatusCode, + finalResponse, + ) + } + }) + } +} + +func TestListBucketEvents(t *testing.T) { + + // Variables + assert := assert.New(t) + validBucket := "testlistbucketevents" + + // 1. Create bucket + response, err := AddBucket(validBucket, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. List bucket events + type args struct { + bucketName string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid bucket when listing events", + expectedStatus: 200, + args: args{ + bucketName: validBucket, + }, + }, + { + name: "Invalid bucket when listing events", + expectedStatus: 500, + args: args{ + bucketName: "alksdjalksdjklasjdklasjdlkasjdkljaslkdjaskldjaklsjd", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + restResp, restErr := ListBucketEvents( + tt.args.bucketName, + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + tt.expectedStatus, + restResp.StatusCode, + finalResponse, + ) + } + + }) + } +} + +func TestDeleteObjectsRetentionStatus(t *testing.T) { + + // Variables + assert := assert.New(t) + bucketName := "testdeleteobjectslegalholdstatus" + fileName := "testdeleteobjectslegalholdstatus.txt" + validPrefix := encodeBase64(fileName) + + // 1. Create bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add object + uploadResponse, uploadError := UploadAnObject( + bucketName, + fileName, + ) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + addObjRsp := inspectHTTPResponse(uploadResponse) + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + addObjRsp, + ) + } + + // Get versionID + listResponse, listError := ListObjects(bucketName, validPrefix, "true") + fmt.Println(listError) + bodyBytes, _ := ioutil.ReadAll(listResponse.Body) + listObjs := models.ListObjectsResponse{} + err = json.Unmarshal(bodyBytes, &listObjs) + if err != nil { + log.Println(err) + assert.Nil(err) + } + versionID := listObjs.Objects[0].VersionID + + // 3. Put Objects Retention Status + putResponse, putError := PutObjectsRetentionStatus( + bucketName, + validPrefix, + versionID, + "governance", + "2033-01-11T23:59:59Z", + false, + ) + if putError != nil { + log.Println(putError) + assert.Fail("Error creating the bucket") + } + if putResponse != nil { + assert.Equal( + 200, + putResponse.StatusCode, + inspectHTTPResponse(putResponse), + ) + } + + type args struct { + prefix string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid prefix when deleting object's retention status", + expectedStatus: 200, + args: args{ + prefix: validPrefix, + }, + }, + { + name: "Invalid prefix when deleting object's retention status", + expectedStatus: 500, + args: args{ + prefix: "fakefile", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // 4. Delete Objects Retention Status + putResponse, putError := DeleteObjectsRetentionStatus( + bucketName, + tt.args.prefix, + versionID, + ) + if putError != nil { + log.Println(putError) + assert.Fail("Error creating the bucket") + } + if putResponse != nil { + assert.Equal( + tt.expectedStatus, + putResponse.StatusCode, + inspectHTTPResponse(putResponse), + ) + } + }) + } +} + +func TestBucketSetPolicy(t *testing.T) { + + // Variables + assert := assert.New(t) + validBucketName := "testbucketsetpolicy" + + // 1. Create bucket + response, err := AddBucket(validBucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Set a bucket's policy using table driven tests + type args struct { + bucketName string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid bucket when setting a policy", + expectedStatus: 200, + args: args{ + bucketName: validBucketName, + }, + }, + { + name: "Invalid bucket when setting a bucket", + expectedStatus: 500, + args: args{ + bucketName: "wlkjsdkalsjdklajsdlkajsdlkajsdlkajsdklajsdkljaslkdjaslkdj", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + // Set Policy + restResp, restErr := BucketSetPolicy( + tt.args.bucketName, + "PUBLIC", + "", + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + tt.expectedStatus, + restResp.StatusCode, + finalResponse, + ) + } + + }) + } +} + +func TestRestoreObjectToASelectedVersion(t *testing.T) { + + // Variables + assert := assert.New(t) + bucketName := "testrestoreobjectstoselectedversion" + fileName := "testrestoreobjectstoselectedversion.txt" + validPrefix := encodeBase64(fileName) + + // 1. Create bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add object + uploadResponse, uploadError := UploadAnObject( + bucketName, + fileName, + ) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + addObjRsp := inspectHTTPResponse(uploadResponse) + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + addObjRsp, + ) + } + + // 3. Get versionID + listResponse, listError := ListObjects(bucketName, validPrefix, "true") + fmt.Println(listError) + bodyBytes, _ := ioutil.ReadAll(listResponse.Body) + listObjs := models.ListObjectsResponse{} + err = json.Unmarshal(bodyBytes, &listObjs) + if err != nil { + log.Println(err) + assert.Nil(err) + } + versionID := listObjs.Objects[0].VersionID + + type args struct { + prefix string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid prefix when restoring object", + expectedStatus: 200, + args: args{ + prefix: validPrefix, + }, + }, + { + name: "Invalid prefix when restoring object", + expectedStatus: 500, + args: args{ + prefix: "fakefile", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // 4. Restore Object to a selected version + restResp, restErr := RestoreObjectToASelectedVersion( + bucketName, + tt.args.prefix, + versionID, + ) + assert.Nil(restErr) + if restErr != nil { + log.Println(restErr) + return + } + finalResponse := inspectHTTPResponse(restResp) + if restResp != nil { + assert.Equal( + tt.expectedStatus, + restResp.StatusCode, + finalResponse, + ) + } + }) + } +} + +func TestPutBucketsTags(t *testing.T) { + // Focused test for "Put Bucket's tags" endpoint + + // 1. Create the bucket + assert := assert.New(t) + validBucketName := "testputbuckettags1" + response, err := AddBucket(validBucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + type args struct { + bucketName string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Put a tag to a valid bucket", + expectedStatus: 200, + args: args{ + bucketName: validBucketName, + }, + }, + { + name: "Put a tag to an invalid bucket", + expectedStatus: 500, + args: args{ + bucketName: "invalidbucketname", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + // 2. Add a tag to the bucket + tags := make(map[string]string) + tags["tag2"] = "tag2" + putBucketTagResponse, putBucketTagError := PutBucketsTags( + tt.args.bucketName, tags) + if putBucketTagError != nil { + log.Println(putBucketTagError) + assert.Fail("Error creating the bucket") + return + } + if putBucketTagResponse != nil { + assert.Equal( + tt.expectedStatus, putBucketTagResponse.StatusCode, + inspectHTTPResponse(putBucketTagResponse)) + } + + }) + } +} + +func TestGetsTheMetadataOfAnObject(t *testing.T) { + + // Vars + assert := assert.New(t) + bucketName := "testgetsthemetadataofanobject" + fileName := "testshareobjectonurl.txt" + validPrefix := encodeBase64(fileName) + tags := make(map[string]string) + tags["tag"] = "testputobjecttagbucketonetagone" + + // 1. Create the bucket + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Upload the object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse), + ) + } + + type args struct { + prefix string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Get metadata with valid prefix", + expectedStatus: 200, + args: args{ + prefix: validPrefix, + }, + }, + { + name: "Get metadata with invalid prefix", + expectedStatus: 500, + args: args{ + prefix: "invalidprefix", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + // 3. Get the metadata from an object + getRsp, getErr := GetsTheMetadataOfAnObject( + bucketName, tt.args.prefix) + assert.Nil(getErr) + if getErr != nil { + log.Println(getErr) + return + } + if getRsp != nil { + assert.Equal( + tt.expectedStatus, + getRsp.StatusCode, + inspectHTTPResponse(getRsp), + ) + } + + }) + } +} + +func TestPutObjectsRetentionStatus(t *testing.T) { + + // Variables + assert := assert.New(t) + bucketName := "testputobjectsretentionstatus" + fileName := "testputobjectsretentionstatus.txt" + prefix := encodeBase64(fileName) + + // 1. Create bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add object + uploadResponse, uploadError := UploadAnObject( + bucketName, + fileName, + ) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + addObjRsp := inspectHTTPResponse(uploadResponse) + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + addObjRsp, + ) + } + + // Get versionID + listResponse, listError := ListObjects(bucketName, prefix, "true") + fmt.Println(listError) + bodyBytes, _ := ioutil.ReadAll(listResponse.Body) + listObjs := models.ListObjectsResponse{} + err = json.Unmarshal(bodyBytes, &listObjs) + if err != nil { + log.Println(err) + assert.Nil(err) + } + validVersionID := listObjs.Objects[0].VersionID + + type args struct { + versionID string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Valid VersionID when putting object's retention status", + expectedStatus: 200, + args: args{ + versionID: validVersionID, + }, + }, + { + name: "Invalid VersionID when putting object's retention status", + expectedStatus: 500, + args: args{ + versionID: "*&^###Test1ThisMightBeInvalid555", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // 3. Put Objects Legal Status + putResponse, putError := PutObjectsRetentionStatus( + bucketName, + prefix, + tt.args.versionID, + "compliance", + "2033-01-13T23:59:59Z", + false, + ) + if putError != nil { + log.Println(putError) + assert.Fail("Error creating the bucket") + } + if putResponse != nil { + assert.Equal( + tt.expectedStatus, + putResponse.StatusCode, + inspectHTTPResponse(putResponse), + ) + } + }) + } +} + +func TestShareObjectOnURL(t *testing.T) { + /* + Test to share an object via URL + */ + + // Vars + assert := assert.New(t) + bucketName := "testshareobjectonurl" + fileName := "testshareobjectonurl.txt" + validPrefix := encodeBase64(fileName) + tags := make(map[string]string) + tags["tag"] = "testputobjecttagbucketonetagone" + versionID := "null" + + // 1. Create the bucket + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Upload the object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse), + ) + } + + type args struct { + prefix string + } + tests := []struct { + name string + expectedStatus int + args args + }{ + { + name: "Share File with valid prefix", + expectedStatus: 200, + args: args{ + prefix: validPrefix, + }, + }, + { + name: "Share file with invalid prefix", + expectedStatus: 500, + args: args{ + prefix: "invalidprefix", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + // 3. Share the object on a URL + shareResponse, shareError := SharesAnObjectOnAUrl(bucketName, tt.args.prefix, versionID, "604800s") + assert.Nil(shareError) + if shareError != nil { + log.Println(shareError) + return + } + finalResponse := inspectHTTPResponse(shareResponse) + if shareResponse != nil { + assert.Equal( + tt.expectedStatus, + shareResponse.StatusCode, + finalResponse, + ) + } + + }) + } +} + +func TestListObjects(t *testing.T) { + /* + To test list objects end point. + */ + + // Test's variables + assert := assert.New(t) + bucketName := "testlistobjecttobucket1" + fileName := "testlistobjecttobucket1.txt" + + // 1. Create the bucket + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Upload the object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal(200, uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse)) + } + + // 3. List the object + listResponse, listError := ListObjects(bucketName, "", "false") + assert.Nil(listError) + if listError != nil { + log.Println(listError) + return + } + finalResponse := inspectHTTPResponse(listResponse) + if listResponse != nil { + assert.Equal(200, listResponse.StatusCode, + finalResponse) + } + + // 4. Verify the object was listed + assert.True( + strings.Contains(finalResponse, "testlistobjecttobucket1"), + finalResponse) +} + +func TestDeleteObject(t *testing.T) { + /* + Test to delete an object from a given bucket. + */ + + // Variables + assert := assert.New(t) + bucketName := "testdeleteobjectbucket1" + fileName := "testdeleteobjectfile" + path := "dGVzdGRlbGV0ZW9iamVjdGZpbGUxLnR4dA==" // fileName encoded base64 + numberOfFiles := 2 + + // 1. Create bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add two objects to the bucket created. + for i := 1; i <= numberOfFiles; i++ { + uploadResponse, uploadError := UploadAnObject( + bucketName, fileName+strconv.Itoa(i)+".txt") + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal(200, uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse)) + } + } + + // 3. Delete only one object from the bucket. + deleteResponse, deleteError := DeleteObject(bucketName, path, false, false) + assert.Nil(deleteError) + if deleteError != nil { + log.Println(deleteError) + return + } + if deleteResponse != nil { + assert.Equal(200, deleteResponse.StatusCode, + inspectHTTPResponse(deleteResponse)) + } + + // 4. List the objects in the bucket and make sure the object is gone + listResponse, listError := ListObjects(bucketName, "", "false") + assert.Nil(listError) + if listError != nil { + log.Println(listError) + return + } + finalResponse := inspectHTTPResponse(listResponse) + if listResponse != nil { + assert.Equal(200, listResponse.StatusCode, + finalResponse) + } + // Expected only one file: "testdeleteobjectfile2.txt" + // "testdeleteobjectfile1.txt" should be gone by now. + assert.True( + strings.Contains( + finalResponse, + "testdeleteobjectfile2.txt"), finalResponse) // Still there + assert.False( + strings.Contains( + finalResponse, + "testdeleteobjectfile1.txt"), finalResponse) // Gone +} + +func TestUploadObjectToBucket(t *testing.T) { + /* + Function to test the upload of an object to a bucket. + */ + + // Test's variables + assert := assert.New(t) + bucketName := "testuploadobjecttobucket1" + fileName := "sample.txt" + + // 1. Create the bucket + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Upload the object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + + // 3. Verify the object was uploaded + finalResponse := inspectHTTPResponse(uploadResponse) + if uploadResponse != nil { + assert.Equal(200, uploadResponse.StatusCode, finalResponse) + } +} + +func TestDownloadObject(t *testing.T) { + /* + Test to download an object from a given bucket. + */ + + // Vars + assert := assert.New(t) + bucketName := "testdownloadobjbucketone" + fileName := "testdownloadobjectfilenameone" + path := encodeBase64(fileName) + workingDirectory, getWdErr := os.Getwd() + if getWdErr != nil { + assert.Fail("Couldn't get the directory") + } + + // 1. Create the bucket + response, err := AddBucket(bucketName, true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Upload an object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse), + ) + } + + // 3. Download the object from the bucket + downloadResponse, downloadError := DownloadObject(bucketName, path) + assert.Nil(downloadError) + if downloadError != nil { + log.Println(downloadError) + assert.Fail("Error downloading the object") + return + } + finalResponse := inspectHTTPResponse(downloadResponse) + if downloadResponse != nil { + assert.Equal( + 200, + downloadResponse.StatusCode, + finalResponse, + ) + } + + // 4. Verify the file was downloaded + files, err := ioutil.ReadDir(workingDirectory) + if err != nil { + log.Fatal(err) + } + for _, file := range files { + fmt.Println(file.Name(), file.IsDir()) + } + if _, err := os.Stat(workingDirectory); errors.Is(err, os.ErrNotExist) { + // path/to/whatever does not exist + assert.Fail("File wasn't downloaded") + } +} + +func TestDeleteMultipleObjects(t *testing.T) { + /* + Function to test the deletion of multiple objects from a given bucket. + */ + + // Variables + assert := assert.New(t) + bucketName := "testdeletemultipleobjsbucket1" + numberOfFiles := 5 + fileName := "testdeletemultipleobjs" + + // 1. Create a bucket for this particular test + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Add couple of objects to this bucket + for i := 1; i <= numberOfFiles; i++ { + uploadResponse, uploadError := UploadAnObject( + bucketName, fileName+strconv.Itoa(i)+".txt") + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal(200, uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse)) + } + } + + // 3. Delete these objects + for i := 1; i <= numberOfFiles; i++ { + deleteResponse, deleteError := DeleteObject( + bucketName, encodeBase64( + fileName+strconv.Itoa(i)+".txt"), false, false) + assert.Nil(deleteError) + if deleteError != nil { + log.Println(deleteError) + return + } + if deleteResponse != nil { + assert.Equal(200, deleteResponse.StatusCode, + inspectHTTPResponse(deleteResponse)) + } + } + + // 4. List the objects, empty list is expected! + listResponse, listError := ListObjects(bucketName, "", "false") + assert.Nil(listError) + if listError != nil { + log.Println(listError) + return + } + finalResponse := inspectHTTPResponse(listResponse) + if listResponse != nil { + assert.Equal(200, listResponse.StatusCode, + finalResponse) + } + + // 5. Verify empty list is obtained as we deleted all the objects + expected := "Http Response: {\"objects\":null}\n" + assert.Equal(expected, finalResponse, finalResponse) +} + +func TestPutObjectTag(t *testing.T) { + /* + Test to put a tag to an object + */ + + // Vars + assert := assert.New(t) + bucketName := "testputobjecttagbucketone" + fileName := "testputobjecttagbucketone.txt" + path := encodeBase64(fileName) + tags := make(map[string]string) + tags["tag"] = "testputobjecttagbucketonetagone" + versionID := "null" + + // 1. Create the bucket + response, err := AddBucket(bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Upload the object to the bucket + uploadResponse, uploadError := UploadAnObject(bucketName, fileName) + assert.Nil(uploadError) + if uploadError != nil { + log.Println(uploadError) + return + } + if uploadResponse != nil { + assert.Equal( + 200, + uploadResponse.StatusCode, + inspectHTTPResponse(uploadResponse), + ) + } + + // 3. Put a tag to the object + putTagResponse, putTagError := PutObjectTags( + bucketName, path, tags, versionID) + assert.Nil(putTagError) + if putTagError != nil { + log.Println(putTagError) + return + } + putObjectTagresult := inspectHTTPResponse(putTagResponse) + if putTagResponse != nil { + assert.Equal( + 200, putTagResponse.StatusCode, putObjectTagresult) + } + + // 4. Verify the object's tag is set + listResponse, listError := ListObjects(bucketName, path, "false") + assert.Nil(listError) + if listError != nil { + log.Println(listError) + return + } + finalResponse := inspectHTTPResponse(listResponse) + if listResponse != nil { + assert.Equal(200, listResponse.StatusCode, + finalResponse) + } + assert.True( + strings.Contains(finalResponse, tags["tag"]), + finalResponse) +} + +func TestBucketRetention(t *testing.T) { + /* + To test bucket retention feature + */ + // 1. Create the bucket with 2 years validity retention + assert := assert.New(t) + /* + { + "name":"setbucketretention1", + "versioning":true, + "locking":true, + "retention": + { + "mode":"compliance", + "unit":"years", + "validity":2 + } + } + */ + retention := make(map[string]interface{}) + retention["mode"] = "compliance" + retention["unit"] = "years" + retention["validity"] = 2 + response, err := AddBucket("setbucketretention1", true, true, nil, retention) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Set the bucket's retention from 2 years to 3 years + setBucketRetentionResponse, setBucketRetentionError := SetBucketRetention( + "setbucketretention1", + "compliance", + "years", + 3, + ) + assert.Nil(setBucketRetentionError) + if setBucketRetentionError != nil { + log.Println(setBucketRetentionError) + assert.Fail("Error creating the bucket") + return + } + if setBucketRetentionResponse != nil { + assert.Equal(200, setBucketRetentionResponse.StatusCode, + inspectHTTPResponse(setBucketRetentionResponse)) + } + + // 3. Verify the bucket's retention was properly set. + getBucketRetentionResponse, getBucketRetentionError := GetBucketRetention( + "setbucketretention1", + ) + assert.Nil(getBucketRetentionError) + if getBucketRetentionError != nil { + log.Println(getBucketRetentionError) + assert.Fail("Error creating the bucket") + return + } + finalResponse := inspectHTTPResponse(getBucketRetentionResponse) + if getBucketRetentionResponse != nil { + assert.Equal( + 200, + getBucketRetentionResponse.StatusCode, + finalResponse, + ) + } + expected := "Http Response: {\"mode\":\"compliance\",\"unit\":\"years\",\"validity\":3}\n" + assert.Equal(expected, finalResponse, finalResponse) +} + +func TestBucketInformationGenericErrorResponse(t *testing.T) { + /* + Test Bucket Info End Point with a Generic Error Response. + */ + // 1. Create the bucket + assert := assert.New(t) + response, err := AddBucket("bucketinformation2", false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the bucket") + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add a tag to the bucket + tags := make(map[string]string) + tags["tag2"] = "tag2" + putBucketTagResponse, putBucketTagError := PutBucketsTags( + "bucketinformation2", tags) + if putBucketTagError != nil { + log.Println(putBucketTagError) + assert.Fail("Error creating the bucket") + return + } + if putBucketTagResponse != nil { + assert.Equal( + 200, putBucketTagResponse.StatusCode, + inspectHTTPResponse(putBucketTagResponse)) + } + + // 3. Get the information + bucketInfoResponse, bucketInfoError := BucketInfo("bucketinformation3") + if bucketInfoError != nil { + log.Println(bucketInfoError) + assert.Fail("Error getting the bucket information") + return + } + finalResponse := inspectHTTPResponse(bucketInfoResponse) + if bucketInfoResponse != nil { + assert.Equal(200, bucketInfoResponse.StatusCode) + } + + // 4. Verify the information + // Since bucketinformation3 hasn't been created, then it is expected that + // tag2 is not part of the response, this is why assert.False is used. + assert.False(strings.Contains(finalResponse, "tag2"), finalResponse) +} + +func TestBucketInformationSuccessfulResponse(t *testing.T) { + /* + Test Bucket Info End Point with a Successful Response. + */ + + // 1. Create the bucket + assert := assert.New(t) + response, err := AddBucket("bucketinformation1", false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, inspectHTTPResponse(response)) + } + + // 2. Add a tag to the bucket + tags := make(map[string]string) + tags["tag1"] = "tag1" + putBucketTagResponse, putBucketTagError := PutBucketsTags( + "bucketinformation1", tags) + if putBucketTagError != nil { + log.Println(putBucketTagError) + assert.Fail("Error creating the bucket") + return + } + if putBucketTagResponse != nil { + assert.Equal( + 200, putBucketTagResponse.StatusCode, + inspectHTTPResponse(putBucketTagResponse)) + } + + // 3. Get the information + bucketInfoResponse, bucketInfoError := BucketInfo("bucketinformation1") + if bucketInfoError != nil { + log.Println(bucketInfoError) + assert.Fail("Error getting the bucket information") + return + } + debugResponse := inspectHTTPResponse(bucketInfoResponse) // call it once + if bucketInfoResponse != nil { + assert.Equal(200, bucketInfoResponse.StatusCode, + debugResponse) + } + printMessage(debugResponse) + + // 4. Verify the information + assert.True( + strings.Contains(debugResponse, "bucketinformation1"), + inspectHTTPResponse(bucketInfoResponse)) + assert.True( + strings.Contains(debugResponse, "tag1"), + inspectHTTPResponse(bucketInfoResponse)) +} + +func TestDeleteBucket(t *testing.T) { + /* + Test to delete a bucket + */ + // 1. Create the bucket + assert := assert.New(t) + response, err := AddBucket("testdeletebucket1", false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + if response != nil { + assert.Equal(201, response.StatusCode, "Status Code is incorrect") + } + + // 2. Delete the bucket + deleteBucketResponse, deleteBucketError := DeleteBucket("testdeletebucket1") + assert.Nil(deleteBucketError) + if deleteBucketError != nil { + log.Println(deleteBucketError) + return + } + if deleteBucketResponse != nil { + assert.Equal( + 204, deleteBucketResponse.StatusCode, "Status Code is incorrect") + } + + // 3. Verify the bucket is gone by trying to put a tag + tags := make(map[string]string) + tags["tag1"] = "tag1" + putBucketTagResponse, putBucketTagError := PutBucketsTags( + "testdeletebucket1", tags) + if putBucketTagError != nil { + log.Println(putBucketTagError) + assert.Fail("Error adding a tag to the bucket") + return + } + finalResponse := inspectHTTPResponse(putBucketTagResponse) + if putBucketTagResponse != nil { + assert.Equal( + 500, putBucketTagResponse.StatusCode, + finalResponse) + } + assert.True( + strings.Contains(finalResponse, "The specified bucket does not exist")) +} + +func TestListBuckets(t *testing.T) { + /* + Test the list of buckets without query parameters. + */ + assert := assert.New(t) + + // 1. Create buckets + var numberOfBuckets = 3 + for i := 1; i <= numberOfBuckets; i++ { + response, err := AddBucket( + "testlistbuckets"+strconv.Itoa(i), false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error creating the buckets") + return + } + if response != nil { + b, err := io.ReadAll(response.Body) + if err != nil { + log.Fatalln(err) + } + assert.Equal(201, response.StatusCode, + "Status Code is incorrect: "+string(b)+ + " Bucket name: TestListBuckets"+strconv.Itoa(i)) + } + } + + // 2. List buckets + listBucketsResponse, listBucketsError := ListBuckets() + assert.Nil(listBucketsError) + if listBucketsError != nil { + log.Println(listBucketsError) + assert.Fail("Error listing the buckets") + return + } + + // 3. Verify list of buckets + b, err := io.ReadAll(listBucketsResponse.Body) + if listBucketsResponse != nil { + if err != nil { + log.Fatalln(err) + } + assert.Equal(200, listBucketsResponse.StatusCode, + "Status Code is incorrect: "+string(b)) + } + for i := 1; i <= numberOfBuckets; i++ { + assert.True(strings.Contains(string(b), + "testlistbuckets"+strconv.Itoa(i))) + } +} + +func TestBucketsGet(t *testing.T) { + assert := assert.New(t) + + client := &http.Client{ + Timeout: 2 * time.Second, + } + + // get list of buckets + request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/buckets", nil) + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + + response, err := client.Do(request) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + if response != nil { + assert.Equal(200, response.StatusCode, "Status Code is incorrect") + bodyBytes, _ := ioutil.ReadAll(response.Body) + + listBuckets := models.ListBucketsResponse{} + err = json.Unmarshal(bodyBytes, &listBuckets) + if err != nil { + log.Println(err) + assert.Nil(err) + } + + assert.Greater(len(listBuckets.Buckets), 0, "No bucket was returned") + assert.Greater(listBuckets.Total, int64(0), "Total buckets is 0") + + } +} + +func TestBucketVersioning(t *testing.T) { + assert := assert.New(t) + + client := &http.Client{ + Timeout: 2 * time.Second, + } + + request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/session", nil) + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + + response, err := client.Do(request) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + var distributedSystem bool + + if response != nil { + + bodyBytes, _ := ioutil.ReadAll(response.Body) + + sessionResponse := models.SessionResponse{} + err = json.Unmarshal(bodyBytes, &sessionResponse) + if err != nil { + log.Println(err) + } + + distributedSystem = sessionResponse.DistributedMode + + } + + requestDataVersioning := map[string]interface{}{ + "name": "test2", + "versioning": true, + "locking": false, + } + + requestDataJSON, _ := json.Marshal(requestDataVersioning) + + requestDataBody := bytes.NewReader(requestDataJSON) + + response, err = AddBucket("test2", true, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + fmt.Println("Versioned bucket creation test status:", response.Status) + if distributedSystem { + assert.Equal(201, response.StatusCode, "Versioning test Status Code is incorrect - bucket failed to create") + } else { + assert.NotEqual(201, response.StatusCode, "Versioning test Status Code is incorrect - versioned bucket created on non-distributed system") + } + + request, error := http.NewRequest("DELETE", "http://localhost:9090/api/v1/buckets/test2", requestDataBody) + if error != nil { + log.Println(error) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + + response, err = client.Do(request) + if err != nil { + log.Println(err) + return + } + + if response != nil { + fmt.Println("DELETE StatusCode:", response.StatusCode) + } +} + +func TestSetBucketTags(t *testing.T) { + assert := assert.New(t) + + client := &http.Client{ + Timeout: 2 * time.Second, + } + + // put bucket + response, err := AddBucket("test4", false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + requestDataTags := map[string]interface{}{ + "tags": map[string]interface{}{ + "test": "TAG", + }, + } + + requestTagsJSON, _ := json.Marshal(requestDataTags) + + requestTagsBody := bytes.NewBuffer(requestTagsJSON) + + request, err := http.NewRequest(http.MethodPut, "http://localhost:9090/api/v1/buckets/test4/tags", requestTagsBody) + request.Close = true + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + + response, err = client.Do(request) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + // get bucket + request, err = http.NewRequest("GET", "http://localhost:9090/api/v1/buckets/test4", nil) + request.Close = true + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + + response, err = client.Do(request) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + bodyBytes, _ := ioutil.ReadAll(response.Body) + + bucket := models.Bucket{} + err = json.Unmarshal(bodyBytes, &bucket) + if err != nil { + log.Println(err) + } + + assert.Equal("TAG", bucket.Details.Tags["test"], "Failed to add tag") +} + +func TestGetBucket(t *testing.T) { + assert := assert.New(t) + + client := &http.Client{ + Timeout: 2 * time.Second, + } + + response, err := AddBucket("test3", false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + // get bucket + request, err := http.NewRequest("GET", "http://localhost:9090/api/v1/buckets/test3", nil) + if err != nil { + log.Println(err) + return + } + + request.Header.Add("Cookie", fmt.Sprintf("token=%s", token)) + request.Header.Add("Content-Type", "application/json") + + response, err = client.Do(request) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + if response != nil { + assert.Equal(200, response.StatusCode, "Status Code is incorrect") + } +} + +func TestAddBucketLocking(t *testing.T) { + /* + This function is to test that locking can't be activated if versioning + is not enabled. + Then, locking will be activated because versioning is activated as well. + */ + assert := assert.New(t) + + /* + This is valid, versioning is true, then locking can be true as well. + */ + response, err := AddBucket("thujun", true, true, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + return + } + + // Verification part, bucket should be created with versioning enabled and + // locking enabled, we expect 201 when created. + if response != nil { + assert.Equal(201, response.StatusCode, "201 is expected for this test") + } + + defer response.Body.Close() + + /* + To convert an HTTP response body to a string in Go, so you can read the + error from the API in case the bucket is invalid for some reason + */ + b, err := io.ReadAll(response.Body) + if err != nil { + log.Fatalln(err) + } + fmt.Println(string(b)) +} + +func TestAddBucket(t *testing.T) { + assert := assert.New(t) + type args struct { + bucketName string + } + tests := []struct { + name string + args args + expectedStatus int + }{ + { + name: "Add Bucket with valid name", + expectedStatus: 201, + args: args{ + bucketName: "test1", + }, + }, + { + name: "Add Bucket with invalid name", + expectedStatus: 500, + args: args{ + bucketName: "*&^###Test1ThisMightBeInvalid555", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + response, err := AddBucket( + tt.args.bucketName, false, false, nil, nil) + assert.Nil(err) + if err != nil { + log.Println(err) + assert.Fail("Error while adding the bucket") + return + } + finalResponse := inspectHTTPResponse(response) + if response != nil { + assert.Equal(tt.expectedStatus, + response.StatusCode, finalResponse) + } + }) + } +}