(t *testing.T)
| 29 | } |
| 30 | |
| 31 | func TestResolveFieldByName(t *testing.T) { |
| 32 | fields := []ProjectField{ |
| 33 | textField("PVTF_title", "Title"), |
| 34 | singleSelectField("PVTSSF_status", "Status", []SingleSelectFieldOptions{ |
| 35 | {ID: "opt_todo", Name: "Todo"}, |
| 36 | {ID: "opt_inprog", Name: "In Progress"}, |
| 37 | }), |
| 38 | textField("PVTF_prio", "Priority"), |
| 39 | } |
| 40 | |
| 41 | t.Run("resolves an exact match", func(t *testing.T) { |
| 42 | got, err := ResolveFieldByName(fields, "Status") |
| 43 | require.NoError(t, err) |
| 44 | assert.Equal(t, "PVTSSF_status", got.ID()) |
| 45 | }) |
| 46 | |
| 47 | t.Run("resolves case-insensitively", func(t *testing.T) { |
| 48 | got, err := ResolveFieldByName(fields, "status") |
| 49 | require.NoError(t, err) |
| 50 | assert.Equal(t, "PVTSSF_status", got.ID()) |
| 51 | }) |
| 52 | |
| 53 | t.Run("not found lists candidate field names", func(t *testing.T) { |
| 54 | _, err := ResolveFieldByName(fields, "Statuss") |
| 55 | require.Error(t, err) |
| 56 | var nf *FieldNotFoundError |
| 57 | require.True(t, errors.As(err, &nf)) |
| 58 | assert.Equal(t, "Statuss", nf.Name) |
| 59 | assert.Equal(t, []string{"Priority", "Status", "Title"}, nf.Candidates) |
| 60 | assert.Contains(t, err.Error(), "available fields: Priority, Status, Title") |
| 61 | }) |
| 62 | |
| 63 | t.Run("ambiguous name lists candidate ids in sorted order", func(t *testing.T) { |
| 64 | dup := append([]ProjectField{}, fields...) |
| 65 | dup = append(dup, textField("PVTF_status2", "Status")) |
| 66 | _, err := ResolveFieldByName(dup, "Status") |
| 67 | require.Error(t, err) |
| 68 | var amb *FieldAmbiguousError |
| 69 | require.True(t, errors.As(err, &amb)) |
| 70 | assert.Equal(t, []string{"PVTF_status2", "PVTSSF_status"}, amb.Candidates) |
| 71 | assert.Contains(t, err.Error(), "is ambiguous") |
| 72 | }) |
| 73 | } |
| 74 | |
| 75 | func TestResolveFieldByID(t *testing.T) { |
| 76 | fields := []ProjectField{ |
nothing calls this directly
no test coverage detected