provider_test.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package config
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "os"
  6. "testing"
  7. "github.com/charmbracelet/catwalk/pkg/catwalk"
  8. "github.com/stretchr/testify/require"
  9. )
  10. type mockProviderClient struct {
  11. shouldFail bool
  12. }
  13. func (m *mockProviderClient) GetProviders() ([]catwalk.Provider, error) {
  14. if m.shouldFail {
  15. return nil, errors.New("failed to load providers")
  16. }
  17. return []catwalk.Provider{
  18. {
  19. Name: "Mock",
  20. },
  21. }, nil
  22. }
  23. func TestProvider_loadProvidersNoIssues(t *testing.T) {
  24. client := &mockProviderClient{shouldFail: false}
  25. tmpPath := t.TempDir() + "/providers.json"
  26. providers, err := loadProviders(false, client, tmpPath)
  27. require.NoError(t, err)
  28. require.NotNil(t, providers)
  29. require.Len(t, providers, 1)
  30. // check if file got saved
  31. fileInfo, err := os.Stat(tmpPath)
  32. require.NoError(t, err)
  33. require.False(t, fileInfo.IsDir(), "Expected a file, not a directory")
  34. }
  35. func TestProvider_loadProvidersWithIssues(t *testing.T) {
  36. client := &mockProviderClient{shouldFail: true}
  37. tmpPath := t.TempDir() + "/providers.json"
  38. // store providers to a temporary file
  39. oldProviders := []catwalk.Provider{
  40. {
  41. Name: "OldProvider",
  42. },
  43. }
  44. data, err := json.Marshal(oldProviders)
  45. if err != nil {
  46. t.Fatalf("Failed to marshal old providers: %v", err)
  47. }
  48. err = os.WriteFile(tmpPath, data, 0o644)
  49. if err != nil {
  50. t.Fatalf("Failed to write old providers to file: %v", err)
  51. }
  52. providers, err := loadProviders(true, client, tmpPath)
  53. require.NoError(t, err)
  54. require.NotNil(t, providers)
  55. require.Len(t, providers, 1)
  56. require.Equal(t, "OldProvider", providers[0].Name, "Expected to keep old provider when loading fails")
  57. }
  58. func TestProvider_loadProvidersWithIssuesAndNoCache(t *testing.T) {
  59. client := &mockProviderClient{shouldFail: true}
  60. tmpPath := t.TempDir() + "/providers.json"
  61. providers, err := loadProviders(false, client, tmpPath)
  62. require.Error(t, err)
  63. require.Nil(t, providers, "Expected nil providers when loading fails and no cache exists")
  64. }