1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
mxpv-podsync/pkg/storage/dynamo_test.go
2019-04-06 12:13:50 -07:00

154 lines
3.8 KiB
Go

package storage
import (
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/mxpv/podsync/pkg/api"
"github.com/mxpv/podsync/pkg/model"
)
var feed = &model.Feed{
HashID: "123",
ItemID: "xyz",
Provider: api.ProviderVimeo,
LinkType: api.LinkTypeChannel,
PageSize: 50,
Quality: api.QualityHigh,
Format: api.FormatVideo,
}
func TestDynamo(t *testing.T) {
runStorageTests(t, func(t *testing.T) storage {
return createDynamo(t)
})
}
func TestDynamo_UpdateFeed(t *testing.T) {
client := createDynamo(t)
defer client.Close()
err := client.SaveFeed(feed)
assert.NoError(t, err)
_, err = client.GetFeed(feed.HashID)
assert.NoError(t, err, "can't read feed after save")
err = client.UpdateFeed(feed)
assert.NoError(t, err)
_, err = client.GetFeed(feed.HashID)
assert.NoError(t, err, "can't read feed after update")
}
// docker run -it --rm -p 8000:8000 amazon/dynamodb-local
// noinspection ALL
func createDynamo(t *testing.T) Dynamo {
d, err := NewDynamo(&aws.Config{
Region: aws.String("us-east-1"),
Endpoint: aws.String("http://localhost:8000/"),
})
require.NoError(t, err)
d.dynamo.DeleteTable(&dynamodb.DeleteTableInput{TableName: d.PledgesTableName})
d.dynamo.DeleteTable(&dynamodb.DeleteTableInput{TableName: d.FeedsTableName})
// Create Pledges table
_, err = d.dynamo.CreateTable(&dynamodb.CreateTableInput{
TableName: d.PledgesTableName,
AttributeDefinitions: []*dynamodb.AttributeDefinition{
{
AttributeName: aws.String(pledgesPrimaryKey),
AttributeType: aws.String("N"),
},
},
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String(pledgesPrimaryKey),
KeyType: aws.String("HASH"),
},
},
ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(1),
WriteCapacityUnits: aws.Int64(1),
},
})
require.NoError(t, err)
// Create Feeds table
_, err = d.dynamo.CreateTable(&dynamodb.CreateTableInput{
TableName: d.FeedsTableName,
AttributeDefinitions: []*dynamodb.AttributeDefinition{
{
AttributeName: aws.String(feedsPrimaryKey),
AttributeType: aws.String("S"),
},
{
AttributeName: aws.String("UserID"),
AttributeType: aws.String("S"),
},
{
AttributeName: aws.String("CreatedAt"),
AttributeType: aws.String("N"),
},
},
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String(feedsPrimaryKey),
KeyType: aws.String("HASH"),
},
},
GlobalSecondaryIndexes: []*dynamodb.GlobalSecondaryIndex{
{
IndexName: feedDowngradeIndexName,
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String("UserID"),
KeyType: aws.String("HASH"),
},
{
AttributeName: aws.String("CreatedAt"),
KeyType: aws.String("RANGE"),
},
},
Projection: &dynamodb.Projection{
ProjectionType: aws.String("KEYS_ONLY"),
},
ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(1),
WriteCapacityUnits: aws.Int64(1),
},
},
},
ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(1),
WriteCapacityUnits: aws.Int64(1),
},
})
require.NoError(t, err)
err = d.dynamo.WaitUntilTableExists(&dynamodb.DescribeTableInput{TableName: d.PledgesTableName})
require.NoError(t, err)
err = d.dynamo.WaitUntilTableExists(&dynamodb.DescribeTableInput{TableName: d.FeedsTableName})
require.NoError(t, err)
_, err = d.dynamo.UpdateTimeToLive(&dynamodb.UpdateTimeToLiveInput{
TableName: d.FeedsTableName,
TimeToLiveSpecification: &dynamodb.TimeToLiveSpecification{
AttributeName: feedTimeToLiveField,
Enabled: aws.Bool(true),
},
})
require.NoError(t, err)
return d
}