Skip to content

Commit 2a49d4c

Browse files
committed
chore: add unit test
1 parent 7d00e46 commit 2a49d4c

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

feature_flag_test.go

+99
Original file line numberDiff line numberDiff line change
@@ -743,3 +743,102 @@ func Test_DisableNotifierOnInit(t *testing.T) {
743743
})
744744
}
745745
}
746+
747+
func TestMultipleDataExporters(t *testing.T) {
748+
// Create a client with multiple exporters
749+
config := ffclient.Config{
750+
PollingInterval: 5 * time.Second,
751+
Retriever: &fileretriever.Retriever{Path: "testdata/flag-config.yaml"},
752+
LeveledLogger: slog.Default(),
753+
// Main exporter (bulk)
754+
DataExporter: ffclient.DataExporter{
755+
FlushInterval: 2 * time.Second,
756+
MaxEventInMemory: 3,
757+
Exporter: &mock.Exporter{
758+
Bulk: true,
759+
},
760+
},
761+
// Additional exporters
762+
DataExporters: []ffclient.DataExporter{
763+
{
764+
// Bulk exporter with different settings
765+
FlushInterval: 5 * time.Second,
766+
MaxEventInMemory: 5,
767+
Exporter: &mock.Exporter{
768+
Bulk: true,
769+
},
770+
},
771+
{
772+
// Non-bulk exporter
773+
FlushInterval: 1 * time.Second, // Should be ignored
774+
MaxEventInMemory: 1, // Should be ignored
775+
Exporter: &mock.Exporter{
776+
Bulk: false,
777+
},
778+
},
779+
{
780+
// Another bulk exporter
781+
FlushInterval: 3 * time.Second,
782+
MaxEventInMemory: 4,
783+
Exporter: &mock.Exporter{
784+
Bulk: true,
785+
},
786+
},
787+
},
788+
}
789+
790+
gffClient, err := ffclient.New(config)
791+
assert.NoError(t, err)
792+
defer gffClient.Close()
793+
794+
// Create test user
795+
user := ffcontext.NewEvaluationContext("test-user")
796+
797+
// Generate events to test exporters
798+
// Phase 1: Generate 3 events (should trigger main exporter's MaxEventInMemory)
799+
_, _ = gffClient.BoolVariation("test-flag", user, false)
800+
_, _ = gffClient.BoolVariation("test-flag", user, false)
801+
_, _ = gffClient.BoolVariation("test-flag", user, false)
802+
803+
// Wait 1 second
804+
time.Sleep(1 * time.Second)
805+
806+
// Phase 2: Generate 2 more events (should trigger secondary exporter's MaxEventInMemory)
807+
_, _ = gffClient.StringVariation("unknown-flag", user, "default1")
808+
_, _ = gffClient.StringVariation("unknown-flag", user, "default2")
809+
810+
// Wait 2 seconds (should trigger main exporter's FlushInterval)
811+
time.Sleep(2 * time.Second)
812+
813+
// Phase 3: Generate 2 more events
814+
_, _ = gffClient.JSONVariation("json-flag", user, map[string]interface{}{"test": "value1"})
815+
_, _ = gffClient.JSONVariation("json-flag", user, map[string]interface{}{"test": "value2"})
816+
817+
// Wait 3 seconds (should trigger tertiary exporter's FlushInterval)
818+
time.Sleep(3 * time.Second)
819+
820+
// Phase 4: Generate 1 final event
821+
_, _ = gffClient.JSONVariation("json-flag", user, map[string]interface{}{"test": "value3"})
822+
823+
// Wait 5 seconds (should trigger secondary exporter's FlushInterval)
824+
time.Sleep(5 * time.Second)
825+
826+
// Verify that all exporters received events
827+
for _, de := range config.GetDataExporters() {
828+
mockExporter, ok := de.Exporter.(*mock.Exporter)
829+
assert.True(t, ok, "Exporter should be a mock exporter")
830+
831+
if !mockExporter.IsBulk() {
832+
// Non-bulk exporter should have received each event immediately
833+
assert.Equal(t, 8, len(mockExporter.GetExportedEvents()), "Non-bulk exporter should have received all events")
834+
} else {
835+
// Bulk exporters should have received events in batches
836+
events := mockExporter.GetExportedEvents()
837+
assert.Greater(t, len(events), 0, "Bulk exporter should have received some events")
838+
// Each batch should respect the MaxEventInMemory limit
839+
for _, event := range events {
840+
assert.NotNil(t, event)
841+
}
842+
}
843+
}
844+
}

0 commit comments

Comments
 (0)