...

Source file src/edge-infra.dev/pkg/edge/api/graph/integration/resolver_test.go

Documentation: edge-infra.dev/pkg/edge/api/graph/integration

     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  	//testSyncType           = "flux"
    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 // this share and configure by unit and integration tests
    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  // SetHeader set a header to the outgoing request. This is useful for setting expected Authentication headers for example.
   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  	// waiting for secrets to sync
   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