Skip to content

Commit

Permalink
Merge pull request #41 from OpenBapul/dev
Browse files Browse the repository at this point in the history
1.1.2
  • Loading branch information
gongdo authored May 17, 2017
2 parents 8cccdab + dd00cea commit 1b09bca
Show file tree
Hide file tree
Showing 19 changed files with 237 additions and 43 deletions.
24 changes: 12 additions & 12 deletions Samples/Sample.AspNetCore/Sample.AspNetCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@

<ItemGroup>
<PackageReference Include="BundlerMinifier.Core" Version="2.4.337" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="1.1.2" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.2" />
</ItemGroup>

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class RequestDirectPaymentModel
/// (required)카드번호(dddd-dddd-dddd-dddd)
/// </summary>
[Required]
[RegularExpression(@"^(\d{4})-(\d{4})-(\d{4})-(\d{4})$")]
[Iamport.RestApi.Models.CreditCardNumber]
[Display(Name = "카드번호(dddd-dddd-dddd-dddd)")]
public string CardNumber { get; set; }
/// <summary>
Expand All @@ -44,7 +44,7 @@ public class RequestDirectPaymentModel
/// (required)생년월일6자리(법인카드의 경우 사업자등록번호10자리)
/// </summary>
[Required]
[RegularExpression(@"^\d{6}$|^\d{10}$")]
[CreditCardAuthenticationNumber]
[Display(Name = "생년월일6자리(법인카드의 경우 사업자등록번호10자리)")]
public string AuthenticationNumber { get; set; }
/// <summary>
Expand Down
4 changes: 3 additions & 1 deletion src/Iamport.RestApi/ApiPathUtility.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Linq;
using System.Net;

namespace Iamport.RestApi
{
Expand Down Expand Up @@ -36,7 +38,7 @@ public static string Build(string baseUrlOrPath, string addedUrlOrPath)
{
return baseUrlOrPath
.Split(PathSeparators, StringSplitOptions.RemoveEmptyEntries)[0]
+ addedUrlOrPath.Substring(1);
+ "/" + addedUrlOrPath.Substring(2);
}
return baseUrlOrPath.Trim('/') + "/" + addedUrlOrPath.TrimStart('/');
}
Expand Down
5 changes: 3 additions & 2 deletions src/Iamport.RestApi/Apis/PaymentsApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Net.Http;
using Iamport.RestApi.Extensions;
using System.ComponentModel.DataAnnotations;
using System.Net;

namespace Iamport.RestApi.Apis
{
Expand Down Expand Up @@ -116,7 +117,7 @@ public async Task<Payment> GetByTransactionIdAsync(string transactionId)
}
var request = new IamportRequest
{
ApiPathAndQueryString = GetPathAndQuerystring($"find/{transactionId}"),
ApiPathAndQueryString = GetPathAndQuerystring($"find/{WebUtility.UrlEncode(transactionId)}"),
Method = HttpMethod.Get,
};
return await SendRequestAsync<object, Payment>(request);
Expand All @@ -137,7 +138,7 @@ public async Task<PaymentPreparation> GetPreparationAsync(string transactionId)
}
var request = new IamportRequest
{
ApiPathAndQueryString = GetPathAndQuerystring($"prepare/{transactionId}"),
ApiPathAndQueryString = GetPathAndQuerystring($"prepare/{WebUtility.UrlEncode(transactionId)}"),
Method = HttpMethod.Get,
};
return await SendRequestAsync<object, PaymentPreparation>(request);
Expand Down
3 changes: 2 additions & 1 deletion src/Iamport.RestApi/Apis/SubscribeApi.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Iamport.RestApi.Models;
using System;
using System.ComponentModel.DataAnnotations;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

Expand Down Expand Up @@ -205,7 +206,7 @@ private string GetPaymentsPathAndQuerystring(string pathAndQuerystring)
}
private string GetCustomersPath(string customerId)
{
return ApiPathUtility.Build(CustomersPath, customerId);
return ApiPathUtility.Build(CustomersPath, WebUtility.UrlEncode(customerId));
}

private async Task<TResult> SendRequestAsync<TRequest, TResult>(IamportRequest<TRequest> request)
Expand Down
6 changes: 3 additions & 3 deletions src/Iamport.RestApi/Iamport.RestApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<Description>Iamport.RestApi .NET Client</Description>
<VersionPrefix>1.1.1</VersionPrefix>
<VersionPrefix>1.1.2</VersionPrefix>
<TargetFrameworks>netstandard1.3;net45</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<AssemblyName>Iamport.RestApi</AssemblyName>
Expand All @@ -20,13 +20,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0" />
<PackageReference Include="System.ComponentModel.Annotations" Version="4.3.0" />
<PackageReference Include="System.Net.Http" Version="4.3.1" />
<PackageReference Include="System.Net.Http" Version="4.3.2" />
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;

namespace Iamport.RestApi.Models
{
/// <summary>
/// 아임포트에서 허용하는 신용카드 인증 번호 형식인지 여부를 검사합니다.
/// </summary>
public class CreditCardAuthenticationNumberAttribute : RegularExpressionAttribute
{
/// <summary>
/// 기본 아임포트 신용카드 인증 번호 형식으로 초기화합니다.
/// </summary>
public CreditCardAuthenticationNumberAttribute() : base(@"^\d{6}$|^\d{10}$")
{
}
}
}
35 changes: 35 additions & 0 deletions src/Iamport.RestApi/Models/CreditCardExpiryAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.ComponentModel.DataAnnotations;

namespace Iamport.RestApi.Models
{
/// <summary>
/// 아임포트에서 허용하는 신용카드 유효기간 형식인지 여부를 검사합니다.
/// </summary>
public class CreditCardExpiryAttribute : RegularExpressionAttribute
{
/// <summary>
/// 기본 아임포트 유효기간 번호 형식으로 초기화합니다.
/// </summary>
public CreditCardExpiryAttribute() : base(@"^\d{4}-\d{2}$")
{
}

/// <inheritDocs />
public override bool IsValid(object value)
{
if (base.IsValid(value))
{
if (string.IsNullOrEmpty(value?.ToString()))
{
return true;
}
int.TryParse((value.ToString()).Substring(0, 4), out int year);
int.TryParse((value.ToString()).Substring(5, 2), out int month);
var expiry = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero).AddMonths(1).AddSeconds(-1);
return expiry > DateTimeOffset.Now;
}
return false;
}
}
}
17 changes: 17 additions & 0 deletions src/Iamport.RestApi/Models/CreditCardNumberAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;

namespace Iamport.RestApi.Models
{
/// <summary>
/// 아임포트에서 허용하는 신용카드 번호 형식인지 여부를 검사합니다.
/// </summary>
public class CreditCardNumberAttribute : RegularExpressionAttribute
{
/// <summary>
/// 기본 아임포트 신용카드 번호 형식으로 초기화합니다.
/// </summary>
public CreditCardNumberAttribute() : base(@"^\d{4}-\d{4}-\d{4}-\d{3,4}$")
{
}
}
}
6 changes: 3 additions & 3 deletions src/Iamport.RestApi/Models/CustomerRegistration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ public class CustomerRegistration
/// </summary>
[JsonProperty("card_number")]
[Required]
[RegularExpression(@"^\d{4}-\d{4}-\d{4}-\d{4}$")]
[CreditCardNumber]
public string CardNumber { get; set; }
/// <summary>
/// (required)카드 유효기간(YYYY-MM)
/// </summary>
[JsonProperty("expiry")]
[Required]
[RegularExpression(@"^\d{4}-\d{2}$")]
[CreditCardExpiry]
public string Expiry { get; set; }
/// <summary>
/// (required)생년월일6자리(법인카드의 경우 사업자등록번호10자리)
/// </summary>
[JsonProperty("birth")]
[Required]
[RegularExpression(@"^\d{6}$|^\d{10}$")]
[CreditCardAuthenticationNumber]
public string AuthenticationNumber { get; set; }
/// <summary>
/// 카드 비밀번호 앞 두자리(법인카드의 경우 생략)
Expand Down
6 changes: 3 additions & 3 deletions src/Iamport.RestApi/Models/DirectPaymentRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,21 @@ public class DirectPaymentRequest
/// </summary>
[JsonProperty("card_number")]
[Required]
[RegularExpression(@"^\d{4}-\d{4}-\d{4}-\d{4}$")]
[CreditCardNumber]
public string CardNumber { get; set; }
/// <summary>
/// (required)카드 유효기간(YYYY-MM)
/// </summary>
[JsonProperty("expiry")]
[Required]
[RegularExpression(@"^\d{4}-\d{2}$")]
[CreditCardExpiry]
public string Expiry { get; set; }
/// <summary>
/// (required)생년월일6자리(법인카드의 경우 사업자등록번호10자리)
/// </summary>
[JsonProperty("birth")]
[Required]
[RegularExpression(@"^\d{6}$|^\d{10}$")]
[CreditCardAuthenticationNumber]
public string AuthenticationNumber { get; set; }
/// <summary>
/// 카드 비밀번호 앞 두자리(법인카드의 경우 생략)
Expand Down
6 changes: 3 additions & 3 deletions src/Iamport.RestApi/Models/SchedulePaymentsRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,19 +40,19 @@ public class SchedulePaymentsRequest
/// (optional)카드번호(dddd-dddd-dddd-dddd)
/// </summary>
[JsonProperty("card_number")]
[RegularExpression(@"^\d{4}-\d{4}-\d{4}-\d{4}$")]
[CreditCardNumber]
public string CardNumber { get; set; }
/// <summary>
/// (optional)카드 유효기간(YYYY-MM)
/// </summary>
[JsonProperty("expiry")]
[RegularExpression(@"^\d{4}-\d{2}$")]
[CreditCardExpiry]
public string Expiry { get; set; }
/// <summary>
/// (required)생년월일6자리(법인카드의 경우 사업자등록번호10자리)
/// </summary>
[JsonProperty("birth")]
[RegularExpression(@"^\d{6}$|^\d{10}$")]
[CreditCardAuthenticationNumber]
public string AuthenticationNumber { get; set; }
/// <summary>
/// 카드 비밀번호 앞 두자리(법인카드의 경우 생략)
Expand Down
3 changes: 2 additions & 1 deletion test/Iamport.RestApi.Tests/ApiPathUtilTest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Xunit;
using System.Net;
using Xunit;

namespace Iamport.RestApi.Tests
{
Expand Down
14 changes: 9 additions & 5 deletions test/Iamport.RestApi.Tests/Apis/PaymentsApiTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -232,21 +232,25 @@ await Assert.ThrowsAsync<IamportResponseException>(
() => sut.GetByIamportIdAsync(expectedRequest));
}

[Fact]
public async Task GetByTransactionIdAsync_requests_proper_uri()
[Theory]
[InlineData("abcd")]
[InlineData("abcd:가나다라")]
[InlineData("1234-가나다라-1234")]
[InlineData("1234/가나다라/1234")]
[InlineData("1234?가나다라#1234")]
public async Task GetByTransactionIdAsync_requests_proper_uri(string transactionId)
{
// arrange
var expectedRequest = Guid.NewGuid().ToString();
var expectedResult = new IamportResponse<Payment>
{
HttpStatusCode = HttpStatusCode.OK,
};
var expectedPath = $"payments/find/{expectedRequest}";
var expectedPath = $"payments/find/{WebUtility.UrlEncode(transactionId)}";
var client = GetMockClient(expectedResult);
var sut = new PaymentsApi(client);

// act
var result = await sut.GetByTransactionIdAsync(expectedRequest);
var result = await sut.GetByTransactionIdAsync(transactionId);

// assert
Mock.Get(client)
Expand Down
16 changes: 10 additions & 6 deletions test/Iamport.RestApi.Tests/Apis/SubscribeApiTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public async Task RegisterCustomerAsync_requests_proper_api()
{
AuthenticationNumber = "123456",
CardNumber = "1234-1234-1234-1234",
Expiry = "1234-12",
Expiry = "2200-12",
Id = Guid.NewGuid().ToString(),
PartialPassword = "12",
};
Expand Down Expand Up @@ -146,11 +146,15 @@ await Assert.ThrowsAsync<ValidationException>(
() => sut.RegisterCustomerAsync(aRequest));
}

[Fact]
public async Task GetCustomerAsync_requests_proper_api()
[Theory]
[InlineData("customer")]
[InlineData("홍길동")]
[InlineData("abcd:홍길동")]
[InlineData("abcd/홍길동")]
[InlineData("abcd?홍길동")]
public async Task GetCustomerAsync_requests_proper_api(string customerId)
{
// arrange
var customerId = Guid.NewGuid().ToString();
var expectedResult = new IamportResponse<Customer>
{
HttpStatusCode = HttpStatusCode.OK,
Expand All @@ -173,7 +177,7 @@ public async Task GetCustomerAsync_requests_proper_api()
It.Is<IamportRequest>(req =>
req.Method == HttpMethod.Get
&& req.Content == null
&& req.ApiPathAndQueryString.EndsWith($"subscribe/customers/{customerId}"))));
&& req.ApiPathAndQueryString.EndsWith($"subscribe/customers/{WebUtility.UrlEncode(customerId)}"))));
}

[Fact]
Expand Down Expand Up @@ -216,7 +220,7 @@ public async Task DoDirectPaymentAsync_requests_proper_api()
TransactionId = Guid.NewGuid().ToString(),
AuthenticationNumber = "123456",
CardNumber = "1234-1234-1234-1234",
Expiry = "1234-12",
Expiry = "2200-12",
PartialPassword = "12",
};
var expectedResult = new IamportResponse<Payment>
Expand Down
2 changes: 1 addition & 1 deletion test/Iamport.RestApi.Tests/Iamport.RestApi.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="Moq" Version="4.7.8" />
<PackageReference Include="Moq" Version="4.7.10" />
<PackageReference Include="System.Diagnostics.TraceSource" Version="4.3.0" />
<PackageReference Include="Microsoft.DotNet.InternalAbstractions" Version="1.0.0" />
</ItemGroup>
Expand Down
Loading

0 comments on commit 1b09bca

Please sign in to comment.