Skip to content

Commit 46dd19e

Browse files
authored
Avoid serializing and deserializing template specs (#6833)
1 parent 2d37ef2 commit 46dd19e

File tree

11 files changed

+61
-322
lines changed

11 files changed

+61
-322
lines changed

src/Bicep.Core.Samples/DataSetsExtensions.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using Bicep.Core.Analyzers.Linter;
1111
using Bicep.Core.Configuration;
1212
using Bicep.Core.FileSystem;
13-
using Bicep.Core.Json;
1413
using Bicep.Core.Modules;
1514
using Bicep.Core.Registry;
1615
using Bicep.Core.Semantics;
@@ -112,13 +111,10 @@ public static ITemplateSpecRepositoryFactory CreateMockTemplateSpecRepositoryFac
112111
throw new InvalidOperationException($"Module '{moduleName}' has an invalid target reference '{templateSpecInfo.Metadata.Target}'. Specify a reference to a template spec.");
113112
}
114113

115-
var templateSpecElement = JsonElementFactory.CreateElement(templateSpecInfo.ModuleSource);
116-
var templateSpecEntity = TemplateSpecEntity.FromJsonElement(templateSpecElement);
117-
118114
repositoryMocksBySubscription.TryAdd(reference.SubscriptionId, StrictMock.Of<ITemplateSpecRepository>());
119115
repositoryMocksBySubscription[reference.SubscriptionId]
120116
.Setup(x => x.FindTemplateSpecByIdAsync(reference.TemplateSpecResourceId, It.IsAny<CancellationToken>()))
121-
.ReturnsAsync(templateSpecEntity);
117+
.ReturnsAsync(new TemplateSpecEntity(templateSpecInfo.ModuleSource));
122118
}
123119

124120
var repositoryFactoryMock = StrictMock.Of<ITemplateSpecRepositoryFactory>();

src/Bicep.Core.UnitTests/Diagnostics/LinterRuleTests/NoHardcodedEnvironmentUrlsRuleTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT License.
33

44
using System.Linq;
5-
using Azure.Deployments.Core.Extensions;
65
using Bicep.Core.Analyzers.Linter.Rules;
76
using Microsoft.VisualStudio.TestTools.UnitTesting;
87

src/Bicep.Core.UnitTests/Registry/TemplateSpecRepositoryTests.cs

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Text.Json;
56
using System.Threading;
67
using System.Threading.Tasks;
78
using Azure;
8-
using Azure.Core;
99
using Azure.ResourceManager;
1010
using Azure.ResourceManager.Resources;
1111
using Bicep.Core.Registry;
@@ -25,14 +25,14 @@ public class TemplateSpecRepositoryTests
2525
[TestMethod]
2626
public async Task FindTemplateSpecByIdAsync_TemplateSpecNotFound_ThrowsTemplateSpecException()
2727
{
28-
var templateSpecVersionMock = CreateMockTemplateSpecVersion(templateSpecVersionMock => templateSpecVersionMock
29-
.Setup(x => x.GetAsync(It.IsAny<CancellationToken>()))
30-
.ThrowsAsync(new RequestFailedException(404, "Not found.")));
28+
var templateSpecVersionResourceMock = CreateMockTemplateSpecVersionResource(
29+
mock => mock
30+
.Setup(x => x.GetAsync(It.IsAny<CancellationToken>()))
31+
.ThrowsAsync(new RequestFailedException(404, "Not found.")));
3132

32-
var clientMock = CreateMockClient();
33-
var templateSpecVersionProviderMock = CreateMockTemplateSpecVersionProvider(clientMock, templateSpecVersionMock);
33+
var clientMock = CreateMockClient(templateSpecVersionResourceMock);
3434

35-
var repository = new TemplateSpecRepository(clientMock, templateSpecVersionProviderMock);
35+
var repository = new TemplateSpecRepository(clientMock);
3636

3737
await Invoking(async () => await repository.FindTemplateSpecByIdAsync(TestTemplateSpecId))
3838
.Should()
@@ -43,14 +43,13 @@ await Invoking(async () => await repository.FindTemplateSpecByIdAsync(TestTempla
4343
[TestMethod]
4444
public async Task FindTemplateSpecByIdAsync_GotUnexpectedRequestFailedException_ConvertsToTemplateSpecException()
4545
{
46-
var templateSpecVersionMock = CreateMockTemplateSpecVersion(templateSpecVersionMock => templateSpecVersionMock
47-
.Setup(x => x.GetAsync(It.IsAny<CancellationToken>()))
48-
.ThrowsAsync(new RequestFailedException("Unexpected error.")));
46+
var templateSpecVersionResourceMock = CreateMockTemplateSpecVersionResource(mock =>
47+
mock.Setup(x => x.GetAsync(It.IsAny<CancellationToken>()))
48+
.ThrowsAsync(new RequestFailedException("Unexpected error.")));
4949

50-
var clientMock = CreateMockClient();
51-
var templateSpecVersionProviderMock = CreateMockTemplateSpecVersionProvider(clientMock, templateSpecVersionMock);
50+
var clientMock = CreateMockClient(templateSpecVersionResourceMock);
5251

53-
var repository = new TemplateSpecRepository(clientMock, templateSpecVersionProviderMock);
52+
var repository = new TemplateSpecRepository(clientMock);
5453

5554
await Invoking(async () => await repository.FindTemplateSpecByIdAsync(TestTemplateSpecId))
5655
.Should()
@@ -61,42 +60,42 @@ await Invoking(async () => await repository.FindTemplateSpecByIdAsync(TestTempla
6160
[TestMethod]
6261
public async Task FindTemplateSpecByIdAsync_TemlateSpecFound_ReturnsTemplateSpec()
6362
{
64-
var data = new TemplateSpecVersionData("westus")
65-
{
66-
MainTemplate = new BinaryData("{}")
67-
};
68-
69-
var templateSpecVersionMock = CreateMockTemplateSpecVersion(
70-
templateSpecVersionMock => templateSpecVersionMock
71-
.SetupGet(x => x.Data)
72-
.Returns(data),
73-
templateSpecVersionMock => templateSpecVersionMock
63+
var data = new TemplateSpecVersionData("westus");
64+
var content = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });
65+
66+
var templateSpecVersionResourceMock = CreateMockTemplateSpecVersionResource(
67+
mock => mock
7468
.Setup(x => x.GetAsync(It.IsAny<CancellationToken>()))
75-
.ReturnsAsync(CreateMockResponse(templateSpecVersionMock.Object)));
69+
.ReturnsAsync(CreateMockResponse(content)));
7670

77-
var clientMock = CreateMockClient();
78-
var templateSpecVersionProviderMock = CreateMockTemplateSpecVersionProvider(clientMock, templateSpecVersionMock);
71+
var clientMock = CreateMockClient(templateSpecVersionResourceMock);
7972

80-
var repository = new TemplateSpecRepository(clientMock, templateSpecVersionProviderMock);
73+
var repository = new TemplateSpecRepository(clientMock);
8174

8275
var templateSpec = await repository.FindTemplateSpecByIdAsync(TestTemplateSpecId);
8376

84-
templateSpec.MainTemplate.GetRawText().Should().Be("{}");
77+
templateSpec.Content.ReplaceLineEndings().Should().Be(@"{
78+
""Location"": {
79+
""Name"": ""westus"",
80+
""DisplayName"": ""West US""
81+
},
82+
""Tags"": {},
83+
""Description"": null,
84+
""LinkedTemplates"": [],
85+
""Metadata"": null,
86+
""MainTemplate"": null,
87+
""UiFormDefinition"": null,
88+
""Id"": null,
89+
""Name"": null,
90+
""ResourceType"": {
91+
""Namespace"": null,
92+
""Type"": null
93+
},
94+
""SystemData"": null
95+
}".ReplaceLineEndings());
8596
}
8697

87-
private ITemplateSpecVersionProvider CreateMockTemplateSpecVersionProvider(
88-
ArmClient armClient,
89-
TemplateSpecVersionResource templateSpecVersion)
90-
{
91-
var templateSpecVersionProvider = StrictMock.Of<ITemplateSpecVersionProvider>();
92-
templateSpecVersionProvider
93-
.Setup(x => x.GetTemplateSpecVersion(armClient, It.IsAny<ResourceIdentifier>()))
94-
.Returns(templateSpecVersion);
95-
96-
return templateSpecVersionProvider.Object;
97-
}
98-
99-
private static TemplateSpecVersionResource CreateMockTemplateSpecVersion(params Action<Mock<TemplateSpecVersionResource>>[] setUpTemplateSpecVersionMockActions)
98+
private static TemplateSpecVersionResource CreateMockTemplateSpecVersionResource(params Action<Mock<TemplateSpecVersionResource>>[] setUpTemplateSpecVersionMockActions)
10099
{
101100
var templateSpecVersionMock = StrictMock.Of<TemplateSpecVersionResource>();
102101

@@ -108,18 +107,23 @@ private static TemplateSpecVersionResource CreateMockTemplateSpecVersion(params
108107
return templateSpecVersionMock.Object;
109108
}
110109

111-
private static ArmClient CreateMockClient()
110+
private static ArmClient CreateMockClient(TemplateSpecVersionResource resource)
112111
{
113112
var clientMock = StrictMock.Of<ArmClient>();
114113

114+
clientMock.Setup(x => x.GetResourceClient(It.IsAny<Func<TemplateSpecVersionResource>>()))
115+
.Returns(resource);
116+
115117
return clientMock.Object;
116118
}
117119

118-
private static Response<T> CreateMockResponse<T>(T value)
120+
private static Response<TemplateSpecVersionResource> CreateMockResponse(string content)
119121
{
120-
var responseMock = StrictMock.Of<Response<T>>();
121-
responseMock.SetupGet(m => m.Value).Returns(value);
122-
responseMock.Setup(m => m.GetRawResponse()).Returns(StrictMock.Of<Response>().Object);
122+
var rawResponseMock = StrictMock.Of<Response>();
123+
rawResponseMock.SetupGet(x => x.Content).Returns(BinaryData.FromString(content));
124+
125+
var responseMock = StrictMock.Of<Response<TemplateSpecVersionResource>>();
126+
responseMock.Setup(m => m.GetRawResponse()).Returns(rawResponseMock.Object);
123127

124128
return responseMock.Object;
125129
}

src/Bicep.Core/Registry/ExternalModuleRegistry.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ namespace Bicep.Core.Registry
1616
{
1717
public abstract class ExternalModuleRegistry<TModuleReference, TModuleEntity> : ModuleRegistry<TModuleReference>
1818
where TModuleReference : ModuleReference
19-
where TModuleEntity : class
2019
{
2120
// if we're unable to acquire a lock on the module directory in the cache, we will retry until this timeout is reached
2221
private static readonly TimeSpan ModuleDirectoryContentionTimeout = TimeSpan.FromSeconds(5);

src/Bicep.Core/Registry/ITemplateSpecVersionProvider.cs

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)