| package clickhouse |
|
|
| import ( |
| "testing" |
| "time" |
|
|
| "github.com/samber/lo" |
| "github.com/stretchr/testify/assert" |
|
|
| "github.com/openmeterio/openmeter/openmeter/meter" |
| ) |
|
|
| func TestListSubjects(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 listSubjectsQuery |
| wantSQL string |
| wantArgs []interface{} |
| }{ |
| { |
| name: "basic query", |
| query: listSubjectsQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| }, |
| wantSQL: "SELECT DISTINCT subject FROM openmeter.om_events WHERE namespace = ? ORDER BY subject", |
| wantArgs: []interface{}{"my_namespace"}, |
| }, |
| { |
| name: "query with meter", |
| query: listSubjectsQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: &meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| }, |
| }, |
| wantSQL: "SELECT DISTINCT subject FROM openmeter.om_events WHERE namespace = ? AND type = ? ORDER BY subject", |
| wantArgs: []interface{}{"my_namespace", "event1"}, |
| }, |
| { |
| name: "query with from time", |
| query: listSubjectsQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: &meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| }, |
| From: &from, |
| }, |
| wantSQL: "SELECT DISTINCT subject FROM openmeter.om_events WHERE namespace = ? AND type = ? AND time >= ? ORDER BY subject", |
| wantArgs: []interface{}{"my_namespace", "event1", from.Unix()}, |
| }, |
| { |
| name: "query with to time", |
| query: listSubjectsQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Meter: &meter.Meter{ |
| Key: "meter1", |
| EventType: "event1", |
| Aggregation: meter.MeterAggregationSum, |
| }, |
| From: &from, |
| To: &to, |
| }, |
| wantSQL: "SELECT DISTINCT subject FROM openmeter.om_events WHERE namespace = ? AND type = ? AND time >= ? AND time < ? ORDER BY subject", |
| wantArgs: []interface{}{"my_namespace", "event1", from.Unix(), to.Unix()}, |
| }, |
| { |
| name: "query with search", |
| query: listSubjectsQuery{ |
| Database: "openmeter", |
| EventsTableName: "om_events", |
| Namespace: "my_namespace", |
| Search: lo.ToPtr("arch"), |
| }, |
| wantSQL: "SELECT DISTINCT subject FROM openmeter.om_events WHERE namespace = ? AND positionCaseInsensitive(subject, ?) > 0 ORDER BY subject", |
| wantArgs: []interface{}{"my_namespace", "arch"}, |
| }, |
| } |
|
|
| for _, tt := range tests { |
| tt := tt |
| 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) |
| }) |
| } |
| } |
|
|