@@ -2,30 +2,63 @@ package wait
22
33import (
44 "context"
5+ "net/http"
56 "testing"
67 "time"
78
89 "github.com/google/go-cmp/cmp"
910 "github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1011 "github.com/stackitcloud/stackit-sdk-go/core/utils"
1112 "github.com/stackitcloud/stackit-sdk-go/services/iaas"
13+ "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager"
1214)
1315
1416type apiClientMocked struct {
15- getNetworkAreaFails bool
16- getNetworkFails bool
17- getProjectRequestFails bool
18- isDeleted bool
19- resourceState string
20- getVolumeFails bool
21- getServerFails bool
22- getAttachedVolumeFails bool
23- getImageFails bool
24- getBackupFails bool
25- isAttached bool
26- requestAction string
27- returnResizing bool
28- getSnapshotFails bool
17+ getNetworkAreaFails bool
18+ getNetworkFails bool
19+ getProjectRequestFails bool
20+ isDeleted bool
21+ resourceState string
22+ getVolumeFails bool
23+ getServerFails bool
24+ getAttachedVolumeFails bool
25+ getImageFails bool
26+ getBackupFails bool
27+ isAttached bool
28+ requestAction string
29+ returnResizing bool
30+ getSnapshotFails bool
31+ listProjectsResponses []listProjectsResponses
32+ listProjectsResponsesIdx int
33+ }
34+
35+ type listProjectsResponses struct {
36+ resp * iaas.ProjectListResponse
37+ err error
38+ }
39+
40+ type resourceManagerClientMocked struct {
41+ getProjectResponses []getProjectResponse
42+ getProjectResponsesIdx int
43+ }
44+
45+ type getProjectResponse struct {
46+ resp * resourcemanager.GetProjectResponse
47+ err error
48+ }
49+
50+ func (r * resourceManagerClientMocked ) GetProjectExecute (_ context.Context , _ string ) (* resourcemanager.GetProjectResponse , error ) {
51+ resp := r .getProjectResponses [r .getProjectResponsesIdx ].resp
52+ err := r .getProjectResponses [r .getProjectResponsesIdx ].err
53+ r .getProjectResponsesIdx = (r .getProjectResponsesIdx + 1 ) % len (r .getProjectResponses )
54+ return resp , err
55+ }
56+
57+ func (a * apiClientMocked ) ListNetworkAreaProjectsExecute (_ context.Context , _ , _ string ) (* iaas.ProjectListResponse , error ) {
58+ resp := a .listProjectsResponses [a .listProjectsResponsesIdx ].resp
59+ err := a .listProjectsResponses [a .listProjectsResponsesIdx ].err
60+ a .listProjectsResponsesIdx = (a .listProjectsResponsesIdx + 1 ) % len (a .listProjectsResponses )
61+ return resp , err
2962}
3063
3164func (a * apiClientMocked ) GetNetworkAreaExecute (_ context.Context , _ , _ string ) (* iaas.NetworkArea , error ) {
@@ -1856,3 +1889,152 @@ func TestDeleteSnapshotWaitHandler(t *testing.T) {
18561889 })
18571890 }
18581891}
1892+
1893+ func TestReadyForNetworkAreaDeletionWaitHandler (t * testing.T ) {
1894+ tests := []struct {
1895+ desc string
1896+ listProjectsResponses []listProjectsResponses
1897+ getProjectResponses []getProjectResponse
1898+ wantErr bool
1899+ wantResp bool
1900+ }{
1901+ {
1902+ desc : "projects still active" ,
1903+ listProjectsResponses : []listProjectsResponses {
1904+ {
1905+ resp : & iaas.ProjectListResponse {
1906+ Items : utils .Ptr ([]string {"project1" , "project2" }),
1907+ },
1908+ err : nil ,
1909+ },
1910+ },
1911+ getProjectResponses : []getProjectResponse {
1912+ {& resourcemanager.GetProjectResponse {}, nil },
1913+ {& resourcemanager.GetProjectResponse {}, nil },
1914+ },
1915+ wantErr : true ,
1916+ wantResp : false ,
1917+ },
1918+ {
1919+ desc : "no projects - ready for deletion" ,
1920+ listProjectsResponses : []listProjectsResponses {
1921+ {
1922+ resp : & iaas.ProjectListResponse {
1923+ Items : utils .Ptr ([]string {}),
1924+ },
1925+ err : nil ,
1926+ },
1927+ },
1928+ getProjectResponses : []getProjectResponse {},
1929+ wantErr : false ,
1930+ wantResp : true ,
1931+ },
1932+ {
1933+ desc : "projects in deletion state" ,
1934+ listProjectsResponses : []listProjectsResponses {
1935+ {
1936+ resp : & iaas.ProjectListResponse {
1937+ Items : utils .Ptr ([]string {"project1" , "project2" }),
1938+ },
1939+ err : nil ,
1940+ },
1941+ {
1942+ resp : & iaas.ProjectListResponse {
1943+ Items : utils .Ptr ([]string {}),
1944+ },
1945+ err : nil ,
1946+ },
1947+ },
1948+ getProjectResponses : []getProjectResponse {
1949+ {nil , oapierror .NewError (http .StatusForbidden , "" )},
1950+ {nil , oapierror .NewError (http .StatusForbidden , "" )},
1951+ },
1952+ wantErr : false ,
1953+ wantResp : true ,
1954+ },
1955+ {
1956+ desc : "network area includes one active project" ,
1957+ listProjectsResponses : []listProjectsResponses {
1958+ {
1959+ resp : & iaas.ProjectListResponse {
1960+ Items : utils .Ptr ([]string {"project1" , "project2" , "project3" }),
1961+ },
1962+ err : nil ,
1963+ },
1964+ },
1965+ getProjectResponses : []getProjectResponse {
1966+ {nil , oapierror .NewError (http .StatusForbidden , "" )},
1967+ {nil , oapierror .NewError (http .StatusForbidden , "" )},
1968+ {& resourcemanager.GetProjectResponse {}, nil },
1969+ },
1970+ wantErr : true ,
1971+ wantResp : false ,
1972+ },
1973+ {
1974+ desc : "network area not found" ,
1975+ listProjectsResponses : []listProjectsResponses {
1976+ {
1977+ resp : nil ,
1978+ err : oapierror .NewError (http .StatusNotFound , "not found" ),
1979+ },
1980+ },
1981+ getProjectResponses : []getProjectResponse {},
1982+ wantErr : true ,
1983+ wantResp : false ,
1984+ },
1985+ {
1986+ desc : "network area items is nil" ,
1987+ listProjectsResponses : []listProjectsResponses {
1988+ {
1989+ resp : & iaas.ProjectListResponse {
1990+ Items : nil ,
1991+ },
1992+ },
1993+ },
1994+ wantErr : true ,
1995+ wantResp : false ,
1996+ },
1997+ {
1998+ desc : "timeout" ,
1999+ listProjectsResponses : []listProjectsResponses {
2000+ {
2001+ resp : & iaas.ProjectListResponse {
2002+ Items : utils .Ptr ([]string {"project1" }),
2003+ },
2004+ err : nil ,
2005+ },
2006+ },
2007+ getProjectResponses : []getProjectResponse {
2008+ {nil , oapierror .NewError (http .StatusForbidden , "" )},
2009+ },
2010+ wantErr : true ,
2011+ wantResp : false ,
2012+ },
2013+ }
2014+ for _ , tt := range tests {
2015+ t .Run (tt .desc , func (t * testing.T ) {
2016+ apiClient := & apiClientMocked {
2017+ listProjectsResponses : tt .listProjectsResponses ,
2018+ }
2019+
2020+ rmApiClient := & resourceManagerClientMocked {
2021+ getProjectResponses : tt .getProjectResponses ,
2022+ }
2023+
2024+ var wantRes * iaas.ProjectListResponse
2025+ if tt .wantResp {
2026+ wantRes = tt .listProjectsResponses [len (tt .listProjectsResponses )- 1 ].resp
2027+ }
2028+
2029+ handler := ReadyForNetworkAreaDeletionWaitHandler (context .Background (), apiClient , rmApiClient , "oid" , "aid" )
2030+ gotRes , err := handler .SetTimeout (200 * time .Millisecond ).SetThrottle (5 * time .Millisecond ).WaitWithContext (context .Background ())
2031+
2032+ if (err != nil ) != tt .wantErr {
2033+ t .Fatalf ("handler error = %v, wantErr %v" , err , tt .wantErr )
2034+ }
2035+ if ! cmp .Equal (gotRes , wantRes ) {
2036+ t .Fatalf ("handler gotRes = %v, want %v" , gotRes , wantRes )
2037+ }
2038+ })
2039+ }
2040+ }
0 commit comments