github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/generic/http/client/integrationtest/main_test.go (about)

     1  package integrationtest
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"os/exec"
     8  	"sync"
     9  	"testing"
    10  	"time"
    11  
    12  	_ "github.com/lib/pq"
    13  	"github.com/ory/dockertest"
    14  	"github.com/redis/go-redis/v9"
    15  
    16  	"github.com/angryronald/go-kit/test/docker/mockserver"
    17  	redisInDocker "github.com/angryronald/go-kit/test/docker/redis"
    18  )
    19  
    20  var redisClient *redis.Client
    21  var poolResourceMap map[*dockertest.Pool]*dockertest.Resource
    22  var lock sync.Mutex
    23  var port int
    24  
    25  func init() {
    26  	poolResourceMap = map[*dockertest.Pool]*dockertest.Resource{}
    27  }
    28  
    29  func preseed() {
    30  	cmd := exec.Command("curl", "-X", "PUT",
    31  		"-H", "Content-Type: application/json",
    32  		"-d", `{
    33  		  "httpRequest": {
    34  			"method": "GET",
    35  			"path": "/api/resource",
    36  			"queryStringParameters": {
    37  			  "param1": ["value1"]
    38  			},
    39  			"headers": {
    40  			  "authorization": ["bearer token"],
    41  			  "content-type": "application/json"
    42  			}
    43  		  },
    44  		  "httpResponse": {
    45  			"statusCode": 200,
    46  			"body": "{\"message\": \"Mocked response\"}",
    47  			"delay": {
    48  			  "timeUnit": "MILLISECONDS",
    49  			  "value": 500
    50  			}
    51  		  }
    52  		}`,
    53  		fmt.Sprintf("http://localhost:%d/mockserver/expectation", port),
    54  	)
    55  
    56  	// Capture and print the command's output
    57  	output, err := cmd.CombinedOutput()
    58  	if err != nil {
    59  		fmt.Println("Error preseed mockserver endpoint (GET):", err)
    60  		os.Exit(1)
    61  	}
    62  
    63  	fmt.Println("Command Output (GET):", string(output))
    64  
    65  	cmd = exec.Command("curl", "-X", "PUT",
    66  		"-H", "Content-Type: application/json",
    67  		"-d", `{
    68  		  "httpRequest": {
    69  			"method": "POST",
    70  			"path": "/api/resource",
    71  			"body": {
    72  			  "type": "STRING",
    73  			  "value": "{\"username\":\"test\",\"password\":\"password\"}"
    74  			},
    75  			"headers": {
    76  			  "authorization": ["bearer token"],
    77  			  "content-type": "application/json"
    78  			}
    79  		  },
    80  		  "httpResponse": {
    81  			"statusCode": 200,
    82  			"body": "{\"message\": \"Mocked response with request body\"}",
    83  			"delay": {
    84  			  "timeUnit": "MILLISECONDS",
    85  			  "value": 500
    86  			}
    87  		  }
    88  		}`,
    89  		fmt.Sprintf("http://localhost:%d/mockserver/expectation", port),
    90  	)
    91  
    92  	// Capture and print the command's output
    93  	output, err = cmd.CombinedOutput()
    94  	if err != nil {
    95  		fmt.Println("Error preseed mockserver endpoint (POST):", err)
    96  		os.Exit(1)
    97  	}
    98  
    99  	fmt.Println("Command Output (POST):", string(output))
   100  }
   101  
   102  // Using docker command
   103  func TestMain(m *testing.M) {
   104  	// var err error
   105  
   106  	port = mockserver.StartMockServer()
   107  
   108  	time.Sleep(10 * time.Second)
   109  
   110  	preseed()
   111  
   112  	pool, err := dockertest.NewPool("")
   113  	if err != nil {
   114  		log.Fatalf("Could not connect to Docker: %s\n", err)
   115  	}
   116  
   117  	redisClientTemp, redisResource := redisInDocker.GenerateInstance(pool)
   118  	if redisClientTemp != nil {
   119  		redisClient = redisClientTemp
   120  		fmt.Printf("Success generate redis instance\n")
   121  	}
   122  
   123  	code := m.Run() // execute all the tests
   124  
   125  	// Delete the Docker container
   126  	for pool, instance := range poolResourceMap {
   127  		if err := pool.Purge(instance); err != nil {
   128  			log.Fatalf("Could not purge postgres resource: %s\n", err)
   129  		}
   130  	}
   131  
   132  	// Delete the Docker container
   133  	if err := pool.Purge(redisResource); err != nil {
   134  		log.Fatalf("Could not purge redis resource: %s\n", err)
   135  	}
   136  
   137  	defer os.Exit(code)
   138  	defer mockserver.StopMockServer()
   139  }