website-feeds

Make RSS feeds of your favorite "vote on posts" websites

git clone https://code.pdelong.com/website-feeds.git

  1package store
  2
  3// TODO: Add test for WriteSitePosts.
  4// TODO: Add test for TopPostsForSite.
  5
  6import (
  7	"fmt"
  8	"testing"
  9	"time"
 10
 11	"website-feeds/model"
 12	"website-feeds/model/modeltest"
 13)
 14
 15func TestFakeClose(t *testing.T) {
 16	fake := NewFake()
 17	fake.Close()
 18}
 19
 20func 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	}
 30
 31	if site.Name != name {
 32		t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)
 33	}
 34
 35	if site.DisplayName != displayName {
 36		t.Errorf(
 37			"wrong site display name: want=%s, got=%s",
 38			displayName,
 39			site.DisplayName,
 40		)
 41	}
 42
 43	if site.LastFetched != nil {
 44		t.Errorf(
 45			"lastFetched should be nil for new site. got=%v",
 46			site.LastFetched,
 47		)
 48	}
 49}
 50
 51func 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	}
 61
 62	_, 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}
 72
 73func 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 = &expectedErr
 81
 82	_, err := fake.CreateSite(t.Context(), name, displayName)
 83
 84	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}
 92
 93func 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	}
103
104	if site.Name != name {
105		t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)
106	}
107
108	if site.DisplayName != displayName {
109		t.Errorf(
110			"wrong site display name: want=%s, got=%s",
111			displayName,
112			site.DisplayName,
113		)
114	}
115
116	if site.LastFetched != nil {
117		t.Errorf(
118			"lastFetched should be nil for new site. got=%v",
119			site.LastFetched,
120		)
121	}
122
123	site, err = fake.SiteByName(t.Context(), "SITE_NAME")
124	if err != nil {
125		t.Fatalf("unexpected error: %s", err)
126	}
127
128	if site.Name != name {
129		t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)
130	}
131
132	if site.DisplayName != displayName {
133		t.Errorf(
134			"wrong site display name: want=%s, got=%s",
135			displayName,
136			site.DisplayName,
137		)
138	}
139
140	if site.LastFetched != nil {
141		t.Errorf(
142			"lastFetched should be nil for new site. got=%v",
143			site.LastFetched,
144		)
145	}
146}
147
148func 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	}
158
159	if site.Name != name {
160		t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)
161	}
162
163	if site.DisplayName != displayName {
164		t.Errorf(
165			"wrong site display name: want=%s, got=%s",
166			displayName,
167			site.DisplayName,
168		)
169	}
170
171	if site.LastFetched != nil {
172		t.Errorf(
173			"lastFetched should be nil for new site. got=%v",
174			site.LastFetched,
175		)
176	}
177
178	_, 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}
187
188func 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 = &expectedErr
196	site, err := fake.CreateSite(t.Context(), name, displayName)
197	if err != nil {
198		t.Fatalf("unexpected error: %s", err)
199	}
200
201	if site.Name != name {
202		t.Errorf("wrong site name: want=%s, got=%s", name, site.Name)
203	}
204
205	if site.DisplayName != displayName {
206		t.Errorf(
207			"wrong site display name: want=%s, got=%s",
208			displayName,
209			site.DisplayName,
210		)
211	}
212
213	if site.LastFetched != nil {
214		t.Errorf(
215			"lastFetched should be nil for new site. got=%v",
216			site.LastFetched,
217		)
218	}
219
220	_, 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}
229
230func 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	}
242
243	if *settings != expectedSettings {
244		t.Errorf("wrong settings. want=%v, got=%v", expectedSettings, settings)
245	}
246}
247
248func 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()
260
261	settings, err := fake.Settings(t.Context())
262	if err != nil {
263		t.Fatalf("unexpected error: %s", err)
264	}
265
266	modeltest.CompareSettings(t, settings, &expectedSettings)
267}
268
269func TestSettingsInjectError(t *testing.T) {
270	fake := NewFake()
271	expectedErr := fmt.Errorf("INJECTED ERROR")
272	fake.InjectSettingsError = &expectedErr
273
274	_, err := fake.Settings(t.Context())
275
276	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}
284
285func 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	}
296
297	err := fake.UpdateSettings(t.Context(), &expectedSettings)
298	if err != nil {
299		t.Fatalf("unexpected error: %s", err)
300	}
301
302	settings, err := fake.Settings(t.Context())
303	if err != nil {
304		t.Fatalf("unexpected error: %s", err)
305	}
306
307	modeltest.CompareSettings(t, settings, &expectedSettings)
308}
309
310func TestSettingsUpdateInjectFailure(t *testing.T) {
311	fake := NewFake()
312	expectedErr := fmt.Errorf("INJECTED ERROR")
313	fake.InjectUpdateSettingsError = &expectedErr
314
315	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}