github.com/rudderlabs/rudder-go-kit@v0.30.0/testhelper/docker/resource/transformer/transformer_test.go (about)

     1  package transformer_test
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"net/http"
     7  	"net/url"
     8  	"testing"
     9  
    10  	"github.com/tidwall/gjson"
    11  
    12  	"github.com/rudderlabs/rudder-go-kit/httputil"
    13  
    14  	"github.com/ory/dockertest/v3"
    15  	"github.com/stretchr/testify/require"
    16  
    17  	"github.com/rudderlabs/rudder-go-kit/testhelper/docker/resource/transformer"
    18  )
    19  
    20  func TestSetup(t *testing.T) {
    21  	pool, err := dockertest.NewPool("")
    22  	require.NoError(t, err)
    23  
    24  	t.Run("test get endpoints", func(t *testing.T) {
    25  		tests := []struct {
    26  			name    string
    27  			tag     string
    28  			urlPath string
    29  		}{
    30  			{
    31  				name:    "transformer - health",
    32  				tag:     "latest",
    33  				urlPath: "health",
    34  			},
    35  			{
    36  				name:    "user transformer - health",
    37  				tag:     "ut-latest",
    38  				urlPath: "health",
    39  			},
    40  			{
    41  				name:    "transformer - features",
    42  				tag:     "latest",
    43  				urlPath: "features",
    44  			},
    45  			{
    46  				name:    "user transformer - features",
    47  				tag:     "ut-latest",
    48  				urlPath: "features",
    49  			},
    50  		}
    51  		for _, tt := range tests {
    52  			t.Run(tt.name, func(t *testing.T) {
    53  				transformerContainer, err := transformer.Setup(pool, t,
    54  					transformer.WithConfigBackendURL("random-url"),
    55  					transformer.WithDockerImageTag(tt.tag))
    56  				require.NoError(t, err)
    57  				endpoint, err := url.JoinPath(transformerContainer.TransformerURL, tt.urlPath)
    58  				require.NoError(t, err)
    59  				resp, err := http.Get(endpoint)
    60  				require.NoError(t, err)
    61  				defer func() { _ = resp.Body.Close() }()
    62  				require.Equal(t, resp.StatusCode, http.StatusOK)
    63  			})
    64  		}
    65  	})
    66  
    67  	t.Run("test custom transformation", func(t *testing.T) {
    68  		transformations := map[string]string{
    69  			"2Nazu8t4ujUC0Dzc4pBFbjmOijx": `export function transformEvent(event, metadata) {
    70  													event.transformed=true
    71  													return event;
    72  												}`,
    73  		}
    74  		transformerContainer, err := transformer.Setup(pool, t, transformer.WithUserTransformations(transformations, t))
    75  		require.NoError(t, err)
    76  
    77  		transformerURL, err := url.JoinPath(transformerContainer.TransformerURL, "customTransform")
    78  		require.NoError(t, err)
    79  
    80  		rawReq := []byte(`[{"message":{
    81  				"userId": "identified_user_id",
    82  				"anonymousId":"anonymousId_1",
    83  				"messageId":"messageId_1",
    84  				"type": "track",
    85  				"event": "Product Reviewed",
    86  				"properties": {
    87  				  "review_id": "12345",
    88  				  "product_id" : "123",
    89  				  "rating" : 3.5,
    90  				  "review_body" : "Average product, expected much more."
    91  				}
    92  			},"metadata":{"sourceId":"xxxyyyzzEaEurW247ad9WYZLUyk","workspaceId":"fyJvxaglFrCFxsBcLiSPBCmgpWK",
    93  			"messageId":"messageId_1"},"destination":{"Transformations":[{"VersionID":"2Nazu8t4ujUC0Dzc4pBFbjmOijx","ID":""}]}}]`)
    94  		req, reqErr := http.NewRequest(http.MethodPost, transformerURL, bytes.NewBuffer(rawReq))
    95  		require.NoError(t, reqErr)
    96  		req.Header.Set("Content-Type", "application/json; charset=utf-8")
    97  		req.Header.Set("X-Feature-Gzip-Support", "?1")
    98  		// Header to let transformer know that the client understands event filter code
    99  		req.Header.Set("X-Feature-Filter-Code", "?1")
   100  
   101  		resp, err := http.DefaultClient.Do(req)
   102  		defer func() { httputil.CloseResponse(resp) }()
   103  		require.NoError(t, err)
   104  		require.Equal(t, http.StatusOK, resp.StatusCode)
   105  		respData, err := io.ReadAll(resp.Body)
   106  		require.NoError(t, err)
   107  		require.True(t, gjson.Get(string(respData), "0.output.transformed").Bool())
   108  	})
   109  }