diff --git a/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs b/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs index cb2100d1..01beb7cf 100644 --- a/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs +++ b/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs @@ -33,7 +33,6 @@ public static class ResourceTypeConstants public const string Tag = "Microsoft.ApiManagement/service/tags"; public const string Gateway = "Microsoft.ApiManagement/service/gateways"; public const string GatewayApi = "Microsoft.ApiManagement/service/gateways/apis"; - public const string ArmDeployments = "Microsoft.Resources/deployments"; } } \ No newline at end of file diff --git a/src/ArmTemplates/Extractor/EntityExtractors/ApiSchemaExtractor.cs b/src/ArmTemplates/Extractor/EntityExtractors/ApiSchemaExtractor.cs index 2c139a07..8b6a478a 100644 --- a/src/ArmTemplates/Extractor/EntityExtractors/ApiSchemaExtractor.cs +++ b/src/ArmTemplates/Extractor/EntityExtractors/ApiSchemaExtractor.cs @@ -66,6 +66,7 @@ string GetSchemaValueBasedOnContentType(ApiSchemaProperties schemaTemplateProper { "application/vnd.ms-azure-apim.swagger.definitions+json" => schemaTemplateProperties?.Document?.Definitions?.Serialize(), "application/vnd.ms-azure-apim.xsd+xml" => schemaTemplateProperties?.Document?.Definitions?.Serialize(), + "application/vnd.ms-azure-apim.graphql.schema" => schemaTemplateProperties?.Document?.Value?.ToString(), _ => string.Empty }; diff --git a/tests/ArmTemplates.Tests/Extractor/Scenarios/ApiExtractorTests.cs b/tests/ArmTemplates.Tests/Extractor/Scenarios/ApiExtractorTests.cs index d3bae30a..0e88a1b1 100644 --- a/tests/ArmTemplates.Tests/Extractor/Scenarios/ApiExtractorTests.cs +++ b/tests/ArmTemplates.Tests/Extractor/Scenarios/ApiExtractorTests.cs @@ -10,6 +10,7 @@ using FluentAssertions; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Commands.Executors; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.FileHandlers; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; @@ -155,5 +156,77 @@ public async Task GenerateApiTemplates_ProperlyLaysTheInformation() apiTemplate.TypedResources.ApiOperationsPolicies.Count().Should().Be(2); apiTemplate.TypedResources.ApiOperations.All(x => x.Properties is not null).Should().BeTrue(); } + + [Fact] + public async Task GenerateGraphQLApiTemplates() + { + FileReader fileReader = new FileReader(); + string fileLocation = Path.Combine("Resources", "Schemas", "schema.gql"); + + Task fileReadingTask = fileReader.RetrieveFileContentsAsync(fileLocation); + + // arrange + var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateGraphQLApiTemplates)); + + var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration( + sourceApimName: string.Empty, + destinationApimName: string.Empty, + resourceGroup: string.Empty, + fileFolder: string.Empty, + apiName: string.Empty); + var extractorParameters = new ExtractorParameters(extractorConfig); + + // mocked clients + var mockedApiClient = MockApisClient.GetMockedApiClientWithDefaultValues(); + var mockedProductClient = MockProductsClient.GetMockedApiClientWithDefaultValues(); + var mockedApiSchemaClient = MockApiSchemaClient.GetMockedApiClientWithGraphQLSchemaValues(); + var mockedPolicyClient = MockPolicyClient.GetMockedApiClientWithDefaultValues(); + var mockedTagClient = MockTagClient.GetMockedApiClientWithDefaultValues(); + var mockedApiOperationClient = MockApiOperationClient.GetMockedApiClientWithDefaultValues(); + var mockedDiagnosticClient = MockDiagnosticClient.GetMockedClientWithApiDependentValues(); + + // mocked extractors + var mockedDiagnosticExtractor = new DiagnosticExtractor(this.GetTestLogger(), mockedDiagnosticClient); + var mockedApiSchemaExtractor = new ApiSchemaExtractor(this.GetTestLogger(), mockedApiSchemaClient); + var mockedPolicyExtractor = new PolicyExtractor(this.GetTestLogger(), mockedPolicyClient, new TemplateBuilder()); + var mockedProductApisExtractor = new ProductApisExtractor(this.GetTestLogger(), mockedProductClient, mockedApiClient, new TemplateBuilder()); + var mockedTagExtractor = new TagExtractor(this.GetTestLogger(), mockedTagClient, new TemplateBuilder()); + var mockedApiOperationExtractor = new ApiOperationExtractor(this.GetTestLogger(), mockedApiOperationClient); + + var apiExtractor = new ApiExtractor( + this.GetTestLogger(), + new TemplateBuilder(), + mockedApiClient, + mockedDiagnosticExtractor, + mockedApiSchemaExtractor, + mockedPolicyExtractor, + mockedProductApisExtractor, + mockedTagExtractor, + mockedApiOperationExtractor); + + var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor( + this.GetTestLogger(), + apiExtractor: apiExtractor); + extractorExecutor.SetExtractorParameters(extractorParameters); + + // act + var apiTemplate = await extractorExecutor.GenerateApiTemplateAsync( + singleApiName: It.IsAny(), + multipleApiNames: It.IsAny>(), + currentTestDirectory); + + // assert + File.Exists(Path.Combine(currentTestDirectory, apiTemplate.TypedResources.FileName)).Should().BeTrue(); + + //schema name + string schemaContentType = "application/vnd.ms-azure-apim.graphql.schema"; + + // api schemas + apiTemplate.TypedResources.ApiSchemas.Count().Should().Be(2); + apiTemplate.TypedResources.ApiSchemas.All(x => x.Type == ResourceTypeConstants.APISchema).Should().BeTrue(); + apiTemplate.TypedResources.ApiSchemas.All(x => x.Properties is not null).Should().BeTrue(); + apiTemplate.TypedResources.ApiSchemas.All(x => x.Properties.Document.Value.ToString().Equals(fileReadingTask.Result.ToString())).Should().BeTrue(); + apiTemplate.TypedResources.ApiSchemas.All(x => x.Properties.ContentType.Equals(schemaContentType)).Should().BeTrue(); + } } } diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs index 242b0509..473843fb 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs @@ -4,7 +4,10 @@ // -------------------------------------------------------------------------- using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.FileHandlers; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ApiSchemas; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; using Moq; @@ -41,5 +44,37 @@ public static IApiSchemaClient GetMockedApiClientWithDefaultValues() return mockApiSchemaClient.Object; } + + public static IApiSchemaClient GetMockedApiClientWithGraphQLSchemaValues() + { + // arrange + FileReader fileReader = new FileReader(); + string fileLocation = Path.Combine("Resources", "Schemas", "schema.gql"); + + Task fileReadingTask = fileReader.RetrieveFileContentsAsync(fileLocation); + + var mockApiSchemaClient = new Mock(MockBehavior.Strict); + + mockApiSchemaClient + .Setup(x => x.GetApiSchemasAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List + { + new ApiSchemaTemplateResource + { + Name = ApiSchemaName, + Properties = new ApiSchemaProperties + { + ContentType = "application/vnd.ms-azure-apim.graphql.schema", + Document = new ApiSchemaDocument + { + Components = ApiSchemaDocComponents, + Value = fileReadingTask.Result.ToString() + } + } + } + }); + + return mockApiSchemaClient.Object; + } } } diff --git a/tests/ArmTemplates.Tests/Resources/Schemas/schema.gql b/tests/ArmTemplates.Tests/Resources/Schemas/schema.gql new file mode 100644 index 00000000..ebcb20cd --- /dev/null +++ b/tests/ArmTemplates.Tests/Resources/Schemas/schema.gql @@ -0,0 +1,9 @@ +type Book { + title: String + author: Author +} + +type Author { + name: String + books: [Book] +} \ No newline at end of file