1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
mxpv-podsync/pkg/storage/storage_test.go
2018-12-02 13:27:31 -08:00

273 lines
8.2 KiB
Go

package storage
import (
"strconv"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/mxpv/podsync/pkg/api"
"github.com/mxpv/podsync/pkg/model"
)
type storage interface {
SaveFeed(feed *model.Feed) error
GetFeed(hashID string) (*model.Feed, error)
GetMetadata(hashID string) (*model.Feed, error)
Downgrade(userID string, featureLevel int) error
// Patreon pledges
AddPledge(pledge *model.Pledge) error
UpdatePledge(patronID string, pledge *model.Pledge) error
DeletePledge(pledge *model.Pledge) error
GetPledge(patronID string) (*model.Pledge, error)
Close() error
}
var (
testPledge = &model.Pledge{
PledgeID: 12345,
AmountCents: 400,
PatronID: 1,
CreatedAt: time.Now().UTC(),
TotalHistoricalAmountCents: 100,
OutstandingPaymentAmountCents: 100,
IsPaused: true,
}
testFeed = &model.Feed{
FeedID: 1,
HashID: "3",
UserID: "4",
ItemID: "5",
LinkType: api.LinkTypeChannel,
Provider: api.ProviderVimeo,
Format: api.FormatAudio,
Quality: api.QualityLow,
PageSize: 150,
FeatureLevel: api.ExtendedFeatures,
CreatedAt: time.Now().UTC(),
LastAccess: time.Now().UTC(),
}
)
func runStorageTests(t *testing.T, createFn func(t *testing.T) storage) {
// Feeds
t.Run("SaveFeed", makeTest(createFn, testSaveFeed))
t.Run("LastAccess", makeTest(createFn, testLastAccess))
t.Run("GetMetadata", makeTest(createFn, testGetMetadata))
t.Run("Downgrade", func(t *testing.T) {
t.Run("DefaultFeatures", makeTest(createFn, testDowngradeToDefaultFeatures))
t.Run("ExtendedFeatures", makeTest(createFn, testDowngradeToExtendedFeatures))
})
// Pledge tests
t.Run("AddPledge", makeTest(createFn, testAddPledge))
t.Run("GetPledge", makeTest(createFn, testGetPledge))
t.Run("DeletePledge", makeTest(createFn, testDeletePledge))
t.Run("UpdatePledge", makeTest(createFn, testUpdatePledge))
}
func makeTest(createFn func(t *testing.T) storage, testFn func(t *testing.T, storage storage)) func(t *testing.T) {
return func(t *testing.T) {
storage := createFn(t)
testFn(t, storage)
err := storage.Close()
require.Nil(t, err)
}
}
func testSaveFeed(t *testing.T, storage storage) {
err := storage.SaveFeed(testFeed)
require.NoError(t, err)
find, err := storage.GetFeed(testFeed.HashID)
require.NoError(t, err)
require.Equal(t, testFeed.HashID, find.HashID)
require.Equal(t, testFeed.UserID, find.UserID)
require.Equal(t, testFeed.ItemID, find.ItemID)
require.Equal(t, testFeed.LinkType, find.LinkType)
require.Equal(t, testFeed.Provider, find.Provider)
}
func testGetMetadata(t *testing.T, storage storage) {
err := storage.SaveFeed(testFeed)
require.NoError(t, err)
find, err := storage.GetMetadata(testFeed.HashID)
require.NoError(t, err)
require.Equal(t, testFeed.UserID, find.UserID)
require.Equal(t, testFeed.Provider, find.Provider)
require.Equal(t, testFeed.Quality, find.Quality)
require.Equal(t, testFeed.Format, find.Format)
require.Equal(t, 0, find.PageSize)
require.Equal(t, time.Time{}.Unix(), find.CreatedAt.Unix())
require.Equal(t, time.Time{}.Unix(), find.LastAccess.Unix())
require.Equal(t, 0, find.FeatureLevel)
}
func testDowngradeToDefaultFeatures(t *testing.T, storage storage) {
feed := &model.Feed{
HashID: "123456",
UserID: "123456",
ItemID: "123456",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeGroup,
PageSize: 200,
Quality: api.QualityLow,
Format: api.FormatAudio,
FeatureLevel: api.ExtendedFeatures,
}
err := storage.SaveFeed(feed)
require.NoError(t, err)
err = storage.Downgrade(feed.UserID, api.DefaultFeatures)
require.NoError(t, err)
downgraded, err := storage.GetFeed(feed.HashID)
require.NoError(t, err)
require.Equal(t, 50, downgraded.PageSize)
require.Equal(t, api.QualityHigh, downgraded.Quality)
require.Equal(t, api.FormatVideo, downgraded.Format)
require.Equal(t, api.DefaultFeatures, downgraded.FeatureLevel)
}
func testDowngradeToExtendedFeatures(t *testing.T, storage storage) {
feed := &model.Feed{
HashID: "123456",
UserID: "123456",
ItemID: "123456",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeGroup,
PageSize: 500,
Quality: api.QualityLow,
Format: api.FormatAudio,
FeatureLevel: api.ExtendedFeatures,
}
err := storage.SaveFeed(feed)
require.NoError(t, err)
err = storage.Downgrade(feed.UserID, api.ExtendedFeatures)
require.NoError(t, err)
downgraded, err := storage.GetFeed(feed.HashID)
require.NoError(t, err)
require.Equal(t, 150, downgraded.PageSize)
require.Equal(t, feed.Quality, downgraded.Quality)
require.Equal(t, feed.Format, downgraded.Format)
require.Equal(t, api.ExtendedFeatures, downgraded.FeatureLevel)
}
func testLastAccess(t *testing.T, storage storage) {
date := time.Now().AddDate(-1, 0, 0).UTC()
feed := &model.Feed{
FeedID: 1,
HashID: "3",
UserID: "4",
ItemID: "5",
LinkType: api.LinkTypeChannel,
Provider: api.ProviderVimeo,
Format: api.FormatAudio,
Quality: api.QualityLow,
PageSize: 150,
FeatureLevel: api.ExtendedFeatures,
CreatedAt: date,
LastAccess: date,
}
err := storage.SaveFeed(feed)
require.NoError(t, err)
result, err := storage.GetFeed(feed.HashID)
require.NoError(t, err)
require.True(t, result.LastAccess.Sub(time.Now().UTC()) < 2*time.Second)
}
func testAddPledge(t *testing.T, storage storage) {
err := storage.AddPledge(testPledge)
require.NoError(t, err)
pledge, err := storage.GetPledge(strconv.FormatInt(testPledge.PatronID, 10))
require.NoError(t, err)
require.Equal(t, testPledge.PledgeID, pledge.PledgeID)
require.Equal(t, testPledge.PatronID, pledge.PatronID)
require.Equal(t, testPledge.CreatedAt.Unix(), pledge.CreatedAt.Unix())
require.Equal(t, testPledge.DeclinedSince.Unix(), pledge.DeclinedSince.Unix())
require.Equal(t, testPledge.AmountCents, pledge.AmountCents)
require.Equal(t, testPledge.TotalHistoricalAmountCents, pledge.TotalHistoricalAmountCents)
require.Equal(t, testPledge.OutstandingPaymentAmountCents, pledge.OutstandingPaymentAmountCents)
require.Equal(t, testPledge.IsPaused, pledge.IsPaused)
}
func testGetPledge(t *testing.T, storage storage) {
err := storage.AddPledge(testPledge)
require.NoError(t, err)
pledge, err := storage.GetPledge(strconv.FormatInt(testPledge.PatronID, 10))
require.NoError(t, err)
require.Equal(t, testPledge.PledgeID, pledge.PledgeID)
require.Equal(t, testPledge.PatronID, pledge.PatronID)
require.Equal(t, testPledge.CreatedAt.Unix(), pledge.CreatedAt.Unix())
require.Equal(t, testPledge.DeclinedSince.Unix(), pledge.DeclinedSince.Unix())
require.Equal(t, testPledge.AmountCents, pledge.AmountCents)
require.Equal(t, testPledge.TotalHistoricalAmountCents, pledge.TotalHistoricalAmountCents)
require.Equal(t, testPledge.OutstandingPaymentAmountCents, pledge.OutstandingPaymentAmountCents)
require.Equal(t, testPledge.IsPaused, pledge.IsPaused)
}
func testDeletePledge(t *testing.T, storage storage) {
err := storage.AddPledge(testPledge)
require.NoError(t, err)
err = storage.DeletePledge(testPledge)
require.NoError(t, err)
pledge, err := storage.GetPledge(strconv.FormatInt(testPledge.PatronID, 10))
require.Error(t, err)
require.Nil(t, pledge)
}
func testUpdatePledge(t *testing.T, storage storage) {
err := storage.AddPledge(testPledge)
require.NoError(t, err)
now := time.Now().UTC()
err = storage.UpdatePledge(strconv.FormatInt(testPledge.PatronID, 10), &model.Pledge{
DeclinedSince: now,
AmountCents: 400,
TotalHistoricalAmountCents: 800,
OutstandingPaymentAmountCents: 900,
IsPaused: true,
})
require.NoError(t, err)
pledge, err := storage.GetPledge("1")
require.NoError(t, err)
require.Equal(t, testPledge.PledgeID, pledge.PledgeID)
require.Equal(t, testPledge.PatronID, pledge.PatronID)
require.Equal(t, testPledge.CreatedAt.Unix(), pledge.CreatedAt.Unix())
require.Equal(t, now.Unix(), pledge.DeclinedSince.Unix())
require.Equal(t, 400, pledge.AmountCents)
require.Equal(t, 800, pledge.TotalHistoricalAmountCents)
require.Equal(t, 900, pledge.OutstandingPaymentAmountCents)
require.Equal(t, true, pledge.IsPaused)
}