Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Add unit tests for Graph Query Builder #1729

Merged
merged 1 commit into from
Aug 17, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 228 additions & 0 deletions src/Promitor.Tests.Unit/Builders/Queries/GraphQueryBuilderTests.cs
Original file line number Diff line number Diff line change
@@ -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<string> subscriptionIds = new List<string>
{
"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<string> resourceGroups = new List<string>
{
"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<string> regions = new List<string>
{
"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<string, string> tags = new Dictionary<string, string>
{
["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());
}
}
}