1
0
mirror of https://github.com/taigrr/shorturl synced 2025-01-18 04:03:16 -08:00
shorturl/models_test.go
FileGo a3409454c0
Moved database to Bitcask (#22)
* Changed URL format to shortuuid

* Fixed drone CI failure

* Moved database to Bitcask and some minor changes

* Moved database to Bitcask and some minor changes

* Delete coverage.txt
2021-05-10 23:58:17 +10:00

183 lines
3.2 KiB
Go

package main
import (
"io/ioutil"
"log"
"math/rand"
"os"
"strconv"
"testing"
"time"
"github.com/prologic/bitcask"
"github.com/stretchr/testify/assert"
)
func setupTest() *Env {
var err error
env := &Env{}
env.dbpath, err = ioutil.TempDir("", "shorturl")
if err != nil {
log.Fatal(err)
}
env.db, err = bitcask.Open(env.dbpath)
if err != nil {
log.Fatal(err)
}
return env
}
func (env *Env) finishTest() {
err := env.db.Close()
if err != nil {
log.Fatal(err)
}
err = os.RemoveAll(env.dbpath)
if err != nil {
log.Fatal(err)
}
}
func TestZeroURL(t *testing.T) {
assert := assert.New(t)
u := URL{}
assert.Equal("", u.ID)
assert.Equal("", u.URL)
assert.Equal("", u.Name)
}
func TestNewURL(t *testing.T) {
assert := assert.New(t)
env := setupTest()
u, err := env.NewURL("https://www.google.com")
assert.Nil(err, nil)
assert.NotEqual(u.ID, "")
assert.Equal(u.URL, "https://www.google.com")
assert.Equal(u.Name, "")
_, err = env.NewURL("www.google.com")
assert.NotNil(t, err)
env.finishTest()
}
func TestSetName(t *testing.T) {
assert := assert.New(t)
env := setupTest()
u := URL{}
u.ID = "test"
name := "testname"
err := u.SetName(env.db, name)
assert.Nil(err)
val, err := env.db.Get([]byte(u.ID))
if err != nil {
log.Fatal(err)
}
assert.Equal(name, string(val))
env.finishTest()
}
func TestURLSave(t *testing.T) {
assert := assert.New(t)
env := setupTest()
u := URL{Name: "test", CreatedAt: time.Now()}
err := u.save(env.db)
if assert.NotNil(err) {
assert.Contains(err.Error(), "ID")
}
env.finishTest()
}
func TestURLDelete(t *testing.T) {
assert := assert.New(t)
env := setupTest()
// Insert a test item
id := "test"
err := env.db.Put([]byte(id), []byte("test"))
if err != nil {
t.Fatal(err)
}
// Test
assert.Nil(del(env.db, id))
assert.False(env.db.Has([]byte(id)))
env.finishTest()
}
func TestURLGet(t *testing.T) {
assert := assert.New(t)
env := setupTest()
t.Run("pass", func(t *testing.T) {
// Insert a test item
testUrl := URL{ID: "Test", Name: "Test", URL: "http://example.com", CreatedAt: time.Now()}
err := testUrl.save(env.db)
if err != nil {
t.Fatal(err)
}
// Test
u, err := get(env.db, testUrl.ID)
if assert.Nil(err) {
assert.Equal(testUrl.ID, u.ID)
assert.Equal(testUrl.Name, u.Name)
assert.Equal(testUrl.URL, u.URL)
}
})
t.Run("not_exist", func(t *testing.T) {
// Test
_, err := get(env.db, strconv.Itoa(rand.Intn(1e6)))
assert.NotNil(err)
})
env.finishTest()
}
func TestURLUpdate(t *testing.T) {
assert := assert.New(t)
env := setupTest()
t.Run("pass", func(t *testing.T) {
// Insert a test item
testUrl := URL{ID: "Test", Name: "Test", URL: "http://example.com", CreatedAt: time.Now()}
err := testUrl.save(env.db)
if err != nil {
t.Fatal(err)
}
// Test
newUrlString := "http://example.com/test/"
err = testUrl.update(env.db, newUrlString)
if assert.Nil(err) {
newUrl, err := get(env.db, testUrl.ID)
assert.Nil(err)
assert.Equal(newUrlString, newUrl.URL)
}
})
t.Run("parse_error", func(t *testing.T) {
testUrl := URL{ID: "test"}
err := testUrl.update(env.db, "th1s#isN0tanURL$")
assert.NotNil(err)
})
env.finishTest()
}