From 1920fbefc2aaf565a8b0a822ba278f22dd5f8539 Mon Sep 17 00:00:00 2001 From: mohaemen Date: Tue, 17 Aug 2021 08:41:44 +0100 Subject: [PATCH] fix : Add unit tests for Graph Query Builder --- .../Queries/GraphQueryBuilderTests.cs | 228 ++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 src/Promitor.Tests.Unit/Builders/Queries/GraphQueryBuilderTests.cs diff --git a/src/Promitor.Tests.Unit/Builders/Queries/GraphQueryBuilderTests.cs b/src/Promitor.Tests.Unit/Builders/Queries/GraphQueryBuilderTests.cs new file mode 100644 index 000000000..04ecca9bd --- /dev/null +++ b/src/Promitor.Tests.Unit/Builders/Queries/GraphQueryBuilderTests.cs @@ -0,0 +1,228 @@ +using System; +using System.Collections.Generic; +using Promitor.Agents.ResourceDiscovery.Graph.Query; +using Xunit; + +namespace Promitor.Tests.Unit.Builders.Queries +{ + public class GraphQueryBuilderTests + { + private const string ResourceType = "resource type"; + + [Fact] + public void ForResourceType_SingleResourceType_ReturnsValidGraphQueryBuilder() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + "| where type =~ 'resource type'"; + + // Act + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void ForResourceType_TwoResourceTypes_ReturnsValidGraphQueryBuilder() + { + // Arrange + const string ResourceType1 = "resource type 1"; + const string ResourceType2 = "resource type 2"; + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type 1'{Environment.NewLine}" + + " or type =~ 'resource type 2'"; + + // Act + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(new[] { ResourceType1, ResourceType2 }); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Theory] + [InlineData(Operator.Contains, "contains")] + [InlineData(Operator.DoesNotContain, "!contains")] + [InlineData(Operator.DoesNotEquals, "!=")] + [InlineData(Operator.Equals, "==")] + public void Where_AppendCorrectQuery(Operator @operator, string queryOperatopr) + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| where field " + queryOperatopr + " 'value'"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + // Act + graphQueryBuilder.Where("field", @operator, "value"); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void WithSubscriptionsWithIds_AppendCorrectQuery() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| where subscriptionId =~ 'subscription Id 1' or subscriptionId =~ 'subscription Id 2' or subscriptionId =~ 'subscription Id 3'"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + List subscriptionIds = new List + { + "subscription Id 1", + "subscription Id 2", + "subscription Id 3" + }; + + // Act + graphQueryBuilder.WithSubscriptionsWithIds(subscriptionIds); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void WithResourceGroupsWithName_AppendCorrectQuery() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| where resourceGroup =~ 'resourceGroup 1' or resourceGroup =~ 'resourceGroup 2' or resourceGroup =~ 'resourceGroup 3'"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + List resourceGroups = new List + { + "resourceGroup 1", + "resourceGroup 2", + "resourceGroup 3" + }; + + // Act + graphQueryBuilder.WithResourceGroupsWithName(resourceGroups); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void WithinRegions_AppendCorrectQuery() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| where location =~ 'region 1' or location =~ 'region 2' or location =~ 'region 3'"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + List regions = new List + { + "region 1", + "region 2", + "region 3" + }; + + // Act + graphQueryBuilder.WithinRegions(regions); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void WithinTags_AppendCorrectQuery() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| where tags['tag key 1'] == 'tag value 1' or tags['tag key 2'] == 'tag value 2' or tags['tag key 3'] == 'tag value 3'"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + Dictionary tags = new Dictionary + { + ["tag key 1"] = "tag value 1", + ["tag key 2"] = "tag value 2", + ["tag key 3"] = "tag value 3", + }; + + // Act + graphQueryBuilder.WithTags(tags); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void Project_SingleField_ReturnsValidGraphQueryBuilder() + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| project field"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + // Act + graphQueryBuilder.Project("field"); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Fact] + public void Project_TwoFields_ReturnsValidGraphQueryBuilder() + { + // Arrange + const string Field1 = "field 1"; + const string Field2 = "field 2"; + + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| project field 1, field 2"; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + // Act + graphQueryBuilder.Project(new[] { Field1, Field2 }); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + + [Theory] + [InlineData(1)] + [InlineData(10)] + [InlineData(17)] + [InlineData(58)] + public void LimitTo_AppendCorrectQuery(int limit) + { + // Arrange + string ExpectedQuery = + $"Resources{Environment.NewLine}" + + $"| where type =~ 'resource type'{Environment.NewLine}" + + "| limit " + limit; + + GraphQueryBuilder graphQueryBuilder = GraphQueryBuilder.ForResourceType(ResourceType); + + // Act + graphQueryBuilder.LimitTo(limit); + + // Assert + Assert.Equal(ExpectedQuery, graphQueryBuilder.Build()); + } + } +}