...
1 package integration_test
2
3 import (
4 "context"
5 "database/sql"
6 "errors"
7 "flag"
8 "fmt"
9 "log"
10 "os"
11 "path/filepath"
12 "strings"
13 "testing"
14
15 "edge-infra.dev/pkg/edge/api/graph/model"
16 "edge-infra.dev/pkg/edge/api/graph/resolver"
17 testApi "edge-infra.dev/pkg/edge/api/graph/test"
18 "edge-infra.dev/pkg/edge/api/sql/utils"
19 "edge-infra.dev/pkg/edge/api/types"
20 "edge-infra.dev/test/framework"
21 "edge-infra.dev/test/framework/integration"
22
23 gqlclient "github.com/99designs/gqlgen/client"
24 "github.com/golang/mock/gomock"
25 "github.com/joho/godotenv"
26 "github.com/stretchr/testify/suite"
27 "github.com/udacity/graphb"
28 "google.golang.org/api/option"
29 "k8s.io/apimachinery/pkg/util/wait"
30 "k8s.io/client-go/util/retry"
31 "sigs.k8s.io/controller-runtime/pkg/client"
32 )
33
34 var (
35 cfg = &types.TestConfig{}
36 err error
37 ResolverClient GraphqlClient
38
39 testOrg = "test-org"
40 testRootOrg = "/bsl-root/test-org/"
41 testRegion = "region-infra"
42 testClusterNumNodes = 3
43 testClusterVersion = "1.21.4-gke.2300"
44 testClusterZone = "us-east1-b"
45 testClusterMachineType = "n1-standard-4"
46 testUser = "acct:emerald-edge-dev@testing"
47 testEmail = "jd250001@ncr.com"
48 testUserName = "testing"
49 testUsername = "emerald-edge-dev"
50
51 testSiteID = "test-site-id"
52 badCluster = "bad-cluster"
53 projectID = "test-project"
54 testStore = "test-store"
55 testStoreID = "test-store-id"
56
57 testLocation = "us-east1-b"
58 testUserRole = "EDGE_ORG_ADMIN"
59
60 jwtSecret = "test-secret"
61 totpSecret = "totp-secret"
62 superAdminRole = string(model.RoleEdgeOrgAdmin)
63 edgeLeadsRole = string(model.RoleEdgeEngineeringLeads)
64 adminRole = string(model.RoleEdgeBannerAdmin)
65
66 errResourceNotYetReady = errors.New("resource not yet ready")
67 defaultRetry wait.Backoff
68
69 testHelmRepoURL = "https://charts.bitnami.com/bitnami"
70 testHelmRepo = "bitnami"
71 testHelmChart = "nginx"
72 testHelmVersion = "0.0.1"
73 testHelmSecret = "bitnami"
74 testHelmUpdatedVersion = "0.02"
75 )
76
77 func TestMain(m *testing.M) {
78 _ = godotenv.Load(filepath.Join("pkg", "edge", "api", "graph", "resolver", ".env"))
79 flags := flag.NewFlagSet("ee-bff-golang", flag.ContinueOnError)
80 cfg.BindFlags(flags)
81 cfg.Config.BindKubeConfigFlag(flags)
82 framework.HandleFlags()
83 testApi.SetupBaseStructure(cfg)
84 os.Exit(m.Run())
85 }
86
87 type Suite struct {
88 *framework.Framework
89 client client.Client
90 ctx context.Context
91 projectID string
92 testBannerEU *utils.Banner
93 testTime string
94 ChariotClient option.ClientOption
95 Resolver *resolver.Resolver
96 DB *sql.DB
97 Config *types.TestConfig
98 }
99
100 func TestResolversFramework(t *testing.T) {
101 var s *Suite
102 if integration.IsIntegrationTest() {
103 s, err = setupIntegrationTest(cfg)
104 if err != nil {
105 t.Fatal(err)
106 }
107 } else {
108 MockCtrl = gomock.NewController(t)
109 s, err = setupUnitTest(cfg)
110 if err != nil {
111 t.Fatal(err)
112 }
113 }
114
115 suite.Run(t, s)
116
117 t.Cleanup(func() {
118 if !integration.IsIntegrationTest() {
119 cleanupUnitTest()
120 }
121 })
122 }
123
124 func MustParse(q graphb.Query) string {
125 query, err := q.StringChan()
126 if err != nil {
127 log.Fatal(err)
128 }
129 return graphb.StringFromChan(query)
130 }
131
132
133 func SetHeader(key string, value string) gqlclient.Option {
134 return func(bd *gqlclient.Request) {
135 bd.HTTP.Header.Set(key, value)
136 }
137 }
138
139 func isRetryable(err error) bool {
140
141 if strings.Contains(err.Error(), "is forbidden") ||
142 strings.Contains(err.Error(), "connection refused") ||
143 strings.Contains(err.Error(), "timeout") ||
144 strings.Contains(err.Error(), "timed out") ||
145 strings.Contains(err.Error(), "try again") ||
146 strings.Contains(err.Error(), "502") ||
147 strings.Contains(err.Error(), "an error on the server") ||
148 strings.Contains(err.Error(), "client connection lost") {
149 return true
150 }
151 return err == errResourceNotYetReady
152 }
153
154 func GraphqlRetry(query string, response interface{}, isReady func() bool) error {
155 return graphqlRetry(defaultRetry, query, response, isReady)
156 }
157
158 func graphqlRetry(backOff wait.Backoff, query string, response interface{}, isReady func() bool) error {
159 return retry.OnError(backOff, isRetryable, func() error {
160 if err := ResolverClient.Post(query, response); err != nil {
161 fmt.Printf("failed to retry for: %s\n %v\n", query, err)
162 return err
163 }
164 if isReady() {
165 return nil
166 }
167 return errResourceNotYetReady
168 })
169 }
170
View as plain text