示例#1
0
func TestUpdateApiToken(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app, ts)

		// prepare
		d := lib.NewApiTokenDriver(appCtx)
		tok, _ := d.Issue("token1")
		d.Issue("token2")
		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 2
		}, util.DefaultWaitForTimeout)

		var tokUrl = fmt.Sprintf("/api/admin/api_tokens/%s/", tok.Key())
		// Case 400
		req := ts.PutForm(tokUrl, url.Values{
			"desc":     []string{"updated"},
			"alert_on": []string{"-20"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(400, res)

		// Case 200
		req = ts.PutForm(tokUrl, url.Values{
			"desc":     []string{"updated"},
			"alert_on": []string{"30"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)

	})
}
示例#2
0
func TestDeleteRecordApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		d := NewRecordCacheDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))

		// create an empty cache
		var got []tv.TvRecord
		p := app.Api.Path("/records/")
		req := ts.Get(p)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		res.Json(&got)
		assert.EqInt(0, len(got), "GET %s should return 2 TvRecord entities.")
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "GET %s should create RecordCacheTypeTvRecord cache", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should create RecordCacheTypeIEpg cache", p)

		// prepare
		in_window := genTestRecord()
		in_window.StartAt = d.today.Add(1 * time.Hour)
		in_window.EndAt = d.today.Add(2 * time.Hour)
		d.TvRecord.Save(in_window)

		future := genTestRecord()
		future.StartAt = d.today.Add(RECORD_TIME_WINDOW + 1*time.Hour)
		future.EndAt = future.StartAt.Add(1 * time.Hour)
		d.TvRecord.Save(future)

		err := util.WaitFor(func() bool {
			records, _ := d.TvRecord.NewQuery().Count()
			return records == 2
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm TvRecord entities has been stored within a timeout window.")

		// case 1: future
		p = fmt.Sprintf("%s%s.json", app.Api.Path("/records/"), future.Key())
		req = ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "POST %s should not invalidate RecordCacheTypeTvRecord cache (future record)", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should not invalidate RecordCacheTypeIEpg cache (future record)", p)

		// case 2: in recording window
		p = fmt.Sprintf("%s%s.json", app.Api.Path("/records/"), in_window.Key())
		req = ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		assert.Ok(!d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "POST %s should invalidate RecordCacheTypeTvRecord cache (in_window record)", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should not invalidate RecordCacheTypeIEpg cache (in_window record)", p)
	})
}
示例#3
0
func TestUpdatePost(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.App, ts)

		// TODO: fixture
		// prepare
		d := NewPostDriver(appCtx)
		post1, _ := d.Save(&blog.Post{
			Title:     "test post1",
			Content:   "test content",
			Tags:      []string{},
			IsDraft:   false,
			IsHidden:  false,
			PublishAt: time.Now(),
		})

		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)

		// test
		p := app.Api.Path(fmt.Sprintf("/posts/%s.json", post1.Id))
		req := ts.PutForm(p, url.Values{
			"title":      []string{"updated: test post1"},
			"content":    []string{"updated: test content"},
			"publish_at": []string{"2015-01-01T12:04:05Z"}, // ISO8601 format
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)

		assert.Nil(util.WaitFor(func() bool {
			var p blog.Post
			key := d.NewKey(post1.Id, 0, nil)
			d.Get(key, &p)
			return "updated: test post1" == p.Title
		}, util.DefaultWaitForTimeout), "Confirm update")

		// case 404 not found
		p = app.Api.Path(fmt.Sprintf("/api/default/posts/%s.json", "not-found"))
		req = ts.PutForm(p, url.Values{
			"title":      []string{"updated: test post1"},
			"content":    []string{"updated: test content"},
			"publish_at": []string{"2015-01-01T12:04:05Z"}, // ISO8601 format
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(404, res)
	})
}
示例#4
0
func TestCreateRecordApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		d := NewRecordCacheDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))

		// create an empty cache
		var got []tv.TvRecord
		p := app.Api.Path("/records/")
		req := ts.Get(p)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		res.Json(&got)
		assert.EqInt(0, len(got), "GET %s should return 2 TvRecord entities.")
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "GET %s should create RecordCacheTypeTvRecord cache", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should create RecordCacheTypeIEpg cache", p)

		now := time.Now()

		// case 1: future
		req = ts.PostForm(p, url.Values{
			"title":    []string{"Title"},
			"category": []string{"Category"},
			"cid":      []string{"27"},
			"sid":      []string{"hd"},
			"start_at": []string{util.FormatDateTime(now.Add(RECORD_TIME_WINDOW + 24*time.Hour))},
			"end_at":   []string{util.FormatDateTime(now.Add(RECORD_TIME_WINDOW + 25*time.Hour))},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(201, res)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "POST %s should not invalidate RecordCacheTypeTvRecord cache (future record)", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should not invalidate RecordCacheTypeIEpg cache (future record)", p)

		// case 2: in recording window
		req = ts.PostForm(p, url.Values{
			"title":    []string{"Title"},
			"category": []string{"Category"},
			"cid":      []string{"27"},
			"sid":      []string{"hd"},
			"start_at": []string{util.FormatDateTime(now)},
			"end_at":   []string{util.FormatDateTime(now.Add(1 * time.Hour))},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(201, res)
		assert.Ok(!d.Cache.Exists(d.GetMcKey(RecordCacheTypeTvRecord)), "POST %s should invalidate RecordCacheTypeTvRecord cache (in window)", p)
		assert.Ok(d.Cache.Exists(d.GetMcKey(RecordCacheTypeIEpg)), "GET %s should not invalidate RecordCacheTypeIEpg cache (in window)", p)
	})
}
示例#5
0
func TestApiCreateEvent_201(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)
		d := NewEventDriver(appCtx)

		var respJson map[string]interface{}
		var e event.Event

		p := app.TestApp().Api.Path("/events/")
		req := ts.PostForm(p, url.Values{
			"title":      []string{"test tour title"},
			"link":       []string{"http://www.example.com/"},
			"image_link": []string{"http://www.example.com/img.png"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(201, res)

		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm the show has been inserted within timeout window.")

		res.Json(&respJson)
		d.Load(respJson["id"].(string), &e)
		assert.EqStr("test tour title", e.Title, "Title")
		assert.EqStr("http://www.example.com/", e.Link, "Link")
		assert.EqStr("http://www.example.com/img.png", e.ImageLink, "ImageLink")
	})
}
示例#6
0
func TestDeleteAmebloContents(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)

		// prepare
		amUrl := "http://ameblo.jp/eriko--imai/entry-11980960390.html"
		d := NewAmebloEntryDriver(appCtx)

		t1 := time.Now()
		ent := &ameblo.AmebloEntry{
			Title:      "切り替え〜る",
			Owner:      "今井絵理子",
			Url:        amUrl,
			UpdatedAt:  t1,
			CrawledAt:  time.Time{},
			Content:    "",
			AmLikes:    5,
			AmComments: 10,
		}
		err := updateIndexes(appCtx, []*ameblo.AmebloEntry{ent})
		assert.Nil(err, "UpdateIndexes() should not return an error on creating an ameblo entry")

		p := app.TestApp().Api.Path("/ameblo/contents/今井絵理子.json")
		req := ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(200, res)

		// confirm the content updated.
		var ent1 ameblo.AmebloEntry
		err = d.Get(d.NewKey(amUrl, 0, nil), &ent1)
		assert.Ok(ent1.CrawledAt.Equal(time.Time{}), "DELETE %s should delete the cralwing timestamp.", p)
	})
}
示例#7
0
func TestApiCreateEvent_400(t *testing.T) {
	var genParams = func(omitName string) url.Values {
		params := url.Values{
			"title":      []string{"test tour title"},
			"link":       []string{"http://www.example.com/"},
			"image_link": []string{"http://www.example.com/img.png"},
		}
		params.Del(omitName)
		return params
	}

	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiCreateEventShow.json", nil)
		p := app.TestApp().Api.Path("/events/")
		var testOmitParams = []string{
			"title", "link", "image_link",
		}
		for _, paramName := range testOmitParams {
			req := ts.PostForm(p, genParams(paramName))
			lib.SetApiTokenForTest(req, lib.Admin)
			res := req.RouteTo(app.TestApp().Routes())
			assert.HttpStatus(400, res)
		}
	})
}
示例#8
0
func TestApiUpdateEvent(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiUpdateEvent.json", nil)
		d := NewEventDriver(appCtx)

		var e event.Event

		p := app.TestApp().Api.Path("/events/event1.json")
		req := ts.PutForm(p, url.Values{
			"title":      []string{"Updated Title"},
			"link":       []string{"http://www.up.example.com/"},
			"image_link": []string{"http://www.up.example.com/img.png"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(200, res)

		err := util.WaitFor(func() bool {
			d.Load("event1", &e)
			return e.Title == "Updated Title"
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm the show has been inserted within timeout window.")

		assert.EqStr("Updated Title", e.Title, "Title")
		assert.EqStr("http://www.up.example.com/", e.Link, "Link")
		assert.EqStr("http://www.up.example.com/img.png", e.ImageLink, "ImageLink")
	})
}
示例#9
0
func TestAddKeywordApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		p := app.Api.Path("/keywords/")
		req := ts.PostForm(p, url.Values{
			"keyword":  []string{"モーニング娘。'15"},
			"category": []string{"モーニング娘。"},
			"scope":    []string{"1"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		var got map[string]interface{}
		res := req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(201, res)
		assert.EqStr(
			"http://localhost:8080/api/pt/keywords/モーニング娘。'15.json",
			got["location"].(string),
			"POST %s location",
			p,
		)

		// Confirm cache invalidation
		mc := memcache.NewDriver(ts.Context, wcg.NewLogger(nil))
		assert.Ok(!mc.Exists(MC_KEY_KEYWORDS), "POST %s should invalidate the cache", p)

	})
}
示例#10
0
func TestApiCreateEventShow_400(t *testing.T) {
	var genParams = func(omitName string) url.Values {
		params := url.Values{
			"open_at":    []string{"2015-01-02T06:00:00Z"},
			"start_at":   []string{"2015-01-02T07:00:00Z"},
			"latitude":   []string{"37.39"},
			"longitude":  []string{"140.38"},
			"venue_id":   []string{"153237058036933"},
			"venue_name": []string{"郡山市民文化センター"},
			"pia_link":   []string{"http://pia.jp/link"},
			"ya_keyword": []string{"郡山"},
		}
		params.Del(omitName)
		return params
	}

	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiCreateEventShow.json", nil)
		p := app.TestApp().Api.Path("/events/event1/shows")
		var testOmitParams = []string{
			"open_at", "start_at", "latitude", "longitude", "venue_id", "venue_name", // "pia_link", "ya_keyword",
		}
		for _, paramName := range testOmitParams {
			req := ts.PostForm(p, genParams(paramName))
			lib.SetApiTokenForTest(req, lib.Admin)
			res := req.RouteTo(app.TestApp().Routes())
			assert.HttpStatus(400, res)
		}
	})
}
示例#11
0
func TestDelChannelApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		// prepare
		d := NewTvChannelDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))
		ent1 := &tv.TvChannel{"c1", "s1", "foo", "bar"}
		ent2 := &tv.TvChannel{"c2", "s2", "hoge", "piyo"}
		d.Put(d.NewKey(ent1.Key(), 0, nil), ent1)
		d.Put(d.NewKey(ent2.Key(), 0, nil), ent2)

		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 2
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm TvChannel entities has been stored within a timeout window.")
		p := app.Api.Path("/channels/c1/s1.json")
		req := ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)

		err = util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "DELETE %s Confirm TvChannel entities has been deleted via API within a timeout window.", p)

		// Confirm cache invalidation
		mc := memcache.NewDriver(ts.Context, wcg.NewLogger(nil))
		assert.Ok(!mc.Exists(MC_KEY_CHANNELS), "DELETE %s should invalidate the cache", p)

	})
}
示例#12
0
func TestAddChannelApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		p := app.Api.Path("/channels/")
		req := ts.PostForm(p, url.Values{
			"cid":             []string{"c1"},
			"sid":             []string{"s1"},
			"name":            []string{"foo"},
			"iepg_station_id": []string{"bar"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		var got map[string]interface{}
		res := req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(201, res)
		assert.EqStr(
			"http://localhost:8080/api/pt/channels/c1/s1.json",
			got["location"].(string),
			"POST %s location",
			p,
		)

		// Confirm cache invalidation
		mc := memcache.NewDriver(ts.Context, wcg.NewLogger(nil))
		assert.Ok(!mc.Exists(MC_KEY_CHANNELS), "POST %s should invalidate the cache", p)

	})
}
示例#13
0
func TestCreatePost(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		req := ts.PostForm("/api/default/posts/", url.Values{
			"title":      []string{"test title"},
			"content":    []string{"test content"},
			"publish_at": []string{"2015-01-01T12:04:05Z"}, // ISO8601 format
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(201, res)

		// case 400: title missing
		p := app.Api.Path("/posts/")
		req = ts.PostForm(p, url.Values{
			"content":    []string{"test content"},
			"publish_at": []string{"2015-01-01T12:04:05Z"}, // ISO8601 format
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(400, res)

		// case 400: publish_at missing
		req = ts.PostForm(p, url.Values{
			"title":   []string{"test title"},
			"content": []string{"test content"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(400, res)

		// case 400: publish_at missing (invalid format)
		req = ts.PostForm(p, url.Values{
			"title":      []string{"test title"},
			"content":    []string{"test content"},
			"publish_at": []string{"2015/01/01 12:04:05 +0900"}, // ISO8601 format
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(400, res)
	})
}
示例#14
0
func TestApiCreateEventShow_404(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiCreateEventShow.json", nil)
		p := app.TestApp().Api.Path("/events/notexit/shows")
		req := ts.PostForm(p, url.Values{})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(404, res)
	})
}
示例#15
0
func TestGetVersion(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		var got interface{}
		assert := test.NewAssert(t)
		req := ts.Get("/api/admin/version/")
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
	})
}
示例#16
0
func TestGetPost(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.App, ts)

		// TODO: fixture
		// prepare
		d := NewPostDriver(appCtx)
		post1, _ := d.Save(&blog.Post{
			Title:     "test post1",
			Content:   "test content",
			Tags:      []string{},
			IsDraft:   false,
			IsHidden:  false,
			PublishAt: time.Now(),
		})
		post2, _ := d.Save(&blog.Post{
			Title:     "test post2",
			Content:   "test content",
			Tags:      []string{},
			IsDraft:   true,
			IsHidden:  false,
			PublishAt: time.Now(),
		})

		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)

		// test post1 : public post
		var got *blog.Post
		p := app.Api.Path(fmt.Sprintf("/posts/%s.json", post1.Id))
		req := ts.Get(p)
		res := req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqStr("test post1", got.Title, "post1.Title")

		// test post2 : draft post, only visible by admins.
		p = app.Api.Path(fmt.Sprintf("/posts/%s.json", post2.Id))
		req = ts.Get(p)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(404, res)

		req = ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqStr("test post2", got.Title, "post2.Title")
	})
}
示例#17
0
func TestDeletePost(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.App, ts)

		// TODO: fixture
		// prepare
		d := NewPostDriver(appCtx)
		post1, _ := d.Save(&blog.Post{
			Title:     "test post1",
			Content:   "test content",
			Tags:      []string{},
			IsDraft:   false,
			IsHidden:  false,
			PublishAt: time.Now(),
		})

		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)

		// test
		req := ts.Delete(fmt.Sprintf("/api/default/posts/%s.json", post1.Id))
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)

		assert.Nil(util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 0
		}, util.DefaultWaitForTimeout), "Confirm deletion")

		// case 200 not found even the post does not exist.
		req = ts.Delete(fmt.Sprintf("/api/default/posts/%s.json", "not-found"))
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
	})
}
示例#18
0
func TestAmebloIndexApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		var got map[string][]string
		p := app.TestApp().Api.Path("/ameblo/indexes/")
		req := ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqInt(2, len(got), "GET %s should return the list of crawled results.", p)
		assert.EqInt(20, len(got["今井絵理子"]), "GET %s return 20 entries for '今井絵理子'.", p)
	})
}
示例#19
0
func TestAmebloIndexAllApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		var got []string
		p := app.TestApp().Api.Path("/ameblo/indexes/今井絵理子.json")
		req := ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.Ok(
			len(got) > 20,
			"GET %s should return more thant 20 entries for '今井絵理子' but got %d.",
			p, len(got))
	})
}
示例#20
0
func TestAmebloCrawlContents(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)

		// prepare
		amUrl := "http://ameblo.jp/eriko--imai/entry-11980960390.html"
		d := NewAmebloEntryDriver(appCtx)
		refd := NewAmebloRefDriver(appCtx)

		t1 := time.Now()
		ent := &ameblo.AmebloEntry{
			Title:      "切り替え〜る",
			Owner:      "今井絵理子",
			Url:        amUrl,
			UpdatedAt:  t1,
			CrawledAt:  time.Time{},
			Content:    "",
			AmLikes:    5,
			AmComments: 10,
		}
		err := updateIndexes(appCtx, []*ameblo.AmebloEntry{ent})
		assert.Nil(err, "UpdateIndexes() should not return an error on creating an ameblo entry")
		err = util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm AmebloEntry has been indexed.")

		p := app.TestApp().Api.Path("/ameblo/contents/")
		req := ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(200, res)

		// confirm the content updated.
		var ent1 ameblo.AmebloEntry
		err = d.Get(d.NewKey(amUrl, 0, nil), &ent1)
		assert.Ok(len(ent1.Content) > 0, "GET %s should update the content", p)

		// confirm the reference updated
		c, _ := refd.NewQuery().Count()
		assert.EqInt(1, c, "GET %s should update the content reference", p)
	})
}
示例#21
0
func TestApiCreateEventShow(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiCreateEventShow.json", nil)
		d := NewShowDriver(appCtx)

		var respJson map[string]interface{}
		var show event.Show
		p := app.TestApp().Api.Path("/events/event1/shows")
		req := ts.PostForm(p, url.Values{
			"open_at":    []string{"2015-01-02T06:00:00Z"},
			"start_at":   []string{"2015-01-02T07:00:00Z"},
			"latitude":   []string{"37.39"},
			"longitude":  []string{"140.38"},
			"venue_id":   []string{"153237058036933"},
			"venue_name": []string{"郡山市民文化センター"},
			"pia_link":   []string{"http://pia.jp/link"},
			"ya_keyword": []string{"郡山"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(201, res)

		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm the show has been inserted within timeout window.")

		res.Json(&respJson)
		d.Load(respJson["id"].(string), "event1", &show)
		open_at, _ := util.ParseDateTime("2015-01-02T06:00:00Z")
		start_at, _ := util.ParseDateTime("2015-01-02T07:00:00Z")
		assert.EqTime(open_at, show.OpenAt, "OpenAt")
		assert.EqTime(start_at, show.StartAt, "StartAt")
		assert.EqFloat64(37.39, show.Latitude, "Latitude")
		assert.EqFloat64(140.38, show.Longitude, "Longitude")
		assert.EqStr("153237058036933", show.VenueId, "VenueId")
		assert.EqStr("郡山市民文化センター", show.VenueName, "VenueName")
		assert.EqStr("http://pia.jp/link", show.PiaLink, "PiaLink")
		assert.EqStr("郡山", show.YAKeyword, "YAKeyword")
	})
}
示例#22
0
func TestApiDeleteEventShow(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.TestApp().App, ts)
		test.DatastoreFixture(ts.Context, "./fixtures/TestApiDeleteEventShow.json", nil)
		d := NewShowDriver(appCtx)

		p := app.TestApp().Api.Path("/events/event1/shows/event1-show1.json")
		req := ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.TestApp().Routes())
		assert.HttpStatus(200, res)

		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 0
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm the show has been inserted within timeout window.")
	})
}
示例#23
0
func TestIssueApiToken(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app, ts)
		req := ts.PostForm("/api/admin/api_tokens/", url.Values{
			"desc": []string{"new token"},
		})
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(201, res)

		var got []*models.ApiToken
		d := lib.NewApiTokenDriver(appCtx)
		util.WaitFor(func() bool {
			d.NewQuery().GetAll(&got)
			return got != nil && len(got) == 1
		}, util.DefaultWaitForTimeout)
		assert.EqStr("new token", got[0].Description, "IssueApiToken Description")
	})
}
示例#24
0
func TestDelKeywordApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		// prepare
		d := NewCrawlerConfigDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))
		d.Add(&tv.CrawlerConfig{
			Keyword:  "モーニング娘。'15",
			Category: "モーニング娘",
			Scope:    tv.FEED_SCOPE_ALL,
		})
		d.Add(&tv.CrawlerConfig{
			Keyword:  "SPEED",
			Category: "SPEED",
			Scope:    tv.FEED_SCOPE_ALL,
		})

		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 2
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm CrawlerConfig entities has been stored within a timeout window.")

		p := app.Api.Path("/keywords/モーニング娘。'15.json")
		req := ts.Delete(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)

		err = util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "DELETE %s Confirm CrawlerConfig entities has been deleted via API within a timeout window.", p)

		// Confirm cache invalidation
		mc := memcache.NewDriver(ts.Context, wcg.NewLogger(nil))
		assert.Ok(!mc.Exists(MC_KEY_KEYWORDS), "DELETE %s should invalidate the cache", p)
	})
}
示例#25
0
func TestCronApiTokens(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app, ts)

		// prepare
		d := lib.NewApiTokenDriver(appCtx)
		tok1, _ := d.Issue("token1")
		tok2, _ := d.Issue("token2")
		d.Issue("token3") // not monitored
		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 3
		}, util.DefaultWaitForTimeout)

		now := time.Now()
		tok1.LastAccess = now
		tok1.AlertOn = 1 * time.Hour
		key := d.NewKey(tok1.Key(), 0, nil)
		d.SyncPut(key, tok1)

		tok2.LastAccess = now.Add(-1 * 60 * 60 * time.Second) // 1 hour before
		tok2.AlertOn = 30 * time.Second
		key = d.NewKey(tok2.Key(), 0, nil)
		d.SyncPut(key, tok2)

		// test
		var got map[string]int
		req := ts.Get("/cron/admin/api_tokens/")
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		res.Json(&got)

		assert.EqInt(1, got["alerted_tokens"], "alerted_tokens")
		assert.EqInt(2, got["monitored_tokens"], "monitored_tokens")
		assert.EqInt(3, got["total_tokens"], "total_tokens")
	})
}
示例#26
0
func TestListApiTokens(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app, ts)
		// prepare
		d := lib.NewApiTokenDriver(appCtx)
		d.Issue("token1")
		d.Issue("token2")
		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 2
		}, util.DefaultWaitForTimeout)

		// test
		var got []*models.ApiToken
		req := ts.Get("/api/admin/api_tokens/")
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		res.Json(&got)
		assert.EqInt(2, len(got), "ListApiToken length")
	})
}
示例#27
0
func TestRevokeApiToken(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app, ts)

		// prepare
		d := lib.NewApiTokenDriver(appCtx)
		tok, _ := d.Issue("token1")
		d.Issue("token2")
		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 2
		}, util.DefaultWaitForTimeout)

		var tokUrl = fmt.Sprintf("/api/admin/api_tokens/%s/", tok.Key())

		// Case 200
		req := ts.Delete(tokUrl)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
	})
}
示例#28
0
func TestCronKeywordCrawl(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)

		// prepare
		d := NewCrawlerConfigDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))
		d.Add(&tv.CrawlerConfig{
			Keyword:  "モーニング娘。",
			Category: "モーニング娘",
			Scope:    tv.FEED_SCOPE_ALL,
		})
		err := util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 1
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Confirm CrawlerConfig entities has been stored within a timeout window.")

		p := app.Cron.Path("/keywords/crawl/")
		req := ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
	})
}
示例#29
0
func TestPreviewKeywordApi(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)

		// prepare
		dchan := NewTvChannelDriver(TEST_APP_KEY, ts.Context, wcg.NewLogger(nil))
		dchan.AddChannelList(defaultChannels)
		err := util.WaitFor(func() bool {
			c, _ := dchan.NewQuery().Count()
			return c > 0
		}, util.DefaultWaitForTimeout)
		assert.Nil(err, "Prepare channels within a timeout window")

		var got map[string]interface{}
		p := app.Api.Path("/keywords/preview/モーニング娘。'14.json")
		req := ts.Get(p)
		lib.SetApiTokenForTest(req, lib.Admin)
		res := req.RouteTo(app.Routes())
		assert.HttpStatus(200, res)
		res.Json(&got)
		assert.NotNil(got["samples"], "GET %s should return the sample list", p)
		assert.NotNil(got["total"], "GET %s should return the total entries", p)
	})
}
示例#30
0
func TestListPost(t *testing.T) {
	test.RunTestServer(func(ts *test.TestServer) {
		assert := test.NewAssert(t)
		appCtx := apptest.NewAppContextFromTestServer(app.App, ts)

		// TODO: fixture
		// prepare: creates 15 posts (5 for public, 5 for hidden, 5 for draft)
		d := NewPostDriver(appCtx)
		posts := make([]*blog.Post, 0)
		for i := 0; i < 5; i++ {
			posts = append(posts, &blog.Post{
				Title:     fmt.Sprintf("test post %d, public", i),
				Content:   "test content",
				Tags:      []string{},
				IsDraft:   false,
				IsHidden:  false,
				PublishAt: time.Now(),
			})
			posts = append(posts, &blog.Post{
				Title:     fmt.Sprintf("test post %d, draft", i),
				Content:   "test content",
				Tags:      []string{},
				IsDraft:   true,
				IsHidden:  false,
				PublishAt: time.Now(),
			})
			posts = append(posts, &blog.Post{
				Title:     fmt.Sprintf("test post %d, hidden", i),
				Content:   "test content",
				Tags:      []string{},
				IsDraft:   false,
				IsHidden:  true,
				PublishAt: time.Now(),
			})
		}
		d.SaveMulti(posts)

		util.WaitFor(func() bool {
			c, _ := d.NewQuery().Count()
			return c == 15
		}, util.DefaultWaitForTimeout)

		// test : public post
		var got *postQueryResult
		var path = app.Api.Path("/posts/") + "?n=3"
		req := ts.Get(path)
		res := req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqInt(3, len(got.Posts), fmt.Sprintf("GET %s| num returned posts", path))
		assert.EqStr(app.Api.Path("/posts/")+"?page=1&n=3", got.Next, fmt.Sprintf("GET %s| next", path))
		assert.EqStr("", got.Previous, fmt.Sprintf("GET %s | previous", path))

		path = got.Next
		req = ts.Get(got.Next)
		res = req.RouteTo(app.Routes())
		res.Json(&got)
		assert.EqInt(2, len(got.Posts), fmt.Sprintf("GET %s | num returned posts", path))
		assert.EqStr("", got.Next, fmt.Sprintf("GET %s | next", path))
		assert.EqStr(app.Api.Path("/posts/")+"?page=0&n=3", got.Previous, fmt.Sprintf("GET %s | previous", path))

		// test : all posts visible to admin
		path = app.Api.Path("/posts/") + "?n=3&is_admin=true"
		req = ts.Get(path)
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqInt(3, len(got.Posts), fmt.Sprintf("GET %s | num returned posts", path))
		assert.EqStr(app.Api.Path("/posts/")+"?page=1&n=3&is_admin=true", got.Next, fmt.Sprintf("GET %s | next", path))
		assert.EqStr("", got.Previous, fmt.Sprintf("GET %s | previous", path))

		path = app.Api.Path("/posts/") + "?page=5&n=3&is_admin=true"
		req = ts.Get(path)
		lib.SetApiTokenForTest(req, lib.Admin)
		res = req.RouteTo(app.Routes())
		res.Json(&got)
		assert.HttpStatus(200, res)
		assert.EqInt(0, len(got.Posts), fmt.Sprintf("GET %s | num returned posts", path))
		assert.EqStr("", got.Next, fmt.Sprintf("GET %s | next", path))
		assert.EqStr(app.Api.Path("/posts/")+"?page=4&n=3&is_admin=true", got.Previous, fmt.Sprintf("GET %s | previous", path))
	})
}