1package store23// TODO: Add test for WriteSitePosts.4// TODO: Add test for TopPostsForSite.56import (7 "fmt"8 "testing"9 "time"1011 "website-feeds/model"12 "website-feeds/model/modeltest"13)1415func TestFakeClose(t *testing.T) {16 fake := NewFake()17 fake.Close()18}1920func TestCreateSiteSuccess(t *testing.T) {21 const (22 name = "SITE_NAME"23 displayName = "DISPLAY_NAME"24 )25 fake := NewFake()26 site, err := fake.CreateSite(t.Context(), name, displayName)27 if err != nil {28 t.Fatalf("unexpected error: %s", err)29 }3031 if site.Name != name {32 t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)33 }3435 if site.DisplayName != displayName {36 t.Errorf(37 "wrong site display name: want=%s, got=%s",38 displayName,39 site.DisplayName,40 )41 }4243 if site.LastFetched != nil {44 t.Errorf(45 "lastFetched should be nil for new site. got=%v",46 site.LastFetched,47 )48 }49}5051func TestCreateSiteDuplicate(t *testing.T) {52 const (53 name = "SITE_NAME"54 displayName = "DISPLAY_NAME"55 )56 fake := NewFake()57 _, err := fake.CreateSite(t.Context(), name, displayName)58 if err != nil {59 t.Fatalf("unexpected error: %s", err)60 }6162 _, err = fake.CreateSite(t.Context(), name, displayName)63 if err != nil {64 expectedError := "site already exists"65 if err.Error() != expectedError {66 t.Errorf("incorrect error. want=%s, got=%s", expectedError, err)67 }68 } else {69 t.Fatalf("expected error, but didn't get one")70 }71}7273func TestCreateSiteInject(t *testing.T) {74 const (75 name = "SITE_NAME"76 displayName = "DISPLAY_NAME"77 )78 expectedErr := fmt.Errorf("INJECTED ERROR")79 fake := NewFake()80 fake.InjectCreateSiteError = &expectedErr8182 _, err := fake.CreateSite(t.Context(), name, displayName)8384 if err != nil {85 if err != expectedErr {86 t.Errorf("incorrect error. want=%s, got=%s", expectedErr, err)87 }88 } else {89 t.Fatalf("expected error, but didn't get one")90 }91}9293func TestGetSiteByNameSuccess(t *testing.T) {94 const (95 name = "SITE_NAME"96 displayName = "DISPLAY_NAME"97 )98 fake := NewFake()99 site, err := fake.CreateSite(t.Context(), name, displayName)100 if err != nil {101 t.Fatalf("unexpected error: %s", err)102 }103104 if site.Name != name {105 t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)106 }107108 if site.DisplayName != displayName {109 t.Errorf(110 "wrong site display name: want=%s, got=%s",111 displayName,112 site.DisplayName,113 )114 }115116 if site.LastFetched != nil {117 t.Errorf(118 "lastFetched should be nil for new site. got=%v",119 site.LastFetched,120 )121 }122123 site, err = fake.SiteByName(t.Context(), "SITE_NAME")124 if err != nil {125 t.Fatalf("unexpected error: %s", err)126 }127128 if site.Name != name {129 t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)130 }131132 if site.DisplayName != displayName {133 t.Errorf(134 "wrong site display name: want=%s, got=%s",135 displayName,136 site.DisplayName,137 )138 }139140 if site.LastFetched != nil {141 t.Errorf(142 "lastFetched should be nil for new site. got=%v",143 site.LastFetched,144 )145 }146}147148func TestGetSiteByNameNotFound(t *testing.T) {149 const (150 name = "SITE_NAME"151 displayName = "DISPLAY_NAME"152 )153 fake := NewFake()154 site, err := fake.CreateSite(t.Context(), name, displayName)155 if err != nil {156 t.Fatalf("unexpected error: %s", err)157 }158159 if site.Name != name {160 t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)161 }162163 if site.DisplayName != displayName {164 t.Errorf(165 "wrong site display name: want=%s, got=%s",166 displayName,167 site.DisplayName,168 )169 }170171 if site.LastFetched != nil {172 t.Errorf(173 "lastFetched should be nil for new site. got=%v",174 site.LastFetched,175 )176 }177178 _, err = fake.SiteByName(t.Context(), "NOPE")179 if err != nil {180 if err.Error() != "site not found" {181 t.Fatalf("wrong error: got=%s, want=\"site not found\"", err)182 }183 } else {184 t.Fatalf("error was nil")185 }186}187188func TestSiteByNameInject(t *testing.T) {189 const (190 name = "SITE_NAME"191 displayName = "DISPLAY_NAME"192 )193 expectedErr := fmt.Errorf("INJECTED ERROR")194 fake := NewFake()195 fake.InjectSiteByNameError = &expectedErr196 site, err := fake.CreateSite(t.Context(), name, displayName)197 if err != nil {198 t.Fatalf("unexpected error: %s", err)199 }200201 if site.Name != name {202 t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)203 }204205 if site.DisplayName != displayName {206 t.Errorf(207 "wrong site display name: want=%s, got=%s",208 displayName,209 site.DisplayName,210 )211 }212213 if site.LastFetched != nil {214 t.Errorf(215 "lastFetched should be nil for new site. got=%v",216 site.LastFetched,217 )218 }219220 _, err = fake.SiteByName(t.Context(), name)221 if err != nil {222 if err.Error() != "INJECTED ERROR" {223 t.Fatalf("wrong error: got=%s, want=INJECTED ERROR", err)224 }225 } else {226 t.Fatalf("error was nil")227 }228}229230func TestSettingsDefault(t *testing.T) {231 fake := NewFake()232 expectedSettings := model.Settings{233 Reddit: nil,234 DefaultNumPosts: 21,235 MaxNumPosts: 70,236 SiteFetchWait: 3 * time.Hour,237 }238 settings, err := fake.Settings(t.Context())239 if err != nil {240 t.Fatalf("unexpected error: %s", err)241 }242243 if *settings != expectedSettings {244 t.Errorf("wrong settings. want=%v, got=%v", expectedSettings, settings)245 }246}247248func TestSettingsSuccess(t *testing.T) {249 fake := NewFake()250 expectedSettings := model.Settings{251 Reddit: &model.RedditSettings{252 ClientID: "CLIENT_ID",253 ClientSecret: "CLIENT_SECRET",254 },255 DefaultNumPosts: 21,256 MaxNumPosts: 70,257 SiteFetchWait: 3,258 }259 fake.settings = *expectedSettings.Clone()260261 settings, err := fake.Settings(t.Context())262 if err != nil {263 t.Fatalf("unexpected error: %s", err)264 }265266 modeltest.CompareSettings(t, settings, &expectedSettings)267}268269func TestSettingsInjectError(t *testing.T) {270 fake := NewFake()271 expectedErr := fmt.Errorf("INJECTED ERROR")272 fake.InjectSettingsError = &expectedErr273274 _, err := fake.Settings(t.Context())275276 if err != nil {277 if err != expectedErr {278 t.Errorf("incorrect error. want=%s, got=%s", expectedErr, err)279 }280 } else {281 t.Fatalf("expected error, but didn't get one")282 }283}284285func TestSettingsUpdateSuccess(t *testing.T) {286 fake := NewFake()287 expectedSettings := model.Settings{288 Reddit: &model.RedditSettings{289 ClientID: "CLIENT_ID",290 ClientSecret: "CLIENT_SECRET",291 },292 DefaultNumPosts: 21,293 MaxNumPosts: 70,294 SiteFetchWait: 3,295 }296297 err := fake.UpdateSettings(t.Context(), &expectedSettings)298 if err != nil {299 t.Fatalf("unexpected error: %s", err)300 }301302 settings, err := fake.Settings(t.Context())303 if err != nil {304 t.Fatalf("unexpected error: %s", err)305 }306307 modeltest.CompareSettings(t, settings, &expectedSettings)308}309310func TestSettingsUpdateInjectFailure(t *testing.T) {311 fake := NewFake()312 expectedErr := fmt.Errorf("INJECTED ERROR")313 fake.InjectUpdateSettingsError = &expectedErr314315 err := fake.UpdateSettings(t.Context(), &model.Settings{})316 if err != nil {317 if err != expectedErr {318 t.Errorf("incorrect error. want=%s, got=%s", expectedErr, err)319 }320 } else {321 t.Fatalf("expected error, but didn't get one")322 }323}