using Moq; using Xunit; using RestSharp; using Amazon.SellingPartnerAPIAA; using System; namespace Amazon.SellingPartnerAPIAATests { public class AWSSigV4SignerTest { private const string TestAccessKeyId = "aKey"; private const string TestSecretKey = "sKey"; private const string TestRegion = "us-east-1"; private const string TestResourcePath = "iam/user"; private const string TestHost = "sellingpartnerapi.amazon.com"; private RestRequest request; private AWSSigV4Signer sigV4SignerUnderTest; private Mock mockAWSSignerHelper; public AWSSigV4SignerTest() { request = new RestRequest(TestResourcePath, Method.GET); AWSAuthenticationCredentials authenticationCredentials = new AWSAuthenticationCredentials { AccessKeyId = TestAccessKeyId, SecretKey = TestSecretKey, Region = TestRegion }; mockAWSSignerHelper = new Mock(); sigV4SignerUnderTest = new AWSSigV4Signer(authenticationCredentials); sigV4SignerUnderTest.AwsSignerHelper = mockAWSSignerHelper.Object; } [Fact] public void TestSignRequest() { DateTime signingDate = DateTime.UtcNow; string expectedHashedCanonicalRequest = "b7a5ea4c3179fcebed77f19ccd7d85795d4b7a1810709b55fa7ad3fd79ab6adc"; string expectedSignedHeaders = "testSignedHeaders"; string expectedSignature = "testSignature"; string expectedStringToSign = "testStringToSign"; mockAWSSignerHelper.Setup(signerHelper => signerHelper.SetDateAndHostHeaders(request, TestHost)) .Returns(signingDate); mockAWSSignerHelper.Setup(signerHelper => signerHelper.ExtractCanonicalURIParameters(request.Resource)) .Returns("testURIParameters"); mockAWSSignerHelper.Setup(signerHelper => signerHelper.ExtractCanonicalQueryString(request)) .Returns("testCanonicalQueryString"); mockAWSSignerHelper.Setup(signerHelper => signerHelper.ExtractCanonicalHeaders(request)) .Returns("testCanonicalHeaders"); mockAWSSignerHelper.Setup(signerHelper => signerHelper.ExtractSignedHeaders(request)) .Returns(expectedSignedHeaders); mockAWSSignerHelper.Setup(signerHelper => signerHelper.HashRequestBody(request)) .Returns("testHashRequestBody"); mockAWSSignerHelper.Setup(signerHelper => signerHelper.BuildStringToSign(signingDate, expectedHashedCanonicalRequest, TestRegion)) .Returns(expectedStringToSign); mockAWSSignerHelper.Setup(signerHelper => signerHelper.CalculateSignature(expectedStringToSign, signingDate, TestSecretKey, TestRegion)) .Returns(expectedSignature); IRestRequest actualRestRequest = sigV4SignerUnderTest.Sign(request, TestHost); mockAWSSignerHelper.Verify(signerHelper => signerHelper.SetDateAndHostHeaders(request, TestHost)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalURIParameters(request.Resource)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalQueryString(request)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractCanonicalHeaders(request)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.ExtractSignedHeaders(request)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.HashRequestBody(request)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.BuildStringToSign(signingDate, expectedHashedCanonicalRequest, TestRegion)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.CalculateSignature(expectedStringToSign, signingDate, TestSecretKey, TestRegion)); mockAWSSignerHelper.Verify(signerHelper => signerHelper.AddSignature(request, TestAccessKeyId, expectedSignedHeaders, expectedSignature, TestRegion, signingDate)); Assert.Equal(request, actualRestRequest); } } }