| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- //go:build unit
- package repository
- import (
- "encoding/json"
- "errors"
- "fmt"
- "testing"
- "github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
- "github.com/lib/pq"
- "github.com/stretchr/testify/require"
- )
- // --- marshalModelMapping ---
- func TestMarshalModelMapping(t *testing.T) {
- tests := []struct {
- name string
- input map[string]map[string]string
- wantJSON string // expected JSON output (exact match)
- }{
- {
- name: "empty map",
- input: map[string]map[string]string{},
- wantJSON: "{}",
- },
- {
- name: "nil map",
- input: nil,
- wantJSON: "{}",
- },
- {
- name: "populated map",
- input: map[string]map[string]string{
- "openai": {"gpt-4": "gpt-4-turbo"},
- },
- },
- {
- name: "nested values",
- input: map[string]map[string]string{
- "openai": {"*": "gpt-5.4"},
- "anthropic": {"claude-old": "claude-new"},
- },
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- result, err := marshalModelMapping(tt.input)
- require.NoError(t, err)
- if tt.wantJSON != "" {
- require.Equal(t, []byte(tt.wantJSON), result)
- } else {
- // round-trip: unmarshal and compare with input
- var parsed map[string]map[string]string
- require.NoError(t, json.Unmarshal(result, &parsed))
- require.Equal(t, tt.input, parsed)
- }
- })
- }
- }
- // --- unmarshalModelMapping ---
- func TestUnmarshalModelMapping(t *testing.T) {
- tests := []struct {
- name string
- input []byte
- wantNil bool
- want map[string]map[string]string
- }{
- {
- name: "nil data",
- input: nil,
- wantNil: true,
- },
- {
- name: "empty data",
- input: []byte{},
- wantNil: true,
- },
- {
- name: "invalid JSON",
- input: []byte("not-json"),
- wantNil: true,
- },
- {
- name: "type error - number",
- input: []byte("42"),
- wantNil: true,
- },
- {
- name: "type error - array",
- input: []byte("[1,2,3]"),
- wantNil: true,
- },
- {
- name: "valid JSON",
- input: []byte(`{"openai":{"gpt-4":"gpt-4-turbo"},"anthropic":{"old":"new"}}`),
- want: map[string]map[string]string{
- "openai": {"gpt-4": "gpt-4-turbo"},
- "anthropic": {"old": "new"},
- },
- },
- {
- name: "empty object",
- input: []byte("{}"),
- want: map[string]map[string]string{},
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- result := unmarshalModelMapping(tt.input)
- if tt.wantNil {
- require.Nil(t, result)
- } else {
- require.NotNil(t, result)
- require.Equal(t, tt.want, result)
- }
- })
- }
- }
- // --- escapeLike ---
- func TestEscapeLike(t *testing.T) {
- tests := []struct {
- name string
- input string
- want string
- }{
- {
- name: "no special chars",
- input: "hello",
- want: "hello",
- },
- {
- name: "backslash",
- input: `a\b`,
- want: `a\\b`,
- },
- {
- name: "percent",
- input: "50%",
- want: `50\%`,
- },
- {
- name: "underscore",
- input: "a_b",
- want: `a\_b`,
- },
- {
- name: "all special chars",
- input: `a\b%c_d`,
- want: `a\\b\%c\_d`,
- },
- {
- name: "empty string",
- input: "",
- want: "",
- },
- {
- name: "consecutive special chars",
- input: "%_%",
- want: `\%\_\%`,
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- require.Equal(t, tt.want, escapeLike(tt.input))
- })
- }
- }
- // --- isUniqueViolation ---
- func TestIsUniqueViolation(t *testing.T) {
- tests := []struct {
- name string
- err error
- want bool
- }{
- {
- name: "unique violation code 23505",
- err: &pq.Error{Code: "23505"},
- want: true,
- },
- {
- name: "different pq error code",
- err: &pq.Error{Code: "23503"},
- want: false,
- },
- {
- name: "non-pq error",
- err: errors.New("some generic error"),
- want: false,
- },
- {
- name: "typed nil pq.Error",
- err: func() error {
- var pqErr *pq.Error
- return pqErr
- }(),
- want: false,
- },
- {
- name: "bare nil",
- err: nil,
- want: false,
- },
- {
- name: "wrapped pq error with 23505",
- err: fmt.Errorf("wrapped: %w", &pq.Error{Code: "23505"}),
- want: true,
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- require.Equal(t, tt.want, isUniqueViolation(tt.err))
- })
- }
- }
- func TestChannelListOrderBy_AllowsDescendingIDSort(t *testing.T) {
- params := pagination.PaginationParams{
- SortBy: "id",
- SortOrder: "desc",
- }
- require.Equal(t, "c.id DESC, c.id DESC", channelListOrderBy(params))
- }
|