Add "Zone" (activation check) extension

This commit is contained in:
2025-06-24 15:19:55 +02:00
parent 9aa1dbb02c
commit f9b7dcb7d2
3 changed files with 99 additions and 0 deletions

View File

@@ -20,6 +20,10 @@ This package contains the feature set of the _Domain/Zone Management_ section of
- [List Zones](https://developers.cloudflare.com/api/resources/zones/methods/list/) - [List Zones](https://developers.cloudflare.com/api/resources/zones/methods/list/)
##### [Activation Check]
- [Rerun The Activation Check](https://developers.cloudflare.com/api/resources/zones/subresources/activation_check/methods/trigger/)
@@ -35,3 +39,5 @@ Published under MIT License (see [choose a license])
[choose a license]: https://choosealicense.com/licenses/mit/ [choose a license]: https://choosealicense.com/licenses/mit/
[Registrar]: https://developers.cloudflare.com/api/resources/registrar/ [Registrar]: https://developers.cloudflare.com/api/resources/registrar/
[Zones]: https://developers.cloudflare.com/api/resources/zones/
[Activation Check]: https://developers.cloudflare.com/api/resources/zones/subresources/activation_check/

View File

@@ -106,5 +106,21 @@ namespace AMWD.Net.Api.Cloudflare.Zones
{ {
return client.GetAsync<IReadOnlyCollection<Zone>>($"/zones", queryFilter: options, cancellationToken: cancellationToken); return client.GetAsync<IReadOnlyCollection<Zone>>($"/zones", queryFilter: options, cancellationToken: cancellationToken);
} }
/// <summary>
/// Triggeres a new activation check for a <see cref="ZoneStatus.Pending"/> zone.
/// </summary>
/// <remarks>
/// This can be triggered every 5 min for paygo/enterprise customers, every hour for FREE Zones.
/// </remarks>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="zoneId">The zone identifier.</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<Identifier>> RerunActivationCheck(this ICloudflareClient client, string zoneId, CancellationToken cancellationToken = default)
{
zoneId.ValidateCloudflareId();
return client.PutAsync<Identifier, object>($"/zones/{zoneId}/activation_check", null, cancellationToken);
}
} }
} }

View File

@@ -0,0 +1,77 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AMWD.Net.Api.Cloudflare;
using AMWD.Net.Api.Cloudflare.Zones;
using Moq;
namespace Cloudflare.Zones.Tests.ZonesExtensions
{
[TestClass]
public class RerunActivationCheckTest
{
private const string ZoneId = "023e105f4ecef8ad9ca31a8372d0c353";
private Mock<ICloudflareClient> _clientMock;
private CloudflareResponse<Identifier> _response;
private List<(string RequestPath, object Request)> _callbacks;
[TestInitialize]
public void Initialize()
{
_callbacks = [];
_response = new CloudflareResponse<Identifier>
{
Success = true,
Messages = [
new ResponseInfo(1000, "Message 1")
],
Errors = [
new ResponseInfo(1000, "Error 1")
],
Result = new Identifier
{
Id = ZoneId
}
};
}
[TestMethod]
public async Task ShouldRerunActivationCheck()
{
// Arrange
var client = GetClient();
// Act
var response = await client.RerunActivationCheck(ZoneId);
// Assert
Assert.IsNotNull(response);
Assert.IsTrue(response.Success);
Assert.AreEqual(_response.Result, response.Result);
Assert.AreEqual(1, _callbacks.Count);
var callback = _callbacks.First();
Assert.AreEqual($"/zones/{ZoneId}/activation_check", callback.RequestPath);
Assert.IsNull(callback.Request);
_clientMock.Verify(m => m.PutAsync<Identifier, object>($"/zones/{ZoneId}/activation_check", null, It.IsAny<CancellationToken>()), Times.Once);
_clientMock.VerifyNoOtherCalls();
}
private ICloudflareClient GetClient()
{
_clientMock = new Mock<ICloudflareClient>();
_clientMock
.Setup(m => m.PutAsync<Identifier, object>(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<CancellationToken>()))
.Callback<string, object, CancellationToken>((requestPath, request, _) => _callbacks.Add((requestPath, request)))
.ReturnsAsync(() => _response);
return _clientMock.Object;
}
}
}