public async Task RoundTripData()
        {
            ViziVault vault = new ViziVault(new Uri(baseUrl)).WithApiKey(apiKey).WithDecryptionKey(decryptionKey).WithEncryptionKey(encryptionKey);

            // Create two attributes
            AttributeDefinition attributeDef1 = new AttributeDefinition("TestAttribute1");
            AttributeDefinition attributeDef2 = new AttributeDefinition("TestAttribute2")
            {
                Repeatable = true
            };

            await vault.StoreAttributeDefinitionAsync(attributeDef1);

            await vault.StoreAttributeDefinitionAsync(attributeDef2);

            // Add values of both attributes
            User           sentUser   = new User("exampleUser");
            AttributeValue attribute1 = new AttributeValue(attributeDef1.Name)
            {
                Value = "exampleUser's first name"
            };

            sentUser.AddAttribute(attribute1);
            sentUser.AddAttribute(attributeDef2.Name, "exampleUser's last name");
            sentUser.AddAttribute(attributeDef2.Name, "exampleUser's other last name");
            try {
                await vault.SaveAsync(sentUser);

                User receivedUser = await vault.FindByUserAsync("exampleUser");

                Assert.Equal(attribute1.GetValueAs <string>(), receivedUser.GetAttribute(attributeDef1.Name).GetValueAs <string>());
                Assert.Equal(3, receivedUser.Attributes.Count());
                Assert.Equal(2, receivedUser.GetAttributes(attributeDef2.Name).Count);

                // Remove one attribute
                receivedUser.ClearAttribute(attributeDef1.Name);
                await vault.SaveAsync(receivedUser);

                User receivedUserAfterDeletion = await vault.FindByUserAsync("exampleUser");

                Assert.Null(receivedUserAfterDeletion.GetAttribute(attributeDef1.Name));
            } finally {
                await vault.PurgeAsync(sentUser.Id);
            }
        }
        public async Task TestGetAttributeByDatapointId()
        {
            ViziVault vault = new ViziVault(new Uri(baseUrl)).WithApiKey(apiKey).WithDecryptionKey(decryptionKey).WithEncryptionKey(encryptionKey);

            AttributeDefinition attributeDef = new AttributeDefinition("TestAttribute1");
            await vault.StoreAttributeDefinitionAsync(attributeDef);

            User sentUser = new User("exampleUser");

            sentUser.AddAttribute(attributeDef.Name, "some data");

            try {
                await vault.SaveAsync(sentUser);

                User receivedUser = await vault.FindByUserAsync(sentUser.Id);

                AttributeValue first  = receivedUser.GetAttribute(attributeDef.Name);
                AttributeValue second = await vault.GetDataPointAsync(receivedUser.GetAttribute(attributeDef.Name).DataPointId);

                Assert.Equal(first.GetValueAs <string>(), second.GetValueAs <string>());
            } finally {
                await vault.PurgeAsync(sentUser.Id);
            }
        }
        public async Task TestTags()
        {
            ViziVault vault = new ViziVault(new Uri(baseUrl)).WithApiKey(apiKey).WithDecryptionKey(decryptionKey).WithEncryptionKey(encryptionKey);

            AttributeDefinition attributeDef1 = new AttributeDefinition("TestAttribute1")
            {
                Tags = new List <string> {
                    "tag1"
                }
            };
            await vault.StoreAttributeDefinitionAsync(attributeDef1);

            User sentUser = new User("exampleUser")
            {
                Tags = new List <string> {
                    "tag2"
                }
            };

            try {
                AttributeValue attribute1 = new AttributeValue(attributeDef1.Name)
                {
                    Value = "exampleUser's first name",
                    Tags  = new List <string> {
                        "tag3"
                    },
                };
                sentUser.AddAttribute(attribute1);
                await vault.SaveAsync(sentUser);

                AttributeValue receivedAttribute = (await vault.FindByUserAsync("exampleUser")).GetAttribute(attributeDef1.Name);
                Assert.Collection(receivedAttribute.Tags,
                                  (tag) => Assert.Equal("tag1", tag),
                                  (tag) => Assert.Equal("tag2", tag),
                                  (tag) => Assert.Equal("tag3", tag)
                                  );

                Tag tag1 = await vault.GetTagAsync("tag1");

                await vault.StoreTagAsync(tag1);

                Tag tag4 = new Tag("tag4");
                await vault.StoreTagAsync(tag4);

                List <Tag> allTags = await vault.GetTagsAsync();

                Assert.Contains(allTags, (tag) => tag.Name.Equals("tag1"));
                Assert.Contains(allTags, (tag) => tag.Name.Equals("tag2"));
                Assert.Contains(allTags, (tag) => tag.Name.Equals("tag3"));
                Assert.Contains(allTags, (tag) => tag.Name.Equals("tag4"));

                await vault.DeleteTagAsync("tag1");

                await vault.DeleteTagAsync("tag2");

                await vault.DeleteTagAsync("tag3");

                await vault.DeleteTagAsync("tag4");

                //Assert.Throws<VaultResponseException>(() => vault.GetTagAsync("tag5").Result);
                Assert.False(await vault.DeleteTagAsync("tag5"));

                allTags = await vault.GetTagsAsync();

                Assert.DoesNotContain(allTags, (tag) => tag.Name.Equals("tag1"));
                Assert.DoesNotContain(allTags, (tag) => tag.Name.Equals("tag2"));
                Assert.DoesNotContain(allTags, (tag) => tag.Name.Equals("tag3"));
                Assert.DoesNotContain(allTags, (tag) => tag.Name.Equals("tag4"));
                Assert.DoesNotContain(allTags, (tag) => tag.Name.Equals("tag5"));
            } finally {
                await vault.PurgeAsync(sentUser.Id);
            }
        }