Skip to content

Commit

Permalink
refactor: [breaking] remove sync methods from NumbersClient
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Mar 14, 2024
1 parent a4ba984 commit 7779669
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 296 deletions.
173 changes: 6 additions & 167 deletions Vonage.Test/NumbersTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Net;
using System.Net;
using System.Threading.Tasks;
using FluentAssertions;
using Vonage.Numbers;
Expand All @@ -20,19 +19,6 @@ public NumbersTests()
this.client = this.BuildVonageClient(credentials);
}

[Fact]
public void BuyNumber()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&";
var expectedUri = $"{this.RestUrl}/number/buy?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
var request = new NumberTransactionRequest {Country = "GB", Msisdn = "447700900000"};
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var response = this.client.NumbersClient.BuyANumber(request);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public async Task BuyNumberAsync()
{
Expand Down Expand Up @@ -60,33 +46,6 @@ public async Task BuyNumberAsyncWithCredentials()
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public void BuyNumberWithCredentials()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&target_api_key=12345&";
var expectedUri = $"{this.RestUrl}/number/buy?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var request = new NumberTransactionRequest
{Country = "GB", Msisdn = "447700900000", TargetApiKey = "12345"};
var response = this.client.NumbersClient.BuyANumber(request, this.credentials);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public void CancelNumber()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&";
var expectedUri = $"{this.RestUrl}/number/cancel?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
var request = new NumberTransactionRequest {Country = "GB", Msisdn = "447700900000"};
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var response = this.client.NumbersClient.CancelANumber(request);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public async Task CancelNumberAsync()
{
Expand Down Expand Up @@ -115,44 +74,30 @@ public async Task CancelNumberAsyncWithCredentials()
}

[Fact]
public void CancelNumberWithCredentials()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&target_api_key=12345&";
var expectedUri = $"{this.RestUrl}/number/cancel?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
var request = new NumberTransactionRequest
{Country = "GB", Msisdn = "447700900000", TargetApiKey = "12345"};
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var response = this.client.NumbersClient.CancelANumber(request, this.credentials);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public void FailedPurchase()
public async Task FailedPurchase()
{
const string expectedResponse =
@"{""error-code"": ""401"",""error-code-label"": ""authentication failed""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&";
var expectedUri = $"{this.RestUrl}/number/buy?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var request = new NumberTransactionRequest {Country = "GB", Msisdn = "447700900000"};
Action act = () => this.client.NumbersClient.BuyANumber(request);
act.Should().ThrowExactly<VonageNumberResponseException>()
var act = () => this.client.NumbersClient.BuyANumberAsync(request);
(await act.Should().ThrowExactlyAsync<VonageNumberResponseException>())
.Which.Response.Should().BeEquivalentTo(new NumberTransactionResponse
{ErrorCode = "401", ErrorCodeLabel = "authentication failed"});
}

[Fact]
public void GetAvailableNumbers()
public async Task GetAvailableNumbers()
{
const string expectedResponse =
@"{""count"": 1234,""numbers"": [{""country"": ""GB"",""msisdn"": ""447700900000"",""type"": ""mobile-lvn"",""cost"": ""1.25"",""features"": [""VOICE"",""SMS""]}]}";
var expectedUri =
$"{this.RestUrl}/number/search?country=GB&api_key={this.ApiKey}&api_secret={this.ApiSecret}&";
var request = new NumberSearchRequest {Country = "GB"};
this.Setup(expectedUri, expectedResponse);
var response = this.client.NumbersClient.GetAvailableNumbers(request);
var response = await this.client.NumbersClient.GetAvailableNumbersAsync(request);
var number = response.Numbers[0];
Assert.Equal(1234, response.Count);
Assert.Equal("GB", number.Country);
Expand Down Expand Up @@ -207,50 +152,6 @@ public async Task GetAvailableNumbersAsyncWithCredentials()
Assert.Equal("SMS", number.Features[1]);
}

[Fact]
public void GetAvailableNumbersWithCredentials()
{
const string expectedResponse =
@"{""count"": 1234,""numbers"": [{""country"": ""GB"",""msisdn"": ""447700900000"",""type"": ""mobile-lvn"",""cost"": ""1.25"",""features"": [""VOICE"",""SMS""]}]}";
var expectedUri =
$"{this.RestUrl}/number/search?country=GB&type=mobile-lvn&pattern=12345&search_pattern=1&features=SMS&size=10&index=1&api_key={this.ApiKey}&api_secret={this.ApiSecret}&";
var request = new NumberSearchRequest
{
Country = "GB", Type = "mobile-lvn", Pattern = "12345", SearchPattern = SearchPattern.Contains,
Features = "SMS", Size = 10, Index = 1,
};
this.Setup(expectedUri, expectedResponse);
var response = this.client.NumbersClient.GetAvailableNumbers(request, this.credentials);
var number = response.Numbers[0];
Assert.Equal(1234, response.Count);
Assert.Equal("GB", number.Country);
Assert.Equal("447700900000", number.Msisdn);
Assert.Equal("mobile-lvn", number.Type);
Assert.Equal("1.25", number.Cost);
Assert.Equal("VOICE", number.Features[0]);
Assert.Equal("SMS", number.Features[1]);
}

[Fact]
public void GetOwnedNumbers()
{
const string expectedResponse =
@"{""count"": 1234,""numbers"": [{""country"": ""GB"",""msisdn"": ""447700900000"",""type"": ""mobile-lvn"",""cost"": ""1.25"",""features"": [""VOICE"",""SMS""]}]}";
var expectedUri =
$"{this.RestUrl}/account/numbers?country=GB&api_key={this.ApiKey}&api_secret={this.ApiSecret}&";
var request = new NumberSearchRequest {Country = "GB"};
this.Setup(expectedUri, expectedResponse);
var response = this.client.NumbersClient.GetOwnedNumbers(request);
var number = response.Numbers[0];
Assert.Equal(1234, response.Count);
Assert.Equal("GB", number.Country);
Assert.Equal("447700900000", number.Msisdn);
Assert.Equal("mobile-lvn", number.Type);
Assert.Equal("1.25", number.Cost);
Assert.Equal("VOICE", number.Features[0]);
Assert.Equal("SMS", number.Features[1]);
}

[Fact]
public async Task GetOwnedNumbersAsync()
{
Expand Down Expand Up @@ -295,43 +196,6 @@ public async Task GetOwnedNumbersAsyncWithCredentials()
Assert.Equal("SMS", number.Features[1]);
}

[Fact]
public void GetOwnedNumbersWithCredentials()
{
const string expectedResponse =
@"{""count"": 1234,""numbers"": [{""country"": ""GB"",""msisdn"": ""447700900000"",""type"": ""mobile-lvn"",""cost"": ""1.25"",""features"": [""VOICE"",""SMS""]}]}";
var expectedUri =
$"{this.RestUrl}/account/numbers?country=GB&type=mobile-lvn&pattern=12345&search_pattern=1&features=SMS&size=10&index=1&api_key={this.ApiKey}&api_secret={this.ApiSecret}&";
var request = new NumberSearchRequest
{
Country = "GB", Type = "mobile-lvn", Pattern = "12345", SearchPattern = SearchPattern.Contains,
Features = "SMS", Size = 10, Index = 1,
};
this.Setup(expectedUri, expectedResponse);
var response = this.client.NumbersClient.GetOwnedNumbers(request, this.credentials);
var number = response.Numbers[0];
Assert.Equal(1234, response.Count);
Assert.Equal("GB", number.Country);
Assert.Equal("447700900000", number.Msisdn);
Assert.Equal("mobile-lvn", number.Type);
Assert.Equal("1.25", number.Cost);
Assert.Equal("VOICE", number.Features[0]);
Assert.Equal("SMS", number.Features[1]);
}

[Fact]
public void UpdateNumber()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
const string expectedRequestContent = "country=GB&msisdn=447700900000&";
var expectedUri = $"{this.RestUrl}/number/update?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
var request = new UpdateNumberRequest {Country = "GB", Msisdn = "447700900000"};
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var response = this.client.NumbersClient.UpdateANumber(request);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public async Task UpdateNumberAsync()
{
Expand Down Expand Up @@ -370,30 +234,5 @@ public async Task UpdateNumberAsyncWithCredentials()
response.ErrorCodeLabel.Should().Be("success");
}

[Fact]
public void UpdateNumberWithCredentials()
{
const string expectedResponse = @"{""error-code"": ""200"",""error-code-label"": ""success""}";
var expectedUri = $"{this.RestUrl}/number/update?api_key={this.ApiKey}&api_secret={this.ApiSecret}";
var expectedRequestContent =
$"country=GB&msisdn=447700900000&app_id=aaaaaaaa-bbbb-cccc-dddd-0123456789abc&moHttpUrl={WebUtility.UrlEncode("https://example.com/webhooks/inbound-sms")}&" +
$"moSmppSysType=inbound&voiceCallbackType=tel&voiceCallbackValue=447700900000&voiceStatusCallback={WebUtility.UrlEncode("https://example.com/webhooks/status")}&";
var request = new UpdateNumberRequest
{
Country = "GB",
Msisdn = "447700900000",
AppId = "aaaaaaaa-bbbb-cccc-dddd-0123456789abc",
MoHttpUrl = "https://example.com/webhooks/inbound-sms",
MoSmppSysType = "inbound",
VoiceCallbackType = "tel",
VoiceCallbackValue = "447700900000",
VoiceStatusCallback = "https://example.com/webhooks/status",
};
this.Setup(expectedUri, expectedResponse, expectedRequestContent);
var response = this.client.NumbersClient.UpdateANumber(request, this.credentials);
response.ErrorCode.Should().Be("200");
response.ErrorCodeLabel.Should().Be("success");
}

private Credentials BuildCredentials() => Credentials.FromApiKeyAndSecret(this.ApiKey, this.ApiSecret);
}
52 changes: 2 additions & 50 deletions Vonage/Numbers/INumbersClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,62 +47,14 @@ public interface INumbersClient
/// <param name="creds"></param>
/// <returns></returns>
Task<NumberTransactionResponse> UpdateANumberAsync(UpdateNumberRequest request, Credentials creds = null);

/// <summary>
/// Transfer a number that you own to a subaccount.
/// </summary>
/// <param name="request"></param>
/// <param name="apiKey"></param>
/// <param name="creds"></param>
/// <returns></returns>
Task<NumberTransferResponse> TransferANumberAsync(NumberTransferRequest request, string apiKey, Credentials creds = null);

/// <summary>
/// Retrieve all the inbound numbers associated with your Vonage account.
/// </summary>
/// <param name="request"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumbersSearchResponse GetOwnedNumbers(NumberSearchRequest request, Credentials creds = null);

/// <summary>
/// Retrieve inbound numbers that are available for the specified country.
/// </summary>
/// <param name="request"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumbersSearchResponse GetAvailableNumbers(NumberSearchRequest request, Credentials creds = null);

/// <summary>
/// Request to purchase a specific inbound number.
/// </summary>
/// <param name="request"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumberTransactionResponse BuyANumber(NumberTransactionRequest request, Credentials creds = null);

/// <summary>
/// Cancel your subscription for a specific inbound number.
/// </summary>
/// <param name="request"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumberTransactionResponse CancelANumber(NumberTransactionRequest request, Credentials creds = null);

/// <summary>
/// Change the behaviour of a number that you own.
/// </summary>
/// <param name="request"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumberTransactionResponse UpdateANumber(UpdateNumberRequest request, Credentials creds = null);

/// <summary>
/// Transfer a number that you own to a subaccount.
/// </summary>
/// <param name="request"></param>
/// <param name="apiKey"></param>
/// <param name="creds"></param>
/// <returns></returns>
NumberTransferResponse TransferANumber(NumberTransferRequest request, string apiKey, Credentials creds = null);
Task<NumberTransferResponse> TransferANumberAsync(NumberTransferRequest request, string apiKey,
Credentials creds = null);
}
Loading

0 comments on commit 7779669

Please sign in to comment.