@@ -1236,3 +1236,148 @@ func TestCustomClientOptionsShoudPanic(t *testing.T) {
12361236 })
12371237 }
12381238}
1239+
1240+ func TestExtractNextPage (t * testing.T ) {
1241+ client := flagsmith .NewClient ("test-key" )
1242+
1243+ testCases := []struct {
1244+ name string
1245+ header string
1246+ expected string
1247+ }{
1248+ {
1249+ name : "valid link header with encoded page_id" ,
1250+ header : "</api/v1/environment-document/?page_id=" + fixtures .PageIDEncoded + ">; rel=\" next\" " ,
1251+ expected : fixtures .PageID ,
1252+ },
1253+ {
1254+ name : "empty header returns empty string" ,
1255+ header : "" ,
1256+ expected : "" ,
1257+ },
1258+ {
1259+ name : "header without page_id returns empty string" ,
1260+ header : "</api/v1/environment-document/>; rel=\" next\" " ,
1261+ expected : "" ,
1262+ },
1263+ }
1264+
1265+ for _ , tc := range testCases {
1266+ t .Run (tc .name , func (t * testing.T ) {
1267+ result := client .ExtractNextPage (tc .header )
1268+ assert .Equal (t , tc .expected , result )
1269+ })
1270+ }
1271+ }
1272+
1273+ func TestUpdateEnvironmentPaginatesIdentityOverrides (t * testing.T ) {
1274+ // Given
1275+ ctx := context .Background ()
1276+ server := httptest .NewServer (http .HandlerFunc (fixtures .PaginatedEnvironmentDocumentHandler ))
1277+ defer server .Close ()
1278+
1279+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithLocalEvaluation (ctx ),
1280+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ),
1281+ flagsmith .WithLocalEvaluationPageLimit (0 ))
1282+
1283+ // When
1284+ err := client .UpdateEnvironment (ctx )
1285+
1286+ // Then
1287+ assert .NoError (t , err )
1288+
1289+ // Identity from page 1 should be found
1290+ flags , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifier , nil )
1291+ assert .NoError (t , err )
1292+ enabled , err := flags .IsFeatureEnabled (fixtures .Feature1Name )
1293+ assert .NoError (t , err )
1294+ assert .False (t , enabled , "identity from page 1 should have overridden feature disabled" )
1295+
1296+ // Identity from page 2 should also be found
1297+ flags2 , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifierPage2 , nil )
1298+ assert .NoError (t , err )
1299+ enabled2 , err := flags2 .IsFeatureEnabled (fixtures .Feature1Name )
1300+ assert .NoError (t , err )
1301+ assert .False (t , enabled2 , "identity from page 2 should have overridden feature disabled" )
1302+ }
1303+
1304+ func TestUpdateEnvironmentSinglePageNoLinkHeader (t * testing.T ) {
1305+ // Given
1306+ ctx := context .Background ()
1307+ server := httptest .NewServer (http .HandlerFunc (fixtures .EnvironmentDocumentHandler ))
1308+ defer server .Close ()
1309+
1310+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithLocalEvaluation (ctx ),
1311+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ))
1312+
1313+ // When
1314+ err := client .UpdateEnvironment (ctx )
1315+
1316+ // Then — no pagination, identity from page 1 should still work
1317+ assert .NoError (t , err )
1318+
1319+ flags , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifier , nil )
1320+ assert .NoError (t , err )
1321+ enabled , err := flags .IsFeatureEnabled (fixtures .Feature1Name )
1322+ assert .NoError (t , err )
1323+ assert .False (t , enabled , "identity override should have feature disabled" )
1324+ }
1325+
1326+ func TestUpdateEnvironmentRespectsPageLimit (t * testing.T ) {
1327+ // Given: server has 2 pages but client is limited to 1 (the default)
1328+ ctx := context .Background ()
1329+ server := httptest .NewServer (http .HandlerFunc (fixtures .PaginatedEnvironmentDocumentHandler ))
1330+ defer server .Close ()
1331+
1332+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithLocalEvaluation (ctx ),
1333+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ),
1334+ flagsmith .WithLocalEvaluationPageLimit (1 ))
1335+
1336+ // When
1337+ err := client .UpdateEnvironment (ctx )
1338+ assert .NoError (t , err )
1339+
1340+ // Then: page 1 identity is present
1341+ flags , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifier , nil )
1342+ assert .NoError (t , err )
1343+ enabled , err := flags .IsFeatureEnabled (fixtures .Feature1Name )
1344+ assert .NoError (t , err )
1345+ assert .False (t , enabled )
1346+
1347+ // Page 2 identity must NOT be present — falls back to env default (enabled=true)
1348+ flags2 , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifierPage2 , nil )
1349+ assert .NoError (t , err )
1350+ enabled2 , err := flags2 .IsFeatureEnabled (fixtures .Feature1Name )
1351+ assert .NoError (t , err )
1352+ assert .True (t , enabled2 , "page 2 identity should not have been loaded" )
1353+ }
1354+
1355+ func TestUpdateEnvironmentRespectsMemoryAllocLimit (t * testing.T ) {
1356+ // Given: memory limit of 1 byte — page 2 will always exceed it
1357+ ctx := context .Background ()
1358+ server := httptest .NewServer (http .HandlerFunc (fixtures .PaginatedEnvironmentDocumentHandler ))
1359+ defer server .Close ()
1360+
1361+ client := flagsmith .NewClient (fixtures .EnvironmentAPIKey , flagsmith .WithLocalEvaluation (ctx ),
1362+ flagsmith .WithBaseURL (server .URL + "/api/v1/" ),
1363+ flagsmith .WithLocalEvaluationPageLimit (0 ),
1364+ flagsmith .WithLocalEvaluationMemoryAllocLimit (1 )) // 1 byte — guarantees page 2 is blocked
1365+
1366+ // When
1367+ err := client .UpdateEnvironment (ctx )
1368+ assert .NoError (t , err )
1369+
1370+ // Then: page 1 identity is present (memory limit only blocks appending subsequent pages)
1371+ flags , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifier , nil )
1372+ assert .NoError (t , err )
1373+ enabled , err := flags .IsFeatureEnabled (fixtures .Feature1Name )
1374+ assert .NoError (t , err )
1375+ assert .False (t , enabled )
1376+
1377+ // Page 2 identity must NOT be present — memory limit blocked the append
1378+ flags2 , err := client .GetIdentityFlags (ctx , fixtures .OverriddenIdentifierPage2 , nil )
1379+ assert .NoError (t , err )
1380+ enabled2 , err := flags2 .IsFeatureEnabled (fixtures .Feature1Name )
1381+ assert .NoError (t , err )
1382+ assert .True (t , enabled2 , "page 2 should have been blocked by memory limit" )
1383+ }
0 commit comments