| package labels |
|
|
| import ( |
| "testing" |
|
|
| "github.com/stretchr/testify/require" |
|
|
| api "github.com/openmeterio/openmeter/api/v3" |
| ) |
|
|
| func TestValidateLabel(t *testing.T) { |
| tests := []struct { |
| name string |
| key string |
| value string |
| wantErr bool |
| }{ |
| { |
| name: "valid alphanumeric", |
| key: "key", |
| value: "value", |
| }, |
| { |
| name: "valid with underscore", |
| key: "my_good", |
| value: "my_good", |
| }, |
| { |
| name: "valid with dot", |
| key: "my.good", |
| value: "my.good", |
| }, |
| { |
| name: "valid with hyphen", |
| key: "my-good", |
| value: "my-good", |
| }, |
| { |
| name: "valid single character", |
| key: "a", |
| value: "b", |
| }, |
| { |
| name: "valid two characters", |
| key: "ab", |
| value: "cd", |
| }, |
| { |
| name: "valid uppercase", |
| key: "MyKey", |
| value: "MyValue", |
| }, |
| { |
| name: "valid digits", |
| key: "key123", |
| value: "value456", |
| }, |
| { |
| name: "valid starts and ends with digit", |
| key: "1key1", |
| value: "2value2", |
| }, |
| { |
| name: "invalid key trailing underscore", |
| key: "bad_", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key trailing hyphen", |
| key: "bad-", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key trailing dot", |
| key: "bad.", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key leading underscore", |
| key: "_bad", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key leading hyphen", |
| key: "-bad", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key leading dot", |
| key: ".bad", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid key empty", |
| key: "", |
| value: "good", |
| wantErr: true, |
| }, |
| { |
| name: "invalid value trailing underscore", |
| key: "good", |
| value: "bad_", |
| wantErr: true, |
| }, |
| { |
| name: "invalid value leading dot", |
| key: "good", |
| value: ".bad", |
| wantErr: true, |
| }, |
| { |
| name: "invalid value empty", |
| key: "good", |
| value: "", |
| wantErr: true, |
| }, |
| { |
| name: "both key and value invalid", |
| key: "_bad", |
| value: "bad_", |
| wantErr: true, |
| }, |
| { |
| name: "reserved openmeter prefix", |
| key: "openmeter_key", |
| value: "value", |
| wantErr: true, |
| }, |
| { |
| name: "reserved kong prefix", |
| key: "kong_key", |
| value: "value", |
| wantErr: true, |
| }, |
| { |
| name: "reserved konnect prefix", |
| key: "konnect_key", |
| value: "value", |
| wantErr: true, |
| }, |
| } |
|
|
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| err := ValidateLabel(tt.key, tt.value) |
| if !tt.wantErr { |
| require.NoError(t, err) |
| return |
| } |
|
|
| require.Error(t, err) |
| }) |
| } |
| } |
|
|
| func TestValidateLabels(t *testing.T) { |
| tests := []struct { |
| name string |
| labels api.Labels |
| wantErr bool |
| }{ |
| { |
| name: "nil labels", |
| labels: nil, |
| wantErr: false, |
| }, |
| { |
| name: "empty labels", |
| labels: api.Labels{}, |
| wantErr: false, |
| }, |
| { |
| name: "all valid", |
| labels: api.Labels{ |
| "env": "production", |
| "team": "platform", |
| "version": "v1", |
| }, |
| wantErr: false, |
| }, |
| { |
| name: "one invalid key", |
| labels: api.Labels{ |
| "_bad": "value", |
| "good": "value", |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "one invalid value", |
| labels: api.Labels{ |
| "good": "bad_", |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "both key and value invalid in same entry", |
| labels: api.Labels{ |
| "_bad": "bad_", |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "multiple invalid keys", |
| labels: api.Labels{ |
| "_bad1": "good", |
| "_bad2": "good", |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "reserved prefix key", |
| labels: api.Labels{ |
| "openmeter_key": "value", |
| }, |
| wantErr: true, |
| }, |
| } |
|
|
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| err := ValidateLabels(tt.labels) |
| if !tt.wantErr { |
| require.NoError(t, err) |
| return |
| } |
|
|
| require.Error(t, err) |
| }) |
| } |
| } |
|
|