photoprism/internal/pro/pro_test.go
Michael Mayer 78f2470421 Backend: Refresh api keys and send to frontend
Signed-off-by: Michael Mayer <michael@liquidbytes.net>
2020-10-04 04:47:54 +02:00

251 lines
6.4 KiB
Go

package pro
import (
"crypto/rand"
"encoding/binary"
"encoding/json"
"fmt"
"os"
"strconv"
"testing"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/assert"
)
func TestMain(m *testing.M) {
log = logrus.StandardLogger()
log.SetLevel(logrus.DebugLevel)
ApiURL = "https://api-int.photoprism.pro/v1/hello"
code := m.Run()
os.Exit(code)
}
// Token returns a random token with length of up to 10 characters.
func Token(size uint) string {
if size > 10 || size < 1 {
panic(fmt.Sprintf("size out of range: %d", size))
}
result := make([]byte, 0, 14)
b := make([]byte, 8)
if _, err := rand.Read(b); err != nil {
panic(err)
}
randomInt := binary.BigEndian.Uint64(b)
result = append(result, strconv.FormatUint(randomInt, 36)...)
for i := len(result); i < cap(result); i++ {
result = append(result, byte(123-(cap(result)-i)))
}
return string(result[:size])
}
func TestNewPro(t *testing.T) {
c := NewConfig("develop")
assert.IsType(t, &Config{}, c)
}
func TestNewProRequest(t *testing.T) {
r := NewRequest("develop")
assert.IsType(t, &Request{}, r)
t.Logf("Request: %+v", r)
if j, err := json.Marshal(r); err != nil {
t.Fatal(err)
} else {
t.Logf("JSON: %s", j)
}
}
func TestConfig_Refresh(t *testing.T) {
t.Run("success", func(t *testing.T) {
fileName := fmt.Sprintf("testdata/pro.%s.yml", Token(8))
c := NewConfig("develop")
if err := c.Refresh(); err != nil {
t.Fatal(err)
}
assert.Len(t, c.Key, 40)
assert.Len(t, c.Secret, 32)
assert.Equal(t, "develop", c.Version)
if sess, err := c.DecodeSession(); err != nil {
t.Fatal(err)
} else if sess.Expired() {
t.Fatalf("session expired: %+v", sess)
}
if err := c.Save(fileName); err != nil {
t.Fatal(err)
}
defer os.Remove(fileName)
assert.FileExists(t, fileName)
if err := c.Refresh(); err != nil {
t.Fatal(err)
}
assert.Len(t, c.Key, 40)
assert.Len(t, c.Secret, 32)
assert.Equal(t, "develop", c.Version)
if sess, err := c.DecodeSession(); err != nil {
t.Fatal(err)
} else if sess.Expired() {
t.Fatal("session expired")
} else {
t.Logf("api session: %+v", sess)
}
if err := c.Save(fileName); err != nil {
t.Fatal(err)
}
assert.FileExists(t, fileName)
})
}
func TestConfig_DecodeSession(t *testing.T) {
t.Run("pro3.yml", func(t *testing.T) {
c := NewConfig("develop")
if err := c.Load("testdata/pro3.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "8dd8b115d052f91ac74b1c2475e305009366c487", c.Key)
assert.Equal(t, "ddf4ce46afbf6c16a6bd8555ab1e4efb", c.Secret)
assert.Equal(t, "7607796238c26b2d95007957b05c72d63f504346576bc2aa064a6dc54344de47d2ab38422bd1d061c067a16ef517e6054d8b7f5336c120431935518277fed45e49472aaf740cac1bc33ab2e362c767007a59e953e9973709", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "develop", c.Version)
if sess, err := c.DecodeSession(); err != nil {
t.Fatal(err)
} else if sess.Expired() {
t.Logf("expired session: %+v", sess)
} else {
t.Errorf("session should be expired: %+v", sess)
}
})
}
func TestConfig_Load(t *testing.T) {
t.Run("pro1.yml", func(t *testing.T) {
c := NewConfig("develop")
if err := c.Load("testdata/pro1.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "b32e9ccdc90eb7c0f6f1b9fbc82b8a2b0e993304", c.Key)
assert.Equal(t, "5991ea36a9611e9e00a8360c10b91567", c.Secret)
assert.Equal(t, "3ef5685c6391a568731c8fc94ccad82d92dea60476c8b672990047c822248f45366fc0e8e812ad15e0b5ae1eb20e866235c56b", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "develop", c.Version)
})
t.Run("pro2.yml", func(t *testing.T) {
c := NewConfig("develop")
if err := c.Load("testdata/pro2.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "ab66cb5cfb3658dbea0a1433df048d900934ac68", c.Key)
assert.Equal(t, "6b0f8440fe307d3120b3a4366350094b", c.Secret)
assert.Equal(t, "c0ca88fc3094b70a1947b5b10f980a420cd6b1542a20f6f26ecc6a16f340473b9fb16b80be1078e86d886b3a8d46bf8184d147", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "200925-f8e2b580-Darwin-i386-DEBUG", c.Version)
})
t.Run("not existing filename", func(t *testing.T) {
c := NewConfig("develop")
if err := c.Load("testdata/pro_xxx.yml"); err == nil {
t.Fatal("file should not exist")
}
assert.Equal(t, "", c.Key)
assert.Equal(t, "", c.Secret)
assert.Equal(t, "", c.Session)
})
}
func TestConfig_Save(t *testing.T) {
t.Run("existing filename", func(t *testing.T) {
assert.FileExists(t, "testdata/pro1.yml")
c := NewConfig("develop")
if err := c.Load("testdata/pro1.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "b32e9ccdc90eb7c0f6f1b9fbc82b8a2b0e993304", c.Key)
assert.Equal(t, "5991ea36a9611e9e00a8360c10b91567", c.Secret)
assert.Equal(t, "3ef5685c6391a568731c8fc94ccad82d92dea60476c8b672990047c822248f45366fc0e8e812ad15e0b5ae1eb20e866235c56b", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "develop", c.Version)
if err := c.Save("testdata/pro-save.yml"); err != nil {
t.Fatal(err)
}
defer os.Remove("testdata/pro-save.yml")
assert.Equal(t, "b32e9ccdc90eb7c0f6f1b9fbc82b8a2b0e993304", c.Key)
assert.Equal(t, "5991ea36a9611e9e00a8360c10b91567", c.Secret)
assert.Equal(t, "3ef5685c6391a568731c8fc94ccad82d92dea60476c8b672990047c822248f45366fc0e8e812ad15e0b5ae1eb20e866235c56b", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "develop", c.Version)
assert.FileExists(t, "testdata/pro-save.yml")
if err := c.Load("testdata/pro-save.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "b32e9ccdc90eb7c0f6f1b9fbc82b8a2b0e993304", c.Key)
assert.Equal(t, "5991ea36a9611e9e00a8360c10b91567", c.Secret)
assert.Equal(t, "3ef5685c6391a568731c8fc94ccad82d92dea60476c8b672990047c822248f45366fc0e8e812ad15e0b5ae1eb20e866235c56b", c.Session)
assert.Equal(t, "unregistered", c.Status)
assert.Equal(t, "develop", c.Version)
})
t.Run("not existing filename", func(t *testing.T) {
c := NewConfig("develop")
c.Key = "F60F5B25D59C397989E3CD374F81CDD7710A4FCA"
c.Secret = "foo"
c.Session = "bar"
assert.Equal(t, "F60F5B25D59C397989E3CD374F81CDD7710A4FCA", c.Key)
assert.Equal(t, "foo", c.Secret)
assert.Equal(t, "bar", c.Session)
if err := c.Save("testdata/pro_new.yml"); err != nil {
t.Fatal(err)
}
assert.Equal(t, "", c.Key)
assert.Equal(t, "", c.Secret)
assert.Equal(t, "", c.Session)
assert.FileExists(t, "testdata/pro_new.yml")
if err := os.Remove("testdata/pro_new.yml"); err != nil {
t.Fatal(err)
}
})
}