1//go:build example
2// +build example
3
4// Unit tests for package unitTest.
5package unitTest
6
7import (
8	"errors"
9	"testing"
10
11	"github.com/aws/aws-sdk-go/aws"
12	"github.com/aws/aws-sdk-go/service/dynamodb"
13	"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbiface"
14)
15
16// A fakeDynamoDB instance. During testing, instatiate ItemGetter, then simply
17// assign an instance of fakeDynamoDB to it.
18type fakeDynamoDB struct {
19	dynamodbiface.DynamoDBAPI
20	payload map[string]string // Store expected return values
21	err     error
22}
23
24// Mock GetItem such that the output returned carries values identical to input.
25func (fd *fakeDynamoDB) GetItem(input *dynamodb.GetItemInput) (*dynamodb.GetItemOutput, error) {
26	output := new(dynamodb.GetItemOutput)
27	output.Item = make(map[string]*dynamodb.AttributeValue)
28	for key, value := range fd.payload {
29		output.Item[key] = &dynamodb.AttributeValue{
30			S: aws.String(value),
31		}
32	}
33	return output, fd.err
34}
35
36func TestItemGetterGet(t *testing.T) {
37	expectedKey := "expected key"
38	expectedValue := "expected value"
39	getter := new(ItemGetter)
40	getter.DynamoDB = &fakeDynamoDB{
41		payload: map[string]string{"id": expectedKey, "value": expectedValue},
42	}
43	if actualValue := getter.Get(expectedKey); actualValue != expectedValue {
44		t.Errorf("Expected %q but got %q", expectedValue, actualValue)
45	}
46}
47
48// When DynamoDB.GetItem returns a non-nil error, expect an empty string.
49func TestItemGetterGetFail(t *testing.T) {
50	expectedKey := "expected key"
51	expectedValue := "expected value"
52	getter := new(ItemGetter)
53	getter.DynamoDB = &fakeDynamoDB{
54		payload: map[string]string{"id": expectedKey, "value": expectedValue},
55		err:     errors.New("any error"),
56	}
57	if actualValue := getter.Get(expectedKey); len(actualValue) > 0 {
58		t.Errorf("Expected %q but got %q", expectedValue, actualValue)
59	}
60}
61