Skip to content

Commit af8a98e

Browse files
authored
Provide static VisualClient.Create (#7)
1 parent 12de446 commit af8a98e

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

visual-dotnet/SauceLabs.Visual/VisualClient.cs

+39-18
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ public class VisualClient : IDisposable
1919
private readonly VisualApi<WebDriver> _api;
2020
private readonly string _sessionId;
2121
private readonly string _jobId;
22-
private readonly string _sessionMetadataBlob;
22+
private string? _sessionMetadataBlob;
2323
private readonly List<string> _screenshotIds = new List<string>();
24-
public VisualBuild Build { get; }
25-
private readonly bool _externalBuild;
24+
public VisualBuild Build { get; private set; }
25+
private bool _externalBuild;
2626
public bool CaptureDom { get; set; } = false;
2727
private readonly ResiliencePipeline _retryPipeline;
2828

@@ -31,8 +31,9 @@ public class VisualClient : IDisposable
3131
/// </summary>
3232
/// <param name="wd">the instance of the WebDriver session</param>
3333
/// <param name="region">the Sauce Labs region to connect to</param>
34-
public VisualClient(WebDriver wd, Region region) : this(wd, region, EnvVars.Username, EnvVars.AccessKey)
34+
public static async Task<VisualClient> Create(WebDriver wd, Region region)
3535
{
36+
return await Create(wd, region, EnvVars.Username, EnvVars.AccessKey, new CreateBuildOptions());
3637
}
3738

3839
/// <summary>
@@ -41,8 +42,9 @@ public VisualClient(WebDriver wd, Region region) : this(wd, region, EnvVars.User
4142
/// <param name="wd">the instance of the WebDriver session</param>
4243
/// <param name="region">the Sauce Labs region to connect to</param>
4344
/// <param name="buildOptions">the options of the build creation</param>
44-
public VisualClient(WebDriver wd, Region region, CreateBuildOptions buildOptions) : this(wd, region, EnvVars.Username, EnvVars.AccessKey, buildOptions)
45+
public static async Task<VisualClient> Create(WebDriver wd, Region region, CreateBuildOptions buildOptions)
4546
{
47+
return await Create(wd, region, EnvVars.Username, EnvVars.AccessKey, buildOptions);
4648
}
4749

4850
/// <summary>
@@ -52,8 +54,9 @@ public VisualClient(WebDriver wd, Region region, CreateBuildOptions buildOptions
5254
/// <param name="region">the Sauce Labs region to connect to</param>
5355
/// <param name="username">the Sauce Labs username</param>
5456
/// <param name="accessKey">the Sauce Labs access key</param>
55-
public VisualClient(WebDriver wd, Region region, string username, string accessKey) : this(wd, region, username, accessKey, new CreateBuildOptions())
57+
public static async Task<VisualClient> Create(WebDriver wd, Region region, string username, string accessKey)
5658
{
59+
return await Create(wd, region, username, accessKey, new CreateBuildOptions());
5760
}
5861

5962
/// <summary>
@@ -64,21 +67,20 @@ public VisualClient(WebDriver wd, Region region, CreateBuildOptions buildOptions
6467
/// <param name="username">the Sauce Labs username</param>
6568
/// <param name="accessKey">the Sauce Labs access key</param>
6669
/// <param name="buildOptions">the options of the build creation</param>
67-
public VisualClient(WebDriver wd, Region region, string username, string accessKey, CreateBuildOptions buildOptions)
70+
public static async Task<VisualClient> Create(WebDriver wd, Region region, string username, string accessKey, CreateBuildOptions buildOptions)
6871
{
69-
if (StringUtils.IsNullOrEmpty(username) || StringUtils.IsNullOrEmpty(accessKey))
70-
{
71-
throw new VisualClientException("Username or Access Key not set");
72-
}
72+
var client = new VisualClient(wd, Region.UsWest1, username, accessKey);
73+
await client.SetupBuild(buildOptions);
74+
return client;
75+
}
7376

74-
_api = new VisualApi<WebDriver>(wd, region, username, accessKey);
75-
_sessionId = wd.SessionId.ToString();
76-
_jobId = wd.Capabilities.HasCapability("jobUuid") ? wd.Capabilities.GetCapability("jobUuid").ToString() : _sessionId;
77-
var response = _api.WebDriverSessionInfo(_jobId, _sessionId).Result;
77+
private async Task SetupBuild(CreateBuildOptions buildOptions)
78+
{
79+
var response = await this._api.WebDriverSessionInfo(_jobId, _sessionId);
7880
var metadata = response.EnsureValidResponse();
7981
_sessionMetadataBlob = metadata.Result.Blob;
8082

81-
var build = GetEffectiveBuild(EnvVars.BuildId, EnvVars.CustomId).Result;
83+
var build = await GetEffectiveBuild(EnvVars.BuildId, EnvVars.CustomId);
8284
if (build != null)
8385
{
8486
if (!build.IsRunning())
@@ -91,10 +93,29 @@ public VisualClient(WebDriver wd, Region region, string username, string accessK
9193
else
9294
{
9395
buildOptions.CustomId ??= EnvVars.CustomId;
94-
var createBuildResponse = CreateBuild(buildOptions).Result;
96+
var createBuildResponse = await CreateBuild(buildOptions);
9597
Build = new VisualBuild(createBuildResponse.Id, createBuildResponse.Url, createBuildResponse.Mode);
9698
_externalBuild = false;
9799
}
100+
}
101+
102+
/// <summary>
103+
/// Creates a new instance of <c>VisualClient</c>
104+
/// </summary>
105+
/// <param name="wd">the instance of the WebDriver session</param>
106+
/// <param name="region">the Sauce Labs region to connect to</param>
107+
/// <param name="username">the Sauce Labs username</param>
108+
/// <param name="accessKey">the Sauce Labs access key</param>
109+
private VisualClient(WebDriver wd, Region region, string username, string accessKey)
110+
{
111+
if (StringUtils.IsNullOrEmpty(username) || StringUtils.IsNullOrEmpty(accessKey))
112+
{
113+
throw new VisualClientException("Username or Access Key not set");
114+
}
115+
116+
_api = new VisualApi<WebDriver>(wd, region, username, accessKey);
117+
_sessionId = wd.SessionId.ToString();
118+
_jobId = wd.Capabilities.HasCapability("jobUuid") ? wd.Capabilities.GetCapability("jobUuid").ToString() : _sessionId;
98119

99120
_retryPipeline = new ResiliencePipelineBuilder()
100121
.AddRetry(new RetryStrategyOptions()
@@ -212,7 +233,7 @@ public async Task<string> VisualCheck(string name, VisualCheckOptions? options =
212233
diffingMethod: options?.DiffingMethod ?? DiffingMethod.Simple,
213234
regions: ignored.ToArray(),
214235
sessionId: _sessionId,
215-
sessionMetadata: _sessionMetadataBlob,
236+
sessionMetadata: _sessionMetadataBlob ?? "",
216237
captureDom: options?.CaptureDom ?? CaptureDom))).EnsureValidResponse();
217238
result.Result.Diffs.Nodes.ToList().ForEach(d => _screenshotIds.Add(d.Id));
218239
return result.Result.Id;

0 commit comments

Comments
 (0)