diff --git a/Octokit.Reactive/Clients/Enterprise/IObservableEnterpriseClient.cs b/Octokit.Reactive/Clients/Enterprise/IObservableEnterpriseClient.cs
index 018c48e8..27a7d1a2 100644
--- a/Octokit.Reactive/Clients/Enterprise/IObservableEnterpriseClient.cs
+++ b/Octokit.Reactive/Clients/Enterprise/IObservableEnterpriseClient.cs
@@ -47,5 +47,13 @@
/// See the Enterprise Search Indexing API documentation for more information.
///
IObservableEnterpriseSearchIndexingClient SearchIndexing { get; }
+
+ ///
+ /// A client for GitHub's Enterprise Pre-receive Environments API
+ ///
+ ///
+ /// See the Enterprise Pre-receive Environments API documentation for more information.
+ ///
+ IObservableEnterprisePreReceiveEnvironmentsClient PreReceiveEnvironment { get; }
}
}
diff --git a/Octokit.Reactive/Clients/Enterprise/IObservableEnterprisePreReceiveEnvironmentsClient.cs b/Octokit.Reactive/Clients/Enterprise/IObservableEnterprisePreReceiveEnvironmentsClient.cs
new file mode 100644
index 00000000..2bc29fa2
--- /dev/null
+++ b/Octokit.Reactive/Clients/Enterprise/IObservableEnterprisePreReceiveEnvironmentsClient.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Reactive;
+
+namespace Octokit.Reactive
+{
+ ///
+ /// A client for GitHub's Enterprise Pre-receive Environments API
+ ///
+ ///
+ /// See the Enterprise Pre-receive Environments API documentation for more information.
+ ///
+ public interface IObservableEnterprisePreReceiveEnvironmentsClient
+ {
+ ///
+ /// Gets all s.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// Thrown when a general API error occurs.
+ IObservable GetAll();
+
+ ///
+ /// Gets all s.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// Options for changing the API response
+ /// Thrown when a general API error occurs.
+ IObservable GetAll(ApiOptions options);
+
+ ///
+ /// Gets a single .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ IObservable Get(long environmentId);
+
+ ///
+ /// Creates a new .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// A description of the pre-receive environment to create
+ /// Thrown when a general API error occurs.
+ IObservable Create(NewPreReceiveEnvironment newPreReceiveEnvironment);
+
+ ///
+ /// Edits an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// A description of the pre-receive environment to edit
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ IObservable Edit(long environmentId, UpdatePreReceiveEnvironment updatePreReceiveEnvironment);
+
+ ///
+ /// Deletes an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ IObservable Delete(long environmentId);
+
+ ///
+ /// Gets the download status for an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ IObservable DownloadStatus(long environmentId);
+
+ ///
+ /// Triggers a new download of the 's tarball from the environment's .
+ /// When the download is finished, the newly downloaded tarball will overwrite the existing environment.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ IObservable TriggerDownload(long environmentId);
+ }
+}
diff --git a/Octokit.Reactive/Clients/Enterprise/ObservableEnterpriseClient.cs b/Octokit.Reactive/Clients/Enterprise/ObservableEnterpriseClient.cs
index 25ba9c22..067e81cf 100644
--- a/Octokit.Reactive/Clients/Enterprise/ObservableEnterpriseClient.cs
+++ b/Octokit.Reactive/Clients/Enterprise/ObservableEnterpriseClient.cs
@@ -17,6 +17,7 @@
License = new ObservableEnterpriseLicenseClient(client);
Organization = new ObservableEnterpriseOrganizationClient(client);
SearchIndexing = new ObservableEnterpriseSearchIndexingClient(client);
+ PreReceiveEnvironment = new ObservableEnterprisePreReceiveEnvironmentsClient(client);
}
///
@@ -58,5 +59,13 @@
/// See the Enterprise Search Indexing API documentation for more information.
///
public IObservableEnterpriseSearchIndexingClient SearchIndexing { get; private set; }
+
+ ///
+ /// A client for GitHub's Enterprise Pre-receive Environments API
+ ///
+ ///
+ /// See the Enterprise Pre-receive Environments API documentation for more information.
+ ///
+ public IObservableEnterprisePreReceiveEnvironmentsClient PreReceiveEnvironment { get; private set; }
}
}
diff --git a/Octokit.Reactive/Clients/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClient.cs b/Octokit.Reactive/Clients/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClient.cs
new file mode 100644
index 00000000..f49b337c
--- /dev/null
+++ b/Octokit.Reactive/Clients/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClient.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Reactive;
+using System.Reactive.Threading.Tasks;
+using Octokit.Reactive.Internal;
+
+namespace Octokit.Reactive
+{
+ ///
+ /// A client for GitHub's Enterprise Pre-receive Environments API
+ ///
+ ///
+ /// See the Enterprise Pre-receive Environments API documentation for more information.
+ ///
+ public class ObservableEnterprisePreReceiveEnvironmentsClient : IObservableEnterprisePreReceiveEnvironmentsClient
+ {
+ readonly IEnterprisePreReceiveEnvironmentsClient _client;
+ readonly IConnection _connection;
+
+ public ObservableEnterprisePreReceiveEnvironmentsClient(IGitHubClient client)
+ {
+ Ensure.ArgumentNotNull(client, nameof(client));
+
+ _client = client.Enterprise.PreReceiveEnvironment;
+ _connection = client.Connection;
+ }
+
+ ///
+ /// Gets all s.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// Thrown when a general API error occurs.
+ public IObservable GetAll()
+ {
+ return GetAll(ApiOptions.None);
+ }
+
+ ///
+ /// Gets all s.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// Options for changing the API response
+ /// Thrown when a general API error occurs.
+ public IObservable GetAll(ApiOptions options)
+ {
+ Ensure.ArgumentNotNull(options, nameof(options));
+
+ return _connection.GetAndFlattenAllPages(ApiUrls.AdminPreReceiveEnvironments(), null, AcceptHeaders.PreReceiveEnvironmentsPreview, options);
+ }
+
+ ///
+ /// Gets a single .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ public IObservable Get(long environmentId)
+ {
+ return _client.Get(environmentId).ToObservable();
+ }
+
+ ///
+ /// Creates a new .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// A description of the pre-receive environment to create
+ /// Thrown when a general API error occurs.
+ public IObservable Create(NewPreReceiveEnvironment newPreReceiveEnvironment)
+ {
+ Ensure.ArgumentNotNull(newPreReceiveEnvironment, nameof(newPreReceiveEnvironment));
+
+ return _client.Create(newPreReceiveEnvironment).ToObservable();
+ }
+
+ ///
+ /// Edits an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// A description of the pre-receive environment to edit
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ public IObservable Edit(long environmentId, UpdatePreReceiveEnvironment updatePreReceiveEnvironment)
+ {
+ Ensure.ArgumentNotNull(updatePreReceiveEnvironment, nameof(updatePreReceiveEnvironment));
+
+ return _client.Edit(environmentId, updatePreReceiveEnvironment).ToObservable();
+ }
+
+ ///
+ /// Deletes an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ public IObservable Delete(long environmentId)
+ {
+ return _client.Delete(environmentId).ToObservable();
+ }
+
+ ///
+ /// Gets the download status for an existing .
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ public IObservable DownloadStatus(long environmentId)
+ {
+ return _client.DownloadStatus(environmentId).ToObservable();
+ }
+
+ ///
+ /// Triggers a new download of the 's tarball from the environment's .
+ /// When the download is finished, the newly downloaded tarball will overwrite the existing environment.
+ ///
+ ///
+ /// See the API documentation for more information.
+ ///
+ /// The id of the pre-receive environment
+ /// Thrown when the specified does not exist.
+ /// Thrown when a general API error occurs.
+ public IObservable TriggerDownload(long environmentId)
+ {
+ return _client.TriggerDownload(environmentId).ToObservable();
+ }
+ }
+}
diff --git a/Octokit.Tests.Integration/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs b/Octokit.Tests.Integration/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs
new file mode 100644
index 00000000..211ee905
--- /dev/null
+++ b/Octokit.Tests.Integration/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs
@@ -0,0 +1,349 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Octokit;
+using Octokit.Tests.Integration;
+using Xunit;
+
+public class EnterprisePreReceiveEnvironmentsClientTests
+{
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new EnterprisePreReceiveEnvironmentsClient(null));
+ }
+ }
+
+ public class TheGetAllMethod : IDisposable
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly List _preReceiveEnvironments;
+
+ public TheGetAllMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ _preReceiveEnvironments = new List();
+ for (var count = 0; count < 5; count++)
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironments.Add(_preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Result);
+ }
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsPreReceiveEnvironments()
+ {
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll();
+
+ Assert.NotEmpty(preReceiveEnvironments);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsCorrectCountOfPreReceiveEnvironmentsWithoutStart()
+ {
+ var options = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1
+ };
+
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll(options);
+
+ Assert.Equal(1, preReceiveEnvironments.Count);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsCorrectCountOfPreReceiveEnvironmentsWithStart()
+ {
+ var options = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1,
+ StartPage = 2
+ };
+
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll(options);
+
+ Assert.Equal(1, preReceiveEnvironments.Count);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsDistinctResultsBasedOnStartPage()
+ {
+ var startOptions = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1
+ };
+
+ var firstPage = await _preReceiveEnvironmentsClient.GetAll(startOptions);
+
+ var skipStartOptions = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1,
+ StartPage = 2
+ };
+
+ var secondPage = await _preReceiveEnvironmentsClient.GetAll(skipStartOptions);
+
+ Assert.NotEqual(firstPage[0].Id, secondPage[0].Id);
+ }
+
+ public void Dispose()
+ {
+ foreach (var preReceiveEnvironment in _preReceiveEnvironments)
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, preReceiveEnvironment);
+ }
+ }
+ }
+
+ public class TheGetMethod : IDisposable
+ {
+ private readonly string _preReceiveEnvironmentName;
+ private readonly string _preReceiveEnvironmentUrl;
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheGetMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ _preReceiveEnvironmentName = Helper.MakeNameWithTimestamp("pre-receive");
+ _preReceiveEnvironmentUrl = "https://example.com/foo.zip";
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(_preReceiveEnvironmentName, _preReceiveEnvironmentUrl);
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Result;
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsName()
+ {
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Get(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(_preReceiveEnvironmentName, preReceiveEnvironment.Name);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsImageUrl()
+ {
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Get(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(_preReceiveEnvironmentUrl, preReceiveEnvironment.ImageUrl);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task NoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(() => _preReceiveEnvironmentsClient.Get(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheCreateMethod
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+
+ public TheCreateMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+ }
+
+ [Fact]
+ public async Task CanCreatePreReceiveEnvironment()
+ {
+ PreReceiveEnvironment preReceiveEnvironment = null;
+ try
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+
+ preReceiveEnvironment = await _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(newPreReceiveEnvironment.Name, preReceiveEnvironment.Name);
+ Assert.Equal(newPreReceiveEnvironment.ImageUrl, preReceiveEnvironment.ImageUrl);
+ }
+ finally
+ {
+ //Cleanup
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, preReceiveEnvironment);
+ }
+ }
+
+ [Fact]
+ public async Task CannotCreateWithSameName()
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment("default", "https://example.com/foo.zip");
+
+ await Assert.ThrowsAsync(() => _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment));
+ }
+ }
+
+ public class TheEditMethod : IDisposable
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheEditMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Result;
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanChangeNameOfPreReceiveEnvironment()
+ {
+ var updatePreReceiveEnvironment = new UpdatePreReceiveEnvironment
+ {
+ Name = Helper.MakeNameWithTimestamp("pre-receive")
+ };
+
+ var updatedPreReceiveEnvironment = await _preReceiveEnvironmentsClient.Edit(_preReceiveEnvironment.Id, updatePreReceiveEnvironment);
+
+ Assert.Equal(_preReceiveEnvironment.Id, updatedPreReceiveEnvironment.Id);
+ Assert.Equal(updatePreReceiveEnvironment.Name, updatedPreReceiveEnvironment.Name);
+ Assert.Equal(_preReceiveEnvironment.ImageUrl, updatedPreReceiveEnvironment.ImageUrl);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanChangeImageUrlOfPreReceiveEnvironment()
+ {
+ var updatePreReceiveEnvironment = new UpdatePreReceiveEnvironment
+ {
+ ImageUrl = "https://example.com/bar.zip"
+ };
+
+ var updatedPreReceiveEnvironment = await _preReceiveEnvironmentsClient.Edit(_preReceiveEnvironment.Id, updatePreReceiveEnvironment);
+
+ Assert.Equal(_preReceiveEnvironment.Id, updatedPreReceiveEnvironment.Id);
+ Assert.Equal(updatePreReceiveEnvironment.ImageUrl, updatedPreReceiveEnvironment.ImageUrl);
+ Assert.Equal(_preReceiveEnvironment.Name, updatedPreReceiveEnvironment.Name);
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheDeleteMethod
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+
+ public TheDeleteMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanDeletePreReceiveEnvironment()
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment);
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, preReceiveEnvironment);
+
+ await _preReceiveEnvironmentsClient.Delete(preReceiveEnvironment.Id);
+
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Get(preReceiveEnvironment.Id));
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotDeleteWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Delete(-1));
+ }
+ }
+
+ public class TheDownloadStatusMethod : IDisposable
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheDownloadStatusMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Result;
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanGetDownloadStatus()
+ {
+ var downloadStatus = await _preReceiveEnvironmentsClient.DownloadStatus(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(downloadStatus);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotGetDownloadStatusWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.DownloadStatus(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheTriggerDownloadMethod : IDisposable
+ {
+ private readonly IGitHubClient _githubEnterprise;
+ private readonly IEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheTriggerDownloadMethod()
+ {
+ _githubEnterprise = EnterpriseHelper.GetAuthenticatedClient();
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Result;
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanTriggerDownload()
+ {
+ var downloadStatus = await _preReceiveEnvironmentsClient.DownloadStatus(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(downloadStatus);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotTriggerDownloadWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.DownloadStatus(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+}
diff --git a/Octokit.Tests.Integration/EnterpriseHelper.cs b/Octokit.Tests.Integration/EnterpriseHelper.cs
index deae6e0e..6db94379 100644
--- a/Octokit.Tests.Integration/EnterpriseHelper.cs
+++ b/Octokit.Tests.Integration/EnterpriseHelper.cs
@@ -124,6 +124,44 @@ namespace Octokit.Tests.Integration
catch { }
}
+ public static void WaitForPreReceiveEnvironmentToComplete(IConnection connection, PreReceiveEnvironment preReceiveEnvironment)
+ {
+ if (preReceiveEnvironment != null)
+ {
+ try
+ {
+ var client = new GitHubClient(connection);
+ var downloadStatus = preReceiveEnvironment.Download;
+
+ var sw = Stopwatch.StartNew();
+ while (sw.Elapsed < TimeSpan.FromSeconds(15) && (downloadStatus.State == PreReceiveEnvironmentDownloadState.NotStarted || downloadStatus.State == PreReceiveEnvironmentDownloadState.InProgress))
+ {
+ downloadStatus = client.Enterprise.PreReceiveEnvironment.DownloadStatus(preReceiveEnvironment.Id).Result;
+ }
+
+ sw.Stop();
+ }
+ catch
+ { }
+ }
+ }
+
+ public static void DeletePreReceiveEnvironment(IConnection connection, PreReceiveEnvironment preReceiveEnvironment)
+ {
+ if (preReceiveEnvironment != null)
+ {
+ WaitForPreReceiveEnvironmentToComplete(connection, preReceiveEnvironment);
+
+ try
+ {
+ var client = new GitHubClient(connection);
+ client.Enterprise.PreReceiveEnvironment.Delete(preReceiveEnvironment.Id).Wait(TimeSpan.FromSeconds(15));
+ }
+ catch
+ { }
+ }
+ }
+
public static IGitHubClient GetAuthenticatedClient()
{
return new GitHubClient(new ProductHeaderValue("OctokitEnterpriseTests"), GitHubEnterpriseUrl)
diff --git a/Octokit.Tests.Integration/Reactive/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClientTests.cs b/Octokit.Tests.Integration/Reactive/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClientTests.cs
new file mode 100644
index 00000000..22e05fa1
--- /dev/null
+++ b/Octokit.Tests.Integration/Reactive/Enterprise/ObservableEnterprisePreReceiveEnvironmentsClientTests.cs
@@ -0,0 +1,351 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Reactive.Linq;
+using Octokit;
+using Octokit.Reactive;
+using Octokit.Tests.Integration;
+using Xunit;
+
+public class ObservableEnterprisePreReceiveEnvironmentsClientTests
+{
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new EnterprisePreReceiveEnvironmentsClient(null));
+ }
+ }
+
+ public class TheGetAllMethod : IDisposable
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly List _preReceiveEnvironments;
+
+ public TheGetAllMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ _preReceiveEnvironments = new List();
+ for (var count = 0; count < 5; count++)
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironments.Add(_preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Wait());
+ }
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsPreReceiveEnvironments()
+ {
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll().ToList();
+
+ Assert.NotEmpty(preReceiveEnvironments);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsCorrectCountOfPreReceiveEnvironmentsWithoutStart()
+ {
+ var options = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1
+ };
+
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll(options).ToList();
+
+ Assert.Equal(1, preReceiveEnvironments.Count);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsCorrectCountOfPreReceiveEnvironmentsWithStart()
+ {
+ var options = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1,
+ StartPage = 2
+ };
+
+ var preReceiveEnvironments = await _preReceiveEnvironmentsClient.GetAll(options).ToList();
+
+ Assert.Equal(1, preReceiveEnvironments.Count);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsDistinctResultsBasedOnStartPage()
+ {
+ var startOptions = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1
+ };
+
+ var firstPage = await _preReceiveEnvironmentsClient.GetAll(startOptions).ToList();
+
+ var skipStartOptions = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1,
+ StartPage = 2
+ };
+
+ var secondPage = await _preReceiveEnvironmentsClient.GetAll(skipStartOptions).ToList();
+
+ Assert.NotEqual(firstPage[0].Id, secondPage[0].Id);
+ }
+
+ public void Dispose()
+ {
+ foreach (var preReceiveEnvironment in _preReceiveEnvironments)
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, preReceiveEnvironment);
+ }
+ }
+ }
+
+ public class TheGetMethod : IDisposable
+ {
+ private readonly string _preReceiveEnvironmentName;
+ private readonly string _preReceiveEnvironmentUrl;
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheGetMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ _preReceiveEnvironmentName = Helper.MakeNameWithTimestamp("pre-receive");
+ _preReceiveEnvironmentUrl = "https://example.com/foo.zip";
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(_preReceiveEnvironmentName, _preReceiveEnvironmentUrl);
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Wait();
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsName()
+ {
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Get(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(_preReceiveEnvironmentName, preReceiveEnvironment.Name);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task ReturnsImageUrl()
+ {
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Get(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(_preReceiveEnvironmentUrl, preReceiveEnvironment.ImageUrl);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task NoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Get(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheCreateMethod
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+
+ public TheCreateMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+ }
+
+ [Fact]
+ public async Task CanCreatePreReceiveEnvironment()
+ {
+ PreReceiveEnvironment preReceiveEnvironment = null;
+ try
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+
+ preReceiveEnvironment = await _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment);
+
+ Assert.NotNull(preReceiveEnvironment);
+ Assert.Equal(newPreReceiveEnvironment.Name, preReceiveEnvironment.Name);
+ Assert.Equal(newPreReceiveEnvironment.ImageUrl, preReceiveEnvironment.ImageUrl);
+ }
+ finally
+ {
+ //Cleanup
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, preReceiveEnvironment);
+ }
+ }
+
+ [Fact]
+ public async Task CannotCreateWithSameName()
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment("default", "https://example.com/foo.zip");
+
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment));
+ }
+ }
+
+ public class TheEditMethod : IDisposable
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheEditMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Wait();
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanChangeNameOfPreReceiveEnvironment()
+ {
+ var updatePreReceiveEnvironment = new UpdatePreReceiveEnvironment
+ {
+ Name = Helper.MakeNameWithTimestamp("pre-receive")
+ };
+
+ var updatedPreReceiveEnvironment = await _preReceiveEnvironmentsClient.Edit(_preReceiveEnvironment.Id, updatePreReceiveEnvironment);
+
+ Assert.Equal(_preReceiveEnvironment.Id, updatedPreReceiveEnvironment.Id);
+ Assert.Equal(updatePreReceiveEnvironment.Name, updatedPreReceiveEnvironment.Name);
+ Assert.Equal(_preReceiveEnvironment.ImageUrl, updatedPreReceiveEnvironment.ImageUrl);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanChangeImageUrlOfPreReceiveEnvironment()
+ {
+ var updatePreReceiveEnvironment = new UpdatePreReceiveEnvironment
+ {
+ ImageUrl = "https://example.com/bar.zip"
+ };
+
+ var updatedPreReceiveEnvironment = await _preReceiveEnvironmentsClient.Edit(_preReceiveEnvironment.Id, updatePreReceiveEnvironment);
+
+ Assert.Equal(_preReceiveEnvironment.Id, updatedPreReceiveEnvironment.Id);
+ Assert.Equal(updatePreReceiveEnvironment.ImageUrl, updatedPreReceiveEnvironment.ImageUrl);
+ Assert.Equal(_preReceiveEnvironment.Name, updatedPreReceiveEnvironment.Name);
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheDeleteMethod
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+
+ public TheDeleteMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanDeletePreReceiveEnvironment()
+ {
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ var preReceiveEnvironment = await _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment);
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, preReceiveEnvironment);
+
+ await _preReceiveEnvironmentsClient.Delete(preReceiveEnvironment.Id);
+
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Get(preReceiveEnvironment.Id));
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotDeleteWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.Delete(-1));
+ }
+ }
+
+ public class TheDownloadStatusMethod : IDisposable
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheDownloadStatusMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Wait();
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanGetDownloadStatus()
+ {
+ var downloadStatus = await _preReceiveEnvironmentsClient.DownloadStatus(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(downloadStatus);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotGetDownloadStatusWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.DownloadStatus(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+
+ public class TheTriggerDownloadMethod : IDisposable
+ {
+ private readonly IObservableGitHubClient _githubEnterprise;
+ private readonly IObservableEnterprisePreReceiveEnvironmentsClient _preReceiveEnvironmentsClient;
+ private readonly PreReceiveEnvironment _preReceiveEnvironment;
+
+ public TheTriggerDownloadMethod()
+ {
+ _githubEnterprise = new ObservableGitHubClient(EnterpriseHelper.GetAuthenticatedClient());
+ _preReceiveEnvironmentsClient = _githubEnterprise.Enterprise.PreReceiveEnvironment;
+
+ var newPreReceiveEnvironment = new NewPreReceiveEnvironment(Helper.MakeNameWithTimestamp("pre-receive"), "https://example.com/foo.zip");
+ _preReceiveEnvironment = _preReceiveEnvironmentsClient.Create(newPreReceiveEnvironment).Wait();
+ EnterpriseHelper.WaitForPreReceiveEnvironmentToComplete(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CanTriggerDownload()
+ {
+ var downloadStatus = await _preReceiveEnvironmentsClient.DownloadStatus(_preReceiveEnvironment.Id);
+
+ Assert.NotNull(downloadStatus);
+ }
+
+ [GitHubEnterpriseTest]
+ public async Task CannotTriggerDownloadWhenNoEnvironmentExists()
+ {
+ await Assert.ThrowsAsync(async () => await _preReceiveEnvironmentsClient.DownloadStatus(-1));
+ }
+
+ public void Dispose()
+ {
+ EnterpriseHelper.DeletePreReceiveEnvironment(_githubEnterprise.Connection, _preReceiveEnvironment);
+ }
+ }
+}
diff --git a/Octokit.Tests/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs b/Octokit.Tests/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs
new file mode 100644
index 00000000..c1ee944e
--- /dev/null
+++ b/Octokit.Tests/Clients/Enterprise/EnterprisePreReceiveEnvironmentsClientTests.cs
@@ -0,0 +1,179 @@
+using System;
+using System.Threading.Tasks;
+using NSubstitute;
+using Xunit;
+
+namespace Octokit.Tests.Clients
+{
+ public class EnterprisePreReceiveEnvironmentsClientTests
+ {
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresNonNullArguments()
+ {
+ Assert.Throws(() => new EnterprisePreReceiveEnvironmentsClient(null));
+ }
+ }
+
+ public class TheGetAllMethod
+ {
+ [Fact]
+ public async Task RequestsCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+
+ await client.GetAll();
+
+ connection.Received().GetAll(Arg.Is(u => u.ToString() == "admin/pre-receive-environments"),
+ null,
+ "application/vnd.github.eye-scream-preview+json",
+ Args.ApiOptions);
+ }
+
+ [Fact]
+ public async Task RequestsCorrectUrlWithApiOptions()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+
+ var options = new ApiOptions
+ {
+ PageSize = 1,
+ PageCount = 1,
+ StartPage = 1
+ };
+
+ await client.GetAll(options);
+
+ connection.Received().GetAll(Arg.Is(u => u.ToString() == "admin/pre-receive-environments"),
+ null,
+ "application/vnd.github.eye-scream-preview+json",
+ options);
+ }
+ }
+
+ public class TheGetMethod
+ {
+ [Fact]
+ public async Task RequestsTheCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+
+ await client.Get(1);
+
+ connection.Received().Get(Arg.Is(u => u.ToString() == "admin/pre-receive-environments/1"),
+ null,
+ "application/vnd.github.eye-scream-preview+json");
+ }
+ }
+
+ public class TheCreateMethod
+ {
+ [Fact]
+ public async Task RequestsCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+ var data = new NewPreReceiveEnvironment("name", "url");
+
+ await client.Create(data);
+
+ connection.Received().Post(Arg.Is(u => u.ToString() == "admin/pre-receive-environments"),
+ data,
+ "application/vnd.github.eye-scream-preview+json");
+ }
+
+ [Fact]
+ public async Task EnsuresNonNullArguments()
+ {
+ var client = new EnterprisePreReceiveEnvironmentsClient(Substitute.For());
+ Assert.Throws(() => new NewPreReceiveEnvironment(null, "url"));
+ Assert.Throws(() => new NewPreReceiveEnvironment("", "url"));
+ Assert.Throws(() => new NewPreReceiveEnvironment("name", null));
+ Assert.Throws(() => new NewPreReceiveEnvironment("name", ""));
+
+ await Assert.ThrowsAsync(() => client.Create(null));
+ }
+ }
+
+ public class TheEditMethod
+ {
+ [Fact]
+ public async Task RequestsTheCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+ var data = new UpdatePreReceiveEnvironment
+ {
+ Name = "name",
+ ImageUrl = "url"
+ };
+
+ await client.Edit(1, data);
+
+ connection.Received().Patch(Arg.Is(u => u.ToString() == "admin/pre-receive-environments/1"),
+ data,
+ "application/vnd.github.eye-scream-preview+json");
+ }
+
+ [Fact]
+ public async Task EnsuresNonNullArguments()
+ {
+ var client = new EnterprisePreReceiveEnvironmentsClient(Substitute.For());
+
+ await Assert.ThrowsAsync(() => client.Edit(1, null));
+ }
+ }
+
+ public class TheDeleteMethod
+ {
+ [Fact]
+ public async Task RequestsTheCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new EnterprisePreReceiveEnvironmentsClient(connection);
+
+ await client.Delete(1);
+
+ connection.Received().Delete(Arg.Is(u => u.ToString() == "admin/pre-receive-environments/1"),
+ Arg.Any