func testShawtyJSValidUrl(t *testing.T, url string, expectedID uint64) {
	conf, seed, sh := getShawtyJSTestData()
	controller := NewShawtyJSController(conf, sh)
	res := controller.GetJSResponse(url, "127.0.0.1", false)
	shortID := data.ShortID(expectedID, utils.ToSafeBase(seed))

	if res == nil {
		t.Error("No response")
		t.FailNow()
	}

	if res.Data["Success"] != 1 {
		t.Errorf("'Success' flag in the data needs to be '1', but got %v instead", res.Data["Success"])
	}

	if res.Data["Domain"] != conf["SHAWTY_DOMAIN"] {
		t.Errorf(
			"Wrong 'Domain' returned. '%s' expected, but '%s' returned instead",
			conf["SHAWTY_DOMAIN"], res.Data["Domain"])
	}

	if res.Data["Short"] != shortID {
		t.Errorf("Data[Short] expected to be %s, but %s returned", shortID, res.Data["Short"])
	}

	shawty, _ := sh.GetByUrl(url)
	if res.Data["Shawty"].(*data.Shawty).ID != shawty.ID {
		t.Errorf("Wrong 'Shawty' returned. Expecting %v, got %v",
			shawty, res.Data["Shawty"].(*data.Shawty))
	}
}
// GetJSResponse response to javascript request, based on the URL and the bookmarklet flag
func (controller *ShawtyJSController) GetJSResponse(url, creatorIP string, bm bool) (res *ResPkg) {
	domain := controller.config["SHAWTY_DOMAIN"]
	limit, _ := strconv.ParseUint(controller.config["SHAWTY_LPM"], 0, 32)

	res = NewResPkg()
	res.Data["Bookmarklet"] = bm
	res.Data["Domain"] = domain
	res.Data["Success"] = 1

	if !urlPattern.MatchString(url) {
		res.Data["Success"] = 0
		res.Errors = append(res.Errors, errors.New("a valid url has to start with http:// or https://"))
		return
	}

	dupDomainPattern := regexp.MustCompile(fmt.Sprintf("^(?i)(https?)://%s.*", domain))
	if dupDomainPattern.MatchString(url) {
		res.Data["Success"] = 0
		res.Errors = append(res.Errors, errors.New("this url is already shortened"))
		return
	}

	shawty, err := controller.sh.GetByUrl(url)

	if err != nil { // need to create
		minuteAgo := time.Unix(time.Now().Unix()-60, 0)
		numLinks, err := controller.sh.NumLinks(creatorIP, minuteAgo)

		if err != nil {
			res.Data["Success"] = 0
			res.Errors = append(res.Errors, errors.New("unknown error occured"))
			log.Errorf("%v", err)
		} else {

			// check for rate limit
			if numLinks >= uint32(limit) {
				res.Data["Success"] = 0
				res.Errors = append(res.Errors, errors.New("you are shortening your links too quickly"))
				log.Errorf("%s has reached the rate limit (%d)", creatorIP, limit)
			} else {
				shawty, err = controller.sh.Create("", url, creatorIP)
				if err != nil {
					res.Data["Success"] = 0
					res.Errors = append(res.Errors, errors.New("cannot shorten this link"))
					log.Errorf("%v", err)
				}
			}
		}
	}

	if res.Data["Success"] == 1 {
		res.Data["Shawty"] = shawty
		res.Data["Short"] = data.ShortID(shawty.ID, shawty.Rand)
	}

	return
}
// TestShortIDNotFound tests the response when a short ID is requested which is in the data store
func TestShortIDNotFound(t *testing.T) {
	conf, _, sh := getShortIDTestData()
	controller := NewShortIDController(conf, sh)

	shortID := data.ShortID(5, utils.ToSafeBase(1))
	res := controller.Respond(shortID)

	if res == nil {
		t.Error("No response")
		t.FailNow()
	}

	if res.HttpStatus != http.StatusNotFound {
		t.Errorf(
			"HTTP status needs to be %d when Shawty found, but %d returned instead",
			http.NotFound, res.HttpStatus)
	}
}
// TestShortIDFound tests the response when a short ID is requested which is in the data store
func TestShortIDFound(t *testing.T) {
	conf, seed, sh := getShortIDTestData()
	controller := NewShortIDController(conf, sh)

	shortID := data.ShortID(2, utils.ToSafeBase(seed))
	res := controller.Respond(shortID)

	if res == nil {
		t.Error("No response")
		t.FailNow()
	}

	if res.HttpStatus != http.StatusMovedPermanently {
		t.Errorf(
			"HTTP status needs to be %d when Shawty found, but %d returned instead",
			http.StatusMovedPermanently, res.HttpStatus)
	}

	if res.Data["Domain"] != conf["SHAWTY_DOMAIN"] {
		t.Errorf(
			"Wrong 'Domain' returned. '%s' expected, but '%s' returned instead",
			conf["SHAWTY_DOMAIN"], res.Data["Domain"])
	}

	shawty2, _ := sh.GetByUrl("http://test.com/url2")

	if res.Data["Shawty"].(*data.Shawty).ID != shawty2.ID {
		t.Errorf("Wrong 'Shawty' returned. Expected %v, but %v returned", shawty2, res.Data["Shawty"])
		t.FailNow()
	}

	// make sure it increased hits
	if shawty2.Hits != 1 {
		t.Error("Respond is expected to increase hits when the requested Shawty is found")
	}
}