(t *testing.T)
| 119 | } |
| 120 | |
| 121 | func TestExperimentDetailsFromState(t *testing.T) { |
| 122 | state := &ExperimentState{ |
| 123 | Counts: map[string]map[string]int{ |
| 124 | "style": {"concise": 4, "detailed": 6}, |
| 125 | "feature": {"on": 5, "off": 5}, |
| 126 | }, |
| 127 | Runs: []ExperimentRunRecord{ |
| 128 | {RunID: "r1", Timestamp: "2024-05-01T00:00:00Z", Assignments: map[string]string{"style": "concise", "feature": "on"}}, |
| 129 | {RunID: "r2", Timestamp: "2024-05-02T00:00:00Z", Assignments: map[string]string{"style": "detailed", "feature": "off"}}, |
| 130 | }, |
| 131 | } |
| 132 | |
| 133 | details := experimentDetailsFromState("my-workflow", "experiments/my-workflow", state) |
| 134 | require.NotNil(t, details, "details should not be nil") |
| 135 | assert.Equal(t, "my-workflow", details.WorkflowID, "workflow ID") |
| 136 | assert.Equal(t, "experiments/my-workflow", details.Branch, "branch") |
| 137 | assert.Equal(t, 2, details.TotalRuns, "total runs from runs array") |
| 138 | assert.Len(t, details.Experiments, 2, "should have 2 experiment entries") |
| 139 | assert.Len(t, details.RecentRuns, 2, "should have 2 recent runs") |
| 140 | |
| 141 | // Experiments are sorted by name. |
| 142 | assert.Equal(t, "feature", details.Experiments[0].Name, "first experiment sorted by name") |
| 143 | assert.Equal(t, 10, details.Experiments[0].Total, "feature total") |
| 144 | assert.Equal(t, "style", details.Experiments[1].Name, "second experiment sorted by name") |
| 145 | assert.Equal(t, 10, details.Experiments[1].Total, "style total") |
| 146 | } |
| 147 | |
| 148 | func TestExperimentTotalRunsFallback(t *testing.T) { |
| 149 | // When no runs array present, sum variant counts. |
nothing calls this directly
no test coverage detected