flamingo.me/flamingo-commerce/v3@v3.11.0/test/integrationtest/projecttest/helper/helper.go (about)

     1  package helper
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"flamingo.me/graphql"
    10  	"github.com/gavv/httpexpect/v2"
    11  
    12  	fakeCustomer "flamingo.me/flamingo-commerce/v3/test/integrationtest/projecttest/modules/customer"
    13  	"flamingo.me/flamingo/v3"
    14  	"flamingo.me/flamingo/v3/core/auth"
    15  	fakeAuth "flamingo.me/flamingo/v3/core/auth/fake"
    16  	"flamingo.me/flamingo/v3/core/healthcheck"
    17  	"flamingo.me/flamingo/v3/core/locale"
    18  	"flamingo.me/flamingo/v3/core/security"
    19  	"flamingo.me/flamingo/v3/framework/cmd"
    20  	"flamingo.me/flamingo/v3/framework/web/filter"
    21  
    22  	"flamingo.me/flamingo-commerce/v3/customer"
    23  	integrationCart "flamingo.me/flamingo-commerce/v3/test/integrationtest/projecttest/modules/cart"
    24  	"flamingo.me/flamingo-commerce/v3/test/integrationtest/projecttest/modules/payment"
    25  	"flamingo.me/flamingo-commerce/v3/test/integrationtest/projecttest/modules/placeorder"
    26  
    27  	"flamingo.me/dingo"
    28  
    29  	"flamingo.me/flamingo/v3/core/requestlogger"
    30  	"flamingo.me/flamingo/v3/core/robotstxt"
    31  	"flamingo.me/flamingo/v3/core/zap"
    32  	"flamingo.me/flamingo/v3/framework"
    33  	flamingoFramework "flamingo.me/flamingo/v3/framework/flamingo"
    34  	"flamingo.me/flamingo/v3/framework/opencensus"
    35  	"flamingo.me/flamingo/v3/framework/prefixrouter"
    36  
    37  	"flamingo.me/flamingo-commerce/v3/breadcrumbs"
    38  	"flamingo.me/flamingo-commerce/v3/cart"
    39  	"flamingo.me/flamingo-commerce/v3/category"
    40  	"flamingo.me/flamingo-commerce/v3/checkout"
    41  	"flamingo.me/flamingo-commerce/v3/order"
    42  	"flamingo.me/flamingo-commerce/v3/price"
    43  	"flamingo.me/flamingo-commerce/v3/product"
    44  	"flamingo.me/flamingo-commerce/v3/search"
    45  	"flamingo.me/flamingo-commerce/v3/test/integrationtest"
    46  	projectTestGraphql "flamingo.me/flamingo-commerce/v3/test/integrationtest/projecttest/graphql"
    47  	"flamingo.me/flamingo-commerce/v3/w3cdatalayer"
    48  )
    49  
    50  // modulesDemoProject return slice of modules that we want to have in our example app for testing
    51  func modulesDemoProject() []dingo.Module {
    52  	return []dingo.Module{
    53  		new(framework.InitModule),
    54  		new(cmd.Module),
    55  		new(zap.Module),
    56  		new(flamingoFramework.SessionModule),
    57  		new(prefixrouter.Module),
    58  		new(product.Module),
    59  		new(locale.Module),
    60  		new(customer.Module),
    61  		new(fakeCustomer.Module),
    62  		new(cart.Module),
    63  		new(checkout.Module),
    64  		new(search.Module),
    65  		new(category.Module),
    66  		new(requestlogger.Module),
    67  		new(filter.DefaultCacheStrategyModule),
    68  		new(auth.WebModule),
    69  		new(fakeAuth.Module),
    70  		new(breadcrumbs.Module),
    71  		new(order.Module),
    72  		new(healthcheck.Module),
    73  		new(w3cdatalayer.Module),
    74  		new(robotstxt.Module),
    75  		new(security.Module),
    76  		new(opencensus.Module),
    77  		new(price.Module),
    78  		new(projectTestGraphql.Module),
    79  		new(graphql.Module),
    80  		new(payment.Module),
    81  		new(placeorder.Module),
    82  		new(integrationCart.Module),
    83  	}
    84  }
    85  
    86  // BootupDemoProject boots up a complete demo project
    87  func BootupDemoProject(configDir string) integrationtest.BootupInfo {
    88  	return integrationtest.Bootup(modulesDemoProject(), configDir, nil)
    89  }
    90  
    91  // GenerateGraphQL generates the graphql interfaces for the demo project and saves to filesystem.
    92  // use via makefile - each time you modify the schema
    93  func GenerateGraphQL() {
    94  	application, err := flamingo.NewApplication(modulesDemoProject(), flamingo.ConfigDir("config"))
    95  	if err != nil {
    96  		panic(err)
    97  	}
    98  
    99  	servicesI, err := application.ConfigArea().Injector.GetInstance(new([]graphql.Service))
   100  	if err != nil {
   101  		panic(err)
   102  	}
   103  	services := servicesI.([]graphql.Service)
   104  	err = graphql.Generate(services, "graphql", "graphql/schema")
   105  	if err != nil {
   106  		panic(err)
   107  	}
   108  }
   109  
   110  // GraphQlRequest helper to get a initialised httpexpect request with the graphql query - used in tests
   111  func GraphQlRequest(t *testing.T, e *httpexpect.Expect, query string) *httpexpect.Request {
   112  	t.Helper()
   113  	query = strings.Replace(query, "\n", "", -1)
   114  	query = strings.Replace(query, "\t", "", -1)
   115  	query = strings.Replace(query, `"`, `\"`, -1)
   116  	graphQlQuery := fmt.Sprintf(`{"variables":{},"query":"%v"}`, query)
   117  
   118  	return e.POST("/en/graphql").WithHeader("Content-Type", "application/json").WithBytes([]byte(graphQlQuery))
   119  }
   120  
   121  // AsyncCheckWithTimeout calls fn every 10ms until timeout reached or fn doesn't return err anymore
   122  func AsyncCheckWithTimeout(t *testing.T, timeoutAfter time.Duration, fn func() error) {
   123  	t.Helper()
   124  	timeout := time.NewTimer(timeoutAfter)
   125  	ticker := time.NewTicker(100 * time.Millisecond)
   126  	defer ticker.Stop()
   127  
   128  	for {
   129  		err := fn()
   130  
   131  		if err == nil {
   132  			return
   133  		}
   134  
   135  		select {
   136  		case <-timeout.C:
   137  			t.Fatal(err)
   138  		case <-ticker.C:
   139  		}
   140  	}
   141  }