github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/objects/object_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package objects_test
     5  
     6  import (
     7  	"context"
     8  	"encoding/base64"
     9  	"encoding/json"
    10  	"net/http"
    11  	"net/http/httptest"
    12  	"strings"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/qiniu/go-sdk/v7/storagev2/apis/stat_object"
    17  	"github.com/qiniu/go-sdk/v7/storagev2/credentials"
    18  	"github.com/qiniu/go-sdk/v7/storagev2/http_client"
    19  	"github.com/qiniu/go-sdk/v7/storagev2/objects"
    20  	"github.com/qiniu/go-sdk/v7/storagev2/region"
    21  )
    22  
    23  func TestObjectStat(t *testing.T) {
    24  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
    25  		switch r.Method {
    26  		case http.MethodGet:
    27  			if r.URL.RequestURI() == "/stat/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"?needparts=true" {
    28  				rw.Header().Set("Content-Type", "application/json")
    29  				jsonData, err := json.Marshal(&stat_object.Response{
    30  					Size:                        4 * 1024 * 1024,
    31  					Hash:                        "testhash1",
    32  					MimeType:                    "application/json",
    33  					Type:                        0,
    34  					PutTime:                     time.Now().UnixNano() / 100,
    35  					RestoringStatus:             0,
    36  					Status:                      0,
    37  					TransitionToIaTime:          time.Now().Add(24 * time.Hour).Unix(),
    38  					TransitionToArchiveIrTime:   time.Now().Add(2 * 24 * time.Hour).Unix(),
    39  					TransitionToArchiveTime:     time.Now().Add(3 * 24 * time.Hour).Unix(),
    40  					TransitionToDeepArchiveTime: time.Now().Add(4 * 24 * time.Hour).Unix(),
    41  					ExpirationTime:              time.Now().Add(5 * 24 * time.Hour).Unix(),
    42  					Metadata:                    map[string]string{"x-qn-meta-a": "b"},
    43  					Parts:                       []int64{4 * 1024 * 1024},
    44  				})
    45  				if err != nil {
    46  					t.Fatal(err)
    47  				}
    48  				rw.Header().Add("X-ReqId", "fakereqid")
    49  				rw.Write(jsonData)
    50  			} else {
    51  				t.Fatalf("unexpected path")
    52  			}
    53  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
    54  				t.Fatalf("unexpected authorization")
    55  			}
    56  		default:
    57  			t.Fatalf("unexpected method: %s", r.Method)
    58  		}
    59  	}))
    60  	defer server.Close()
    61  
    62  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
    63  		Options: http_client.Options{
    64  			Credentials: credentials.NewCredentials("testak", "testsk"),
    65  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
    66  		},
    67  	})
    68  	bucket := objectsManager.Bucket("bucket1")
    69  	if obj, err := bucket.Object("testobject").Stat().NeedParts(true).Call(context.Background()); err != nil {
    70  		t.Fatal(err)
    71  	} else {
    72  		if obj.Size != 4*1024*1024 {
    73  			t.Fatalf("unexpected fsize")
    74  		}
    75  		if obj.ETag != "testhash1" {
    76  			t.Fatalf("unexpected etag")
    77  		}
    78  		if obj.MimeType != "application/json" {
    79  			t.Fatalf("unexpected mimeType")
    80  		}
    81  		if obj.UploadedAt.Unix()-time.Now().Unix() >= 10 {
    82  			t.Fatalf("unexpected putTime")
    83  		}
    84  		if obj.TransitionToIA.Unix()-time.Now().Add(24*time.Hour).Unix() >= 10 {
    85  			t.Fatalf("unexpected transitionToIA")
    86  		}
    87  		if obj.TransitionToArchiveIR.Unix()-time.Now().Add(2*24*time.Hour).Unix() >= 10 {
    88  			t.Fatalf("unexpected transitionToArchiveIR")
    89  		}
    90  		if obj.TransitionToArchive.Unix()-time.Now().Add(3*24*time.Hour).Unix() >= 10 {
    91  			t.Fatalf("unexpected transitionToArchive")
    92  		}
    93  		if obj.TransitionToDeepArchive.Unix()-time.Now().Add(4*24*time.Hour).Unix() >= 10 {
    94  			t.Fatalf("unexpected transitionToDeepArchive")
    95  		}
    96  		if obj.ExpireAt.Unix()-time.Now().Add(5*24*time.Hour).Unix() >= 10 {
    97  			t.Fatalf("unexpected expiration")
    98  		}
    99  		if len(obj.Metadata) != 1 || obj.Metadata["x-qn-meta-a"] != "b" {
   100  			t.Fatalf("unexpected metadata")
   101  		}
   102  		if len(obj.Parts) != 1 || obj.Parts[0] != 4*1024*1024 {
   103  			t.Fatalf("unexpected parts")
   104  		}
   105  	}
   106  }
   107  
   108  func TestObjectMoveTo(t *testing.T) {
   109  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   110  		switch r.Method {
   111  		case http.MethodPost:
   112  			if r.URL.RequestURI() != "/move/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"/"+base64.URLEncoding.EncodeToString([]byte("bucket2:testobject")) {
   113  				t.Fatalf("unexpected path")
   114  			}
   115  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   116  				t.Fatalf("unexpected authorization")
   117  			}
   118  			rw.Header().Add("X-ReqId", "fakereqid")
   119  		default:
   120  			t.Fatalf("unexpected method: %s", r.Method)
   121  		}
   122  	}))
   123  	defer server.Close()
   124  
   125  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   126  		Options: http_client.Options{
   127  			Credentials: credentials.NewCredentials("testak", "testsk"),
   128  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   129  		},
   130  	})
   131  	bucket := objectsManager.Bucket("bucket1")
   132  	if err := bucket.Object("testobject").MoveTo("bucket2", "testobject").Call(context.Background()); err != nil {
   133  		t.Fatal(err)
   134  	}
   135  }
   136  
   137  func TestObjectCopyTo(t *testing.T) {
   138  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   139  		switch r.Method {
   140  		case http.MethodPost:
   141  			if r.URL.RequestURI() != "/copy/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"/"+base64.URLEncoding.EncodeToString([]byte("bucket2:testobject")) {
   142  				t.Fatalf("unexpected path")
   143  			}
   144  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   145  				t.Fatalf("unexpected authorization")
   146  			}
   147  			rw.Header().Add("X-ReqId", "fakereqid")
   148  		default:
   149  			t.Fatalf("unexpected method: %s", r.Method)
   150  		}
   151  	}))
   152  	defer server.Close()
   153  
   154  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   155  		Options: http_client.Options{
   156  			Credentials: credentials.NewCredentials("testak", "testsk"),
   157  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   158  		},
   159  	})
   160  	bucket := objectsManager.Bucket("bucket1")
   161  	if err := bucket.Object("testobject").CopyTo("bucket2", "testobject").Call(context.Background()); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  }
   165  
   166  func TestObjectDelete(t *testing.T) {
   167  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   168  		switch r.Method {
   169  		case http.MethodPost:
   170  			if r.URL.RequestURI() != "/delete/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject")) {
   171  				t.Fatalf("unexpected path")
   172  			}
   173  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   174  				t.Fatalf("unexpected authorization")
   175  			}
   176  			rw.Header().Add("X-ReqId", "fakereqid")
   177  		default:
   178  			t.Fatalf("unexpected method: %s", r.Method)
   179  		}
   180  	}))
   181  	defer server.Close()
   182  
   183  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   184  		Options: http_client.Options{
   185  			Credentials: credentials.NewCredentials("testak", "testsk"),
   186  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   187  		},
   188  	})
   189  	bucket := objectsManager.Bucket("bucket1")
   190  	if err := bucket.Object("testobject").Delete().Call(context.Background()); err != nil {
   191  		t.Fatal(err)
   192  	}
   193  }
   194  
   195  func TestObjectRestore(t *testing.T) {
   196  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   197  		switch r.Method {
   198  		case http.MethodPost:
   199  			if r.URL.RequestURI() != "/restoreAr/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"/freezeAfterDays/7" {
   200  				t.Fatalf("unexpected path")
   201  			}
   202  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   203  				t.Fatalf("unexpected authorization")
   204  			}
   205  			rw.Header().Add("X-ReqId", "fakereqid")
   206  		default:
   207  			t.Fatalf("unexpected method: %s", r.Method)
   208  		}
   209  	}))
   210  	defer server.Close()
   211  
   212  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   213  		Options: http_client.Options{
   214  			Credentials: credentials.NewCredentials("testak", "testsk"),
   215  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   216  		},
   217  	})
   218  	bucket := objectsManager.Bucket("bucket1")
   219  	if err := bucket.Object("testobject").Restore(7).Call(context.Background()); err != nil {
   220  		t.Fatal(err)
   221  	}
   222  }
   223  
   224  func TestObjectSetStorageClass(t *testing.T) {
   225  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   226  		switch r.Method {
   227  		case http.MethodPost:
   228  			if r.URL.RequestURI() != "/chtype/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"/type/4" {
   229  				t.Fatalf("unexpected path")
   230  			}
   231  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   232  				t.Fatalf("unexpected authorization")
   233  			}
   234  			rw.Header().Add("X-ReqId", "fakereqid")
   235  		default:
   236  			t.Fatalf("unexpected method: %s", r.Method)
   237  		}
   238  	}))
   239  	defer server.Close()
   240  
   241  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   242  		Options: http_client.Options{
   243  			Credentials: credentials.NewCredentials("testak", "testsk"),
   244  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   245  		},
   246  	})
   247  	bucket := objectsManager.Bucket("bucket1")
   248  	if err := bucket.Object("testobject").SetStorageClass(objects.ArchiveIRStorageClass).Call(context.Background()); err != nil {
   249  		t.Fatal(err)
   250  	}
   251  }
   252  
   253  func TestObjectSetStatus(t *testing.T) {
   254  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   255  		switch r.Method {
   256  		case http.MethodPost:
   257  			if r.URL.RequestURI() != "/chstatus/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+"/status/1" {
   258  				t.Fatalf("unexpected path")
   259  			}
   260  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   261  				t.Fatalf("unexpected authorization")
   262  			}
   263  			rw.Header().Add("X-ReqId", "fakereqid")
   264  		default:
   265  			t.Fatalf("unexpected method: %s", r.Method)
   266  		}
   267  	}))
   268  	defer server.Close()
   269  
   270  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   271  		Options: http_client.Options{
   272  			Credentials: credentials.NewCredentials("testak", "testsk"),
   273  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   274  		},
   275  	})
   276  	bucket := objectsManager.Bucket("bucket1")
   277  	if err := bucket.Object("testobject").SetStatus(objects.DisabledStatus).Call(context.Background()); err != nil {
   278  		t.Fatal(err)
   279  	}
   280  }
   281  
   282  func TestObjectSetMetadata(t *testing.T) {
   283  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   284  		switch r.Method {
   285  		case http.MethodPost:
   286  			if r.URL.RequestURI() != "/chgm/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+
   287  				"/mime/"+base64.URLEncoding.EncodeToString([]byte("application/json"))+
   288  				"/cond/"+base64.URLEncoding.EncodeToString([]byte("fsize=1"))+
   289  				"/x-qn-meta-a/"+base64.URLEncoding.EncodeToString([]byte("b")) {
   290  				t.Fatalf("unexpected path: %s", r.URL.RequestURI())
   291  			}
   292  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   293  				t.Fatalf("unexpected authorization")
   294  			}
   295  			rw.Header().Add("X-ReqId", "fakereqid")
   296  		default:
   297  			t.Fatalf("unexpected method: %s", r.Method)
   298  		}
   299  	}))
   300  	defer server.Close()
   301  
   302  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   303  		Options: http_client.Options{
   304  			Credentials: credentials.NewCredentials("testak", "testsk"),
   305  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   306  		},
   307  	})
   308  	bucket := objectsManager.Bucket("bucket1")
   309  	if err := bucket.Object("testobject").SetMetadata("application/json").
   310  		Metadata(map[string]string{"a": "b"}).
   311  		Conditions(map[string]string{"fsize": "1"}).
   312  		Call(context.Background()); err != nil {
   313  		t.Fatal(err)
   314  	}
   315  }
   316  
   317  func TestObjectSetLifeCycle(t *testing.T) {
   318  	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
   319  		switch r.Method {
   320  		case http.MethodPost:
   321  			if r.URL.RequestURI() != "/lifecycle/"+base64.URLEncoding.EncodeToString([]byte("bucket1:testobject"))+
   322  				"/toIAAfterDays/1/toArchiveAfterDays/3/toDeepArchiveAfterDays/4/toArchiveIRAfterDays/2/deleteAfterDays/5" {
   323  				t.Fatalf("unexpected path: %s", r.URL.RequestURI())
   324  			}
   325  			if !strings.HasPrefix(r.Header.Get("Authorization"), "Qiniu testak:") {
   326  				t.Fatalf("unexpected authorization")
   327  			}
   328  			rw.Header().Add("X-ReqId", "fakereqid")
   329  		default:
   330  			t.Fatalf("unexpected method: %s", r.Method)
   331  		}
   332  	}))
   333  	defer server.Close()
   334  
   335  	objectsManager := objects.NewObjectsManager(&objects.ObjectsManagerOptions{
   336  		Options: http_client.Options{
   337  			Credentials: credentials.NewCredentials("testak", "testsk"),
   338  			Regions:     &region.Region{Rs: region.Endpoints{Preferred: []string{server.URL}}},
   339  		},
   340  	})
   341  	bucket := objectsManager.Bucket("bucket1")
   342  	if err := bucket.Object("testobject").
   343  		SetLifeCycle().
   344  		ToIAAfterDays(1).
   345  		ToArchiveIRAfterDays(2).
   346  		ToArchiveAfterDays(3).
   347  		ToDeepArchiveAfterDays(4).
   348  		DeleteAfterDays(5).
   349  		Call(context.Background()); err != nil {
   350  		t.Fatal(err)
   351  	}
   352  }