Skip to content

Commit

Permalink
Implement short code calls
Browse files Browse the repository at this point in the history
  • Loading branch information
smithrobs committed Jan 18, 2016
1 parent cbe022a commit a97bee5
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ShortCodeTest.cs" />
<Compile Include="SearchTest.cs" />
<Compile Include="SmsTest.cs" />
<Compile Include="NumberTest.cs" />
Expand Down
33 changes: 33 additions & 0 deletions Nexmo.Api.Test.Integration/ShortCodeTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Collections.Generic;
using NUnit.Framework;

namespace Nexmo.Api.Test.Integration
{
[TestFixture]
public class ShortCodeTest
{
[Test]
public void should_initiate_2fa()
{
var response = ShortCode.RequestTwoFactorAuth(new ShortCode.TwoFactorAuthRequest
{
to = "17775551212",
pin = 1467
});
Assert.AreEqual("1", response.message_count);
}

[Test]
public void should_initiate_alert()
{
var response = ShortCode.RequestAlert(new ShortCode.AlertRequest
{
to = "17775551212"
}, new Dictionary<string, string>
{
{"mcount", "xyz123"}
});
Assert.AreEqual("1", response.message_count);
}
}
}
1 change: 1 addition & 0 deletions Nexmo.Api.Test.Unit/Nexmo.Api.Test.Unit.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ShortCodeTest.cs" />
<Compile Include="MockedWebTest.cs" />
<Compile Include="SearchTest.cs" />
<Compile Include="SmsTest.cs" />
Expand Down
58 changes: 58 additions & 0 deletions Nexmo.Api.Test.Unit/ShortCodeTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Moq;
using Nexmo.Api.Request;
using NUnit.Framework;

namespace Nexmo.Api.Test.Unit
{
[TestFixture]
internal class ShortCodeTest : MockedWebTest
{
[Test]
public void should_initiate_2fa()
{
var resp = new Mock<IWebResponse>();
resp.Setup(e => e.GetResponseStream()).Returns(new MemoryStream(Encoding.UTF8.GetBytes("{\"message-count\":\"1\",\"messages\":[{\"message-id\":\"02000000AE70FFFF\",\"to\":\"15555551212\",\"remaining-balance\":7.546,\"message-price\":0.0048,\"ok\":true,\"status\":\"0\",\"msisdn\":\"15555551212\",\"network\":\"US-FIXED\",\"messageId\":\"02000000AE70FFFF\",\"remainingBalance\":7.546,\"messagePrice\":0.0048}]}")));
_request.Setup(e => e.GetResponse()).Returns(resp.Object);
var request = new ShortCode.TwoFactorAuthRequest
{
to = "15555551212",
pin = 1247
};
var response = ShortCode.RequestTwoFactorAuth(request);

_mock.Verify(h => h.CreateHttp(new Uri(
string.Format("{0}/sc/us/2fa/json?to={1}&pin={2}&api_key={3}&api_secret={4}&", RestUrl, request.to, request.pin, ApiKey, ApiSecret))),
Times.Once);
Assert.AreEqual("1", response.message_count);
Assert.AreEqual("15555551212", response.messages.First().to);
}

[Test]
public void should_initiate_alert()
{
var resp = new Mock<IWebResponse>();
resp.Setup(e => e.GetResponseStream()).Returns(new MemoryStream(Encoding.UTF8.GetBytes("{\"message-count\":\"1\",\"messages\":[{\"message-id\":\"02000000AE70FFFF\",\"to\":\"15555551212\",\"remaining-balance\":7.546,\"message-price\":0.0048,\"ok\":true,\"status\":\"0\",\"msisdn\":\"15555551212\",\"network\":\"US-FIXED\",\"messageId\":\"02000000AE70FFFF\",\"remainingBalance\":7.546,\"messagePrice\":0.0048}]}")));
_request.Setup(e => e.GetResponse()).Returns(resp.Object);
var request = new ShortCode.AlertRequest
{
to = "15555551212"
};
var customValues = new Dictionary<string, string>
{
{"mcount", "xyz123"}
};
var response = ShortCode.RequestAlert(request, customValues);

_mock.Verify(h => h.CreateHttp(new Uri(
string.Format("{0}/sc/us/alert/json?to={1}&api_key={2}&api_secret={3}&mcount={4}&", RestUrl, request.to, ApiKey, ApiSecret, customValues["mcount"]))),
Times.Once);
Assert.AreEqual("1", response.message_count);
Assert.AreEqual("15555551212", response.messages.First().to);
}
}
}
28 changes: 17 additions & 11 deletions Nexmo.Api/Request/ApiRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,26 @@ private static Dictionary<string, string> GetParameters(object parameters)
parameters.GetType().GetProperty(property.Name).GetValue(parameters, null).ToString());
}
return apiParams;
}

public static StringBuilder GetQueryStringBuilderFor(object parameters)
{
var apiParams = GetParameters(parameters);

apiParams.Add("api_key", ConfigurationManager.AppSettings["Nexmo.api_key"]);
apiParams.Add("api_secret", ConfigurationManager.AppSettings["Nexmo.api_secret"]);

var sb = new StringBuilder();
foreach (var key in apiParams.Keys)
{
sb.AppendFormat("{0}={1}&", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(apiParams[key]));
}
return sb;
}

public static string DoRequest(Uri uri, object parameters)
{
var apiParams = GetParameters(parameters);

apiParams.Add("api_key", ConfigurationManager.AppSettings["Nexmo.api_key"]);
apiParams.Add("api_secret", ConfigurationManager.AppSettings["Nexmo.api_secret"]);

var sb = new StringBuilder();
foreach (var key in apiParams.Keys)
{
sb.AppendFormat("{0}={1}&", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(apiParams[key]));
}
{
var sb = GetQueryStringBuilderFor(parameters);

return DoRequest(new Uri(uri, "?" + sb));
}
Expand Down
54 changes: 50 additions & 4 deletions Nexmo.Api/ShortCode.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,53 @@
namespace Nexmo.Api
using System;
using System.Collections.Generic;
using System.Web;
using Newtonsoft.Json;
using Nexmo.Api.Request;

namespace Nexmo.Api
{
public static class ShortCode
{
// TODO
{
public class TwoFactorAuthRequest
{
public string to { get; set; }
public int? pin { get; set; }
[JsonProperty("client-ref")]
public string clientRef { get; set; }
}

public class AlertRequest
{
public string to { get; set; }
[JsonProperty("status-report-req")]
public string statusReportReq { get; set; }
[JsonProperty("client-ref")]
public string clientRef { get; set; }
public int? template { get; set; }
public string type { get; set; }
}

public static SMS.SMSResponse RequestTwoFactorAuth(TwoFactorAuthRequest request)
{
if (!request.pin.HasValue)
{
request.pin = new Random().Next(0, 9999);
}

var json = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(ShortCode), "/sc/us/2fa/json"), request);
return JsonConvert.DeserializeObject<SMS.SMSResponse>(json);
}

public static SMS.SMSResponse RequestAlert(AlertRequest request, Dictionary<string, string> customValues)
{
var sb = ApiRequest.GetQueryStringBuilderFor(request);
foreach (var key in customValues.Keys)
{
sb.AppendFormat("{0}={1}&", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(customValues[key]));
}

var json = ApiRequest.DoRequest(ApiRequest.GetBaseUriFor(typeof(ShortCode), "/sc/us/alert/json?" + sb));
return JsonConvert.DeserializeObject<SMS.SMSResponse>(json);
}
}
}
}
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ API support status:
* [X] Messages
* [X] Rejections
* Short Code
* [ ] 2FA
* [ ] Event-based
* [X] 2FA
* [X] Alerts
* [ ] Marketing
* SMS
* [X] Send
Expand Down

0 comments on commit a97bee5

Please sign in to comment.