forked from pact-foundation/pact-net
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PactBuilder.cs
138 lines (112 loc) · 4.83 KB
/
PactBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using PactNet.Mocks.MockHttpService;
using PactNet.Mocks.MockHttpService.Models;
using PactNet.Models;
namespace PactNet
{
public class PactBuilder : IPactBuilder
{
public string ConsumerName { get; private set; }
public string ProviderName { get; private set; }
private readonly string _pactDir;
private readonly
Func<int, bool, string, string, IPAddress, JsonSerializerSettings, string, string, IMockProviderService>
_mockProviderServiceFactory;
private IMockProviderService _mockProviderService;
internal PactBuilder(
Func<int, bool, string, string, IPAddress, JsonSerializerSettings, string, string, IMockProviderService>
mockProviderServiceFactory)
{
_mockProviderServiceFactory = mockProviderServiceFactory;
}
public PactBuilder()
: this(new PactConfig())
{
}
public PactBuilder(PactConfig config)
: this((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings, sslCert, sslKey) =>
new MockProviderService(port, enableSsl, consumerName, providerName, config, host,
jsonSerializerSettings, sslCert, sslKey))
{
_pactDir = config.PactDir;
}
public IPactBuilder ServiceConsumer(string consumerName)
{
if (string.IsNullOrEmpty(consumerName))
{
throw new ArgumentException("Please supply a non null or empty consumerName");
}
ConsumerName = consumerName;
return this;
}
public IPactBuilder HasPactWith(string providerName)
{
if (string.IsNullOrEmpty(providerName))
{
throw new ArgumentException("Please supply a non null or empty providerName");
}
ProviderName = providerName;
return this;
}
public IMockProviderService MockService(
int port,
bool enableSsl = false,
IPAddress host = IPAddress.Loopback,
string sslCert = null,
string sslKey = null,
bool useRemoteMockService = false)
{
return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl, host: host, sslCert: sslCert, sslKey: sslKey, useRemoteMockService);
}
public IMockProviderService MockService(
int port,
JsonSerializerSettings jsonSerializerSettings,
bool enableSsl = false,
IPAddress host = IPAddress.Loopback,
string sslCert = null,
string sslKey = null,
bool useRemoteMockService = false)
{
if (string.IsNullOrEmpty(ConsumerName))
{
throw new InvalidOperationException(
"ConsumerName has not been set, please supply a consumer name using the ServiceConsumer method.");
}
if (string.IsNullOrEmpty(ProviderName))
{
throw new InvalidOperationException(
"ProviderName has not been set, please supply a provider name using the HasPactWith method.");
}
if (_mockProviderService != null && useRemoteMockService == false )
{
_mockProviderService.Stop();
}
_mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host,
jsonSerializerSettings, sslCert, sslKey);
_mockProviderService.UseRemoteMockService = useRemoteMockService;
_mockProviderService.Start();
return _mockProviderService;
}
public void Build()
{
if (_mockProviderService == null)
{
throw new InvalidOperationException(
"The Pact file could not be saved because the mock provider service is not initialized. Please initialise by calling the MockService() method.");
}
PersistPactFile();
_mockProviderService.Stop();
}
private void PersistPactFile()
{
var fileNameAndPathToSavePactTo = new Dictionary<string, string>();
if (_mockProviderService.UseRemoteMockService)
{
fileNameAndPathToSavePactTo.Add("fileNameAndPath", $"{_pactDir}\\{ConsumerName.ToLower()}{ProviderName.ToLower()}.json");
}
_mockProviderService.SendAdminHttpRequest(HttpVerb.Post, Constants.PactPath, fileNameAndPathToSavePactTo.Count == 0? null : fileNameAndPathToSavePactTo);
}
}
}