github.com/optim-corp/cios-golang-sdk@v0.5.1/sdk/service_filestorage_bucket_test.go (about)

     1  package ciossdk
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"net/url"
    10  	"testing"
    11  	"time"
    12  
    13  	srvfilestorage "github.com/optim-corp/cios-golang-sdk/sdk/service/filestorage"
    14  
    15  	ciosctx "github.com/optim-corp/cios-golang-sdk/ctx"
    16  
    17  	xmath "github.com/fcfcqloow/go-advance/math"
    18  
    19  	cnv "github.com/fcfcqloow/go-advance/convert"
    20  
    21  	"github.com/optim-corp/cios-golang-sdk/cios"
    22  	sdkmodel "github.com/optim-corp/cios-golang-sdk/model"
    23  )
    24  
    25  func Test_RefreshBucket(t *testing.T) {
    26  	count, _token, ctx := 0, "", context.Background()
    27  	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    28  		w.Header().Set("Content-Type", "application/json")
    29  		_token = r.Header.Get("Authorization")
    30  		if r.URL.Path == "/connect/token" {
    31  			count += 1
    32  			json.NewEncoder(w).Encode(cios.ConnectTokenResponse{
    33  				AccessToken:  sampleToken,
    34  				TokenType:    "",
    35  				RefreshToken: "",
    36  				ExpiresIn:    0,
    37  				Scope:        "",
    38  			})
    39  		}
    40  	})
    41  	ts := httptest.NewServer(handler)
    42  	client := NewCiosClient(CiosClientConfig{
    43  		AutoRefresh: true,
    44  		Urls:        sdkmodel.CIOSUrl{StorageUrl: ts.URL, AuthUrl: ts.URL},
    45  		AuthConfig: RefreshTokenAuth(
    46  			"clientID",
    47  			"clientSecret",
    48  			"assertion",
    49  			"scope",
    50  		),
    51  	})
    52  	funcs := []func(){
    53  		func() { client.FileStorage().GetBuckets(ctx, srvfilestorage.MakeGetBucketsOpts()) },
    54  		func() { client.FileStorage().CreateBucket(ctx, "", "") },
    55  		func() { client.FileStorage().GetBucket(ctx, "") },
    56  		func() { client.FileStorage().UpdateBucket(ctx, "", "") },
    57  		func() { client.FileStorage().DeleteBucket(ctx, "") },
    58  	}
    59  	for i, fnc := range funcs {
    60  		fnc()
    61  		if _token != "Bearer "+sampleToken {
    62  			t.Fatal(_token)
    63  		}
    64  		if count != i+1 {
    65  			t.Fatal(count)
    66  		}
    67  		_token = ""
    68  	}
    69  	for _, fnc := range funcs {
    70  		client.SetTokenExp(time.Now().Unix() + 10000)
    71  		fnc()
    72  		if _token != "Bearer "+sampleToken {
    73  			t.Fatal(_token)
    74  		}
    75  		if count != len(funcs) {
    76  			t.Fatal(count)
    77  		}
    78  		_token = ""
    79  	}
    80  
    81  	ctx = ciosctx.WithToken(ctx, "AAA")
    82  	count = 0
    83  	_token = ""
    84  	client = NewCiosClient(CiosClientConfig{
    85  		AutoRefresh: true,
    86  		Urls:        sdkmodel.CIOSUrl{StorageUrl: ts.URL, AuthUrl: ts.URL},
    87  		AuthConfig: RefreshTokenAuth(
    88  			"clientID",
    89  			"clientSecret",
    90  			"assertion",
    91  			"scope",
    92  		),
    93  	})
    94  	for i, fnc := range funcs {
    95  		fnc()
    96  		if _token != "Bearer AAA" {
    97  			t.Fatal(_token)
    98  		}
    99  		if count != i+1 {
   100  			t.Fatal(count)
   101  		}
   102  		_token = ""
   103  	}
   104  }
   105  
   106  func TestFileStorage_GetBuckets(t *testing.T) {
   107  	var (
   108  		query url.Values
   109  		ctx   context.Context
   110  
   111  		tests = []struct {
   112  			params cios.ApiGetBucketsRequest
   113  			test   func()
   114  		}{
   115  			{
   116  				params: srvfilestorage.MakeGetBucketsOpts().Limit(1000),
   117  				test: func() {
   118  					if query.Get("limit") != "1000" {
   119  						t.Fatal("Missing Query", query.Encode())
   120  					} else {
   121  						t.Log(query.Encode())
   122  					}
   123  				},
   124  			},
   125  			{
   126  				params: srvfilestorage.MakeGetBucketsOpts().Limit(1000).Offset(50),
   127  				test: func() {
   128  					if query.Get("limit") != "1000" || query.Get("offset") != "50" {
   129  						t.Fatal("Missing Query", query.Encode())
   130  					} else {
   131  						t.Log(query.Encode())
   132  					}
   133  				},
   134  			},
   135  			{
   136  				params: srvfilestorage.MakeGetBucketsOpts().ResourceOwnerId("aaaaa"),
   137  				test: func() {
   138  					if query.Get("resource_owner_id") != "aaaaa" {
   139  						t.Fatal("Missing Query", query.Encode())
   140  					} else {
   141  						t.Log(query.Encode())
   142  					}
   143  				},
   144  			},
   145  			{
   146  				params: srvfilestorage.MakeGetBucketsOpts().Limit(1000).Offset(50).ResourceOwnerId("aaaaa").Name("name"),
   147  				test: func() {
   148  					if query.Get("resource_owner_id") != "aaaaa" ||
   149  						query.Get("name") != "name" {
   150  						t.Fatal("Missing Query", query.Encode())
   151  					} else {
   152  						t.Log(query.Encode())
   153  					}
   154  				},
   155  			},
   156  			{
   157  				params: srvfilestorage.MakeGetBucketsOpts().OrderBy("created_at"),
   158  				test: func() {
   159  					if query.Get("order_by") != "created_at" {
   160  						t.Fatal("Missing Query", query.Encode())
   161  					} else {
   162  						t.Log(query.Encode())
   163  					}
   164  				},
   165  			},
   166  			{
   167  				params: srvfilestorage.MakeGetBucketsOpts().OrderBy("").Order("").ResourceOwnerId("").Name(""),
   168  				test: func() {
   169  					if query.Encode() != "" {
   170  						t.Fatal("Missing Query", query.Encode())
   171  					} else {
   172  						t.Log(query.Encode())
   173  					}
   174  				},
   175  			},
   176  		}
   177  	)
   178  
   179  	// Query Test
   180  	bucketHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   181  		query = r.URL.Query()
   182  		w.Header().Set("Content-Type", "application/json")
   183  		json.NewEncoder(w).Encode(cios.MultipleBucket{Total: 10})
   184  	})
   185  	ts := httptest.NewServer(bucketHandler)
   186  	client := NewCiosClient(
   187  		CiosClientConfig{
   188  			Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL},
   189  		},
   190  	)
   191  	defer ts.Close()
   192  	for _, test := range tests {
   193  		client.FileStorage().GetBuckets(ctx, test.params)
   194  		test.test()
   195  	}
   196  
   197  	ts.Close()
   198  }
   199  
   200  func TestFileStorage_GetBucketsAll(t *testing.T) {
   201  	var offsets []int
   202  	var limits []int
   203  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   204  		w.Header().Set("Content-Type", "application/json")
   205  		response := cios.MultipleBucket{Total: 3500, Buckets: []cios.Bucket{}}
   206  		offset := cnv.MustInt(r.URL.Query().Get("offset"))
   207  		limit := cnv.MustInt(r.URL.Query().Get("limit"))
   208  		offsets = append(offsets, offset)
   209  		limits = append(limits, limit)
   210  		for i := 0; i < xmath.MinInt(3500-offset, 1000, limit); i++ {
   211  			response.Buckets = append(response.Buckets, cios.Bucket{Id: cnv.MustStr(i)})
   212  		}
   213  		json.NewEncoder(w).Encode(response)
   214  	}))
   215  	defer ts.Close()
   216  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   217  
   218  	buckets, _, _ := client.FileStorage().GetBucketsAll(nil, srvfilestorage.MakeGetBucketsOpts().Limit(999))
   219  	if len(buckets) != 999 || offsets[0] != 0 && limits[0] != 1000 {
   220  		t.Fatal(len(buckets))
   221  	}
   222  
   223  	offsets = []int{}
   224  	limits = []int{}
   225  	buckets, _, _ = client.FileStorage().GetBucketsAll(nil, srvfilestorage.MakeGetBucketsOpts().Limit(1500))
   226  	if len(buckets) != 1500 || offsets[0] != 0 && limits[0] != 1000 || offsets[1] != 1000 && limits[1] != 1000 {
   227  		t.Fatal(len(buckets), limits, offsets)
   228  	}
   229  	offsets = []int{}
   230  	limits = []int{}
   231  	buckets, _, _ = client.FileStorage().GetBucketsAll(nil, srvfilestorage.MakeGetBucketsOpts().Limit(2001))
   232  	if len(buckets) != 2001 || offsets[0] != 0 && limits[0] != 1000 || offsets[1] != 1000 && limits[1] != 1000 || offsets[2] != 2000 || limits[2] != 1 {
   233  		t.Fatal(len(buckets), limits, offsets)
   234  
   235  	}
   236  	offsets = []int{}
   237  	limits = []int{}
   238  	buckets, _, _ = client.FileStorage().GetBucketsAll(nil, srvfilestorage.MakeGetBucketsOpts().Limit(3501))
   239  	if len(buckets) != 3500 ||
   240  		offsets[0] != 0 || limits[0] != 1000 ||
   241  		offsets[1] != 1000 && limits[1] != 1000 ||
   242  		offsets[2] != 2000 || limits[2] != 1000 ||
   243  		offsets[3] != 3000 || limits[3] != 501 {
   244  		t.Fatal(len(buckets), limits, offsets)
   245  	}
   246  	offsets = []int{}
   247  	limits = []int{}
   248  	buckets, _, _ = client.FileStorage().GetBucketsAll(nil, srvfilestorage.MakeGetBucketsOpts().Limit(2001).Offset(20))
   249  	if len(buckets) != 2001 || offsets[0] != 20 && limits[0] != 1000 || offsets[1] != 1020 && limits[1] != 1000 || offsets[2] != 2020 || limits[2] != 1 {
   250  		t.Fatal(len(buckets), limits, offsets)
   251  
   252  	}
   253  }
   254  
   255  func TestFileStorage_GetBucketsUnlimited(t *testing.T) {
   256  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   257  		w.Header().Set("Content-Type", "application/json")
   258  		response := cios.MultipleBucket{Total: 3500, Buckets: []cios.Bucket{}}
   259  		offset := cnv.MustInt(r.URL.Query().Get("offset"))
   260  		limit := cnv.MustInt(r.URL.Query().Get("limit"))
   261  		for i := 0; i < xmath.MinInt(3500-offset, 1000, limit); i++ {
   262  			response.Buckets = append(response.Buckets, cios.Bucket{Id: cnv.MustStr(i)})
   263  		}
   264  		json.NewEncoder(w).Encode(response)
   265  	}))
   266  	defer ts.Close()
   267  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   268  
   269  	buckets, _, _ := client.FileStorage().GetBucketsUnlimited(nil, srvfilestorage.MakeGetBucketsOpts().Limit(1))
   270  	if len(buckets) != 3500 {
   271  		t.Fatal(len(buckets))
   272  	}
   273  }
   274  
   275  func TestFileStorage_GetBucket(t *testing.T) {
   276  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   277  		w.Header().Set("Content-Type", "application/json")
   278  		if r.URL.Path == "/v2/file_storage/buckets/test" {
   279  			response := cios.SingleBucket{Bucket: cios.Bucket{
   280  				Id:              "test",
   281  				ResourceOwnerId: "test_resource_owner",
   282  				CreatedAt:       nil,
   283  				CreatedBy:       nil,
   284  				UpdatedAt:       nil,
   285  				UpdatedBy:       nil,
   286  				Name:            "",
   287  				Files:           nil,
   288  			}}
   289  			json.NewEncoder(w).Encode(response)
   290  		}
   291  	}))
   292  	defer ts.Close()
   293  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   294  	bucket, response, err := client.FileStorage().GetBucket(nil, "test")
   295  	if bucket.Id != "test" || err != nil || response.StatusCode != 200 {
   296  		t.Fatal(bucket)
   297  	}
   298  }
   299  
   300  func TestFileStorage_CreateBucket(t *testing.T) {
   301  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   302  		w.Header().Set("Content-Type", "application/json")
   303  		body := cios.BucketRequest{}
   304  		if r.Method != "POST" {
   305  			t.Fatal(r.Method)
   306  		}
   307  		byts, _ := ioutil.ReadAll(r.Body)
   308  		cnv.UnMarshalJson(byts, &body)
   309  		if body.Name != "name" || body.ResourceOwnerId != "resource_owner_id" {
   310  			t.Fatal(body)
   311  		}
   312  
   313  	}))
   314  	defer ts.Close()
   315  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   316  	_, _, err := client.FileStorage().CreateBucket(nil, "resource_owner_id", "name")
   317  	if err != nil {
   318  		t.Fatal(err.Error())
   319  	}
   320  }
   321  
   322  func TestFileStorage_DeleteBucket(t *testing.T) {
   323  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   324  		w.Header().Set("Content-Type", "application/json")
   325  		if r.URL.Path != "/v2/file_storage/buckets/bucketid" {
   326  			t.Fatal(r.URL.Path)
   327  		}
   328  		if r.Method != "DELETE" {
   329  			t.Fatal(r.Method)
   330  		}
   331  	}))
   332  	defer ts.Close()
   333  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   334  	_, err := client.FileStorage().DeleteBucket(nil, "bucketid")
   335  	if err != nil {
   336  		t.Fatal(err.Error())
   337  	}
   338  }
   339  func TestFileStorage_UpdateBucket(t *testing.T) {
   340  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   341  		w.Header().Set("Content-Type", "application/json")
   342  		body := cios.BucketName{}
   343  		byts, _ := ioutil.ReadAll(r.Body)
   344  		cnv.UnMarshalJson(byts, &body)
   345  		if r.URL.Path != "/v2/file_storage/buckets/bucketid" {
   346  			t.Fatal(r.URL.Path)
   347  		}
   348  		if r.Method != "PATCH" {
   349  			t.Fatal(r.Method)
   350  		}
   351  		if body.Name != "test" {
   352  			t.Fatal(body)
   353  		}
   354  	}))
   355  	defer ts.Close()
   356  	client := NewCiosClient(CiosClientConfig{Urls: sdkmodel.CIOSUrl{StorageUrl: ts.URL}})
   357  	_, err := client.FileStorage().UpdateBucket(nil, "bucketid", "test")
   358  	if err != nil {
   359  		t.Fatal(err.Error())
   360  	}
   361  }