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: ®ion.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: ®ion.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: ®ion.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: ®ion.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: ®ion.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: ®ion.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: ®ion.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: ®ion.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: ®ion.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 }