| package clickhouse |
|
|
| import ( |
| "testing" |
| "time" |
|
|
| "github.com/samber/lo" |
| "github.com/stretchr/testify/assert" |
|
|
| "github.com/openmeterio/openmeter/openmeter/meter" |
| ) |
|
|
| func TestListGroupByValues(t *testing.T) { |
| from, _ := time.Parse(time.RFC3339, "2023-01-01T00:00:00.001Z") |
| to, _ := time.Parse(time.RFC3339, "2023-01-02T00:00:00Z") |
|
|
| tests := []struct { |
| name string |
| query listGroupByValuesQuery |
| wantSQL string |
| wantArgs []interface{} |
| }{ |
| { |
| name: "basic query", |
| query: listGroupByValuesQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| GroupBy: map[string]string{ |
| "group1": "$.group1", |
| }, |
| }, |
| GroupByKey: "group1", |
| }, |
| wantSQL: "SELECT DISTINCT JSON_VALUE(om_events.data, ?) AS group_by_values FROM openmeter.om_events WHERE namespace = ? AND type = ? ORDER BY group_by_values", |
| wantArgs: []interface{}{"$.group1", "my_namespace", "event1"}, |
| }, |
| { |
| name: "query with meter", |
| query: listGroupByValuesQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| GroupBy: map[string]string{ |
| "group1": "$.group1", |
| }, |
| }, |
| GroupByKey: "group1", |
| }, |
| wantSQL: "SELECT DISTINCT JSON_VALUE(om_events.data, ?) AS group_by_values FROM openmeter.om_events WHERE namespace = ? AND type = ? ORDER BY group_by_values", |
| wantArgs: []interface{}{"$.group1", "my_namespace", "event1"}, |
| }, |
| { |
| name: "query with from time", |
| query: listGroupByValuesQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| GroupBy: map[string]string{ |
| "group1": "$.group1", |
| }, |
| }, |
| GroupByKey: "group1", |
| From: &from, |
| }, |
| wantSQL: "SELECT DISTINCT JSON_VALUE(om_events.data, ?) AS group_by_values FROM openmeter.om_events WHERE namespace = ? AND type = ? AND time >= ? ORDER BY group_by_values", |
| wantArgs: []interface{}{"$.group1", "my_namespace", "event1", from.Unix()}, |
| }, |
| { |
| name: "query with to time", |
| query: listGroupByValuesQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| GroupBy: map[string]string{ |
| "group1": "$.group1", |
| }, |
| }, |
| From: &from, |
| To: &to, |
| GroupByKey: "group1", |
| }, |
| wantSQL: "SELECT DISTINCT JSON_VALUE(om_events.data, ?) AS group_by_values FROM openmeter.om_events WHERE namespace = ? AND type = ? AND time >= ? AND time < ? ORDER BY group_by_values", |
| wantArgs: []interface{}{"$.group1", "my_namespace", "event1", from.Unix(), to.Unix()}, |
| }, |
| { |
| name: "query with search", |
| query: listGroupByValuesQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Search: lo.ToPtr("arch"), |
| GroupByKey: "group1", |
| Meter: meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| GroupBy: map[string]string{ |
| "group1": "$.group1", |
| }, |
| }, |
| }, |
| wantSQL: "SELECT DISTINCT JSON_VALUE(om_events.data, ?) AS group_by_values FROM openmeter.om_events WHERE namespace = ? AND type = ? AND positionCaseInsensitive(group_by_values, ?) > 0 ORDER BY group_by_values", |
| wantArgs: []interface{}{"$.group1", "my_namespace", "event1", "arch"}, |
| }, |
| } |
|
|
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| gotSql, gotArgs := tt.query.toSQL() |
|
|
| assert.Equal(t, tt.wantArgs, gotArgs) |
| assert.Equal(t, tt.wantSQL, gotSql) |
| }) |
| } |
| } |
|
|