1package entities
2
3import (
4	"context"
5	"fmt"
6	"testing"
7
8	"github.com/Azure/azure-sdk-for-go/profiles/latest/storage/mgmt/storage"
9	"github.com/tombuildsstuff/giovanni/storage/2019-12-12/table/tables"
10	"github.com/tombuildsstuff/giovanni/storage/internal/auth"
11	"github.com/tombuildsstuff/giovanni/testhelpers"
12)
13
14var _ StorageTableEntity = Client{}
15
16func TestEntitiesLifecycle(t *testing.T) {
17	client, err := testhelpers.Build(t)
18	if err != nil {
19		t.Fatal(err)
20	}
21	ctx := context.TODO()
22	resourceGroup := fmt.Sprintf("acctestrg-%d", testhelpers.RandomInt())
23	accountName := fmt.Sprintf("acctestsa%s", testhelpers.RandomString())
24	tableName := fmt.Sprintf("table%d", testhelpers.RandomInt())
25
26	testData, err := client.BuildTestResources(ctx, resourceGroup, accountName, storage.Storage)
27	if err != nil {
28		t.Fatal(err)
29	}
30	defer client.DestroyTestResources(ctx, resourceGroup, accountName)
31
32	storageAuth := auth.NewSharedKeyLiteTableAuthorizer(accountName, testData.StorageAccountKey)
33	tablesClient := tables.NewWithEnvironment(client.Environment)
34	tablesClient.Client = client.PrepareWithAuthorizer(tablesClient.Client, storageAuth)
35
36	t.Logf("[DEBUG] Creating Table..")
37	if _, err := tablesClient.Create(ctx, accountName, tableName); err != nil {
38		t.Fatalf("Error creating Table %q: %s", tableName, err)
39	}
40	defer tablesClient.Delete(ctx, accountName, tableName)
41
42	entitiesClient := NewWithEnvironment(client.Environment)
43	entitiesClient.Client = client.PrepareWithAuthorizer(entitiesClient.Client, storageAuth)
44
45	partitionKey := "hello"
46	rowKey := "there"
47
48	t.Logf("[DEBUG] Inserting..")
49	insertInput := InsertEntityInput{
50		MetaDataLevel: NoMetaData,
51		PartitionKey:  partitionKey,
52		RowKey:        rowKey,
53		Entity: map[string]interface{}{
54			"hello": "world",
55		},
56	}
57	if _, err := entitiesClient.Insert(ctx, accountName, tableName, insertInput); err != nil {
58		t.Logf("Error retrieving: %s", err)
59	}
60
61	t.Logf("[DEBUG] Insert or Merging..")
62	insertOrMergeInput := InsertOrMergeEntityInput{
63		PartitionKey: partitionKey,
64		RowKey:       rowKey,
65		Entity: map[string]interface{}{
66			"hello": "ther88e",
67		},
68	}
69	if _, err := entitiesClient.InsertOrMerge(ctx, accountName, tableName, insertOrMergeInput); err != nil {
70		t.Logf("Error insert/merging: %s", err)
71	}
72
73	t.Logf("[DEBUG] Insert or Replacing..")
74	insertOrReplaceInput := InsertOrReplaceEntityInput{
75		PartitionKey: partitionKey,
76		RowKey:       rowKey,
77		Entity: map[string]interface{}{
78			"hello": "pandas",
79		},
80	}
81	if _, err := entitiesClient.InsertOrReplace(ctx, accountName, tableName, insertOrReplaceInput); err != nil {
82		t.Logf("Error inserting/replacing: %s", err)
83	}
84
85	t.Logf("[DEBUG] Querying..")
86	queryInput := QueryEntitiesInput{
87		MetaDataLevel: NoMetaData,
88	}
89	results, err := entitiesClient.Query(ctx, accountName, tableName, queryInput)
90	if err != nil {
91		t.Logf("Error querying: %s", err)
92	}
93
94	if len(results.Entities) != 1 {
95		t.Fatalf("Expected 1 item but got %d", len(results.Entities))
96	}
97
98	for _, v := range results.Entities {
99		thisPartitionKey := v["PartitionKey"].(string)
100		thisRowKey := v["RowKey"].(string)
101		if partitionKey != thisPartitionKey {
102			t.Fatalf("Expected Partition Key to be %q but got %q", partitionKey, thisPartitionKey)
103		}
104		if rowKey != thisRowKey {
105			t.Fatalf("Expected Partition Key to be %q but got %q", rowKey, thisRowKey)
106		}
107	}
108
109	t.Logf("[DEBUG] Retrieving..")
110	getInput := GetEntityInput{
111		MetaDataLevel: MinimalMetaData,
112		PartitionKey:  partitionKey,
113		RowKey:        rowKey,
114	}
115	getResults, err := entitiesClient.Get(ctx, accountName, tableName, getInput)
116	if err != nil {
117		t.Logf("Error querying: %s", err)
118	}
119
120	partitionKey2 := getResults.Entity["PartitionKey"].(string)
121	rowKey2 := getResults.Entity["RowKey"].(string)
122	if partitionKey2 != partitionKey {
123		t.Fatalf("Expected Partition Key to be %q but got %q", partitionKey, partitionKey2)
124	}
125	if rowKey2 != rowKey {
126		t.Fatalf("Expected Row Key to be %q but got %q", rowKey, rowKey2)
127	}
128
129	t.Logf("[DEBUG] Deleting..")
130	deleteInput := DeleteEntityInput{
131		PartitionKey: partitionKey,
132		RowKey:       rowKey,
133	}
134	if _, err := entitiesClient.Delete(ctx, accountName, tableName, deleteInput); err != nil {
135		t.Logf("Error deleting: %s", err)
136	}
137}
138