@@ -15,6 +15,7 @@ import (
1515
1616 flagsmith "github.com/Flagsmith/flagsmith-go-client/v4"
1717 "github.com/Flagsmith/flagsmith-go-client/v4/fixtures"
18+ "github.com/go-resty/resty/v2"
1819 "github.com/stretchr/testify/assert"
1920)
2021
@@ -1019,3 +1020,140 @@ type writerFunc func(p []byte) (n int, err error)
10191020func (f writerFunc ) Write (p []byte ) (n int , err error ) {
10201021 return f (p )
10211022}
1023+
1024+ // Helper functions to implement a header interceptor
1025+ func roundTripperWithHeader (key , value string ) http.RoundTripper {
1026+ return & injectHeaderTransport {key : key , value : value }
1027+ }
1028+
1029+ type injectHeaderTransport struct {
1030+ key string
1031+ value string
1032+ }
1033+
1034+ func (t * injectHeaderTransport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
1035+ req .Header .Set (t .key , t .value )
1036+ return http .DefaultTransport .RoundTrip (req )
1037+ }
1038+
1039+ func TestCustomHTTPClientIsUsed (t * testing.T ) {
1040+ ctx := context .Background ()
1041+
1042+ hasCustomHeader := false
1043+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
1044+ assert .Equal (t , "/api/v1/flags/" , req .URL .Path )
1045+ assert .Equal (t , fixtures .EnvironmentAPIKey , req .Header .Get ("x-Environment-Key" ))
1046+ if req .Header .Get ("X-Test-Client" ) == "http" {
1047+ hasCustomHeader = true
1048+ }
1049+ rw .Header ().Set ("Content-Type" , "application/json" )
1050+ rw .WriteHeader (http .StatusOK )
1051+ _ , err := io .WriteString (rw , fixtures .FlagsJson )
1052+ assert .NoError (t , err )
1053+ }))
1054+ defer server .Close ()
1055+
1056+ customClient := & http.Client {
1057+ Transport : roundTripperWithHeader ("X-Test-Client" , "http" ),
1058+ }
1059+
1060+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey ,
1061+ flagsmith .WithHTTPClient (customClient ),
1062+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
1063+
1064+ flags , err := client .GetFlags (ctx , nil )
1065+ assert .Equal (t , 1 , len (flags .AllFlags ()))
1066+ assert .NoError (t , err )
1067+ assert .True (t , hasCustomHeader , "Expected http header" )
1068+ flag , err := flags .GetFlag (fixtures .Feature1Name )
1069+ assert .NoError (t , err )
1070+ assert .Equal (t , fixtures .Feature1Value , flag .Value )
1071+ }
1072+
1073+ func TestCustomRestyClientIsUsed (t * testing.T ) {
1074+ ctx := context .Background ()
1075+
1076+ hasCustomHeader := false
1077+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
1078+ if req .Header .Get ("X-Custom-Test-Header" ) == "resty" {
1079+ hasCustomHeader = true
1080+ }
1081+ rw .Header ().Set ("Content-Type" , "application/json" )
1082+ rw .WriteHeader (http .StatusOK )
1083+ _ , err := io .WriteString (rw , fixtures .FlagsJson )
1084+ assert .NoError (t , err )
1085+ }))
1086+ defer server .Close ()
1087+
1088+ restyClient := resty .New ().
1089+ SetHeader ("X-Custom-Test-Header" , "resty" )
1090+
1091+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey ,
1092+ flagsmith .WithRestyClient (restyClient ),
1093+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
1094+
1095+ flags , err := client .GetFlags (ctx , nil )
1096+ assert .NoError (t , err )
1097+ assert .Equal (t , 1 , len (flags .AllFlags ()))
1098+ assert .True (t , hasCustomHeader , "Expected custom resty header" )
1099+ }
1100+
1101+ func TestRestyClientOverridesHTTPClient (t * testing.T ) {
1102+ ctx := context .Background ()
1103+
1104+ var customHeader string
1105+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
1106+ customHeader = req .Header .Get ("X-Test-Client" )
1107+ rw .Header ().Set ("Content-Type" , "application/json" )
1108+ rw .WriteHeader (http .StatusOK )
1109+ _ , err := io .WriteString (rw , fixtures .FlagsJson )
1110+ assert .NoError (t , err )
1111+ }))
1112+ defer server .Close ()
1113+
1114+ httpClient := & http.Client {
1115+ Transport : roundTripperWithHeader ("X-Test-Client" , "http" ),
1116+ }
1117+
1118+ restyClient := resty .New ().
1119+ SetHeader ("X-Test-Client" , "resty" )
1120+
1121+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey ,
1122+ flagsmith .WithHTTPClient (httpClient ),
1123+ flagsmith .WithRestyClient (restyClient ),
1124+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
1125+
1126+ flags , err := client .GetFlags (ctx , nil )
1127+
1128+ assert .NoError (t , err )
1129+ assert .Equal (t , 1 , len (flags .AllFlags ()))
1130+ assert .Equal (t , "resty" , customHeader , "Expected resty header" )
1131+ }
1132+
1133+ func TestDefaultRestyClientIsUsed (t * testing.T ) {
1134+ ctx := context .Background ()
1135+
1136+ serverCalled := false
1137+
1138+ server := httptest .NewServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
1139+ serverCalled = true
1140+
1141+ assert .Equal (t , "/api/v1/flags/" , req .URL .Path )
1142+ assert .Equal (t , fixtures .EnvironmentAPIKey , req .Header .Get ("x-Environment-Key" ))
1143+
1144+ rw .Header ().Set ("Content-Type" , "application/json" )
1145+ rw .WriteHeader (http .StatusOK )
1146+ _ , err := io .WriteString (rw , fixtures .FlagsJson )
1147+ assert .NoError (t , err )
1148+ }))
1149+ defer server .Close ()
1150+
1151+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey ,
1152+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
1153+
1154+ flags , err := client .GetFlags (ctx , nil )
1155+
1156+ assert .NoError (t , err )
1157+ assert .True (t , serverCalled , "Expected server to be" )
1158+ assert .Equal (t , 1 , len (flags .AllFlags ()))
1159+ }
0 commit comments