public async Task report_unconsumed_attribute() { const string response = @" <?xml version=""1.0"" encoding=""UTF-8""?> <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""0"" retransmit=""n"" newAttribute=""42""> <RequestCode>COUPON_INQUIRY</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>42</SVAN> <AccountCurrency>DKK</AccountCurrency> <ExchangeRate>1.00</ExchangeRate> <ResponseCode>A</ResponseCode> <DisplayMessage>There are no eligible coupons for this card.</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var e = await Assert.ThrowsAsync <OracleHospitalityClientException>(() => sut.CouponInquiryAsync(new AccountNumber("42"))); Assert.Contains(@"<SVCMessage newAttribute=""42"" />", e.InnerException.Message); } }
public async Task account_already_exists_and_closed() { const string response = @" <SVCMessage language=""en-US"" retransmit=""n"" sequence=""00"" currency=""DKK"" posIntfcVersion=""1.00"" posIntfcName=""posInterfaceName"" version=""1"" hostVersion=""9.1.0000.2301""> <RequestCode>POINT_ISSUE</RequestCode> <TraceID>190829140000N000000</TraceID> <Amount>0</Amount> <SVAN>2200000</SVAN> <ResponseCode hostCode=""106"">D</ResponseCode> <DisplayMessage>This account cannot be used, it is closed</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-29T14:00:00"))) { var e = await Assert.ThrowsAsync <OracleHospitalityClientException>(() => sut.PointIssueAsync(new AccountNumber("2200000"))); Assert.Equal("106", e.Code); Assert.Equal("This account cannot be used, it is closed", e.Message); } }
public async Task invalid_coupon_code() { const string response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""0"" retransmit=""n""> <RequestCode>SV_ACCEPT_COUPON</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>123</SVAN> <ResponseCode hostCode=""93"">D</ResponseCode> <DisplayMessage>Coupon (NotExist) cannot be found</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var e = await Assert.ThrowsAsync <OracleHospitalityClientException>(() => sut.CouponAcceptAsync(new AccountNumber("123"), new CouponCode("NotExist"))); Assert.Equal("93", e.Code); Assert.Equal("Coupon (NotExist) cannot be found", e.Message); } }
public async Task invalid_account() { const string response = @" <?xml version=""1.0""?> <SVCMessage language=""en-US"" retransmit=""n"" sequence=""00"" currency=""DKK"" posIntfcVersion=""1.00"" posIntfcName=""posInterfaceName"" version=""1"" hostVersion=""9.1.0000.2301""> <RequestCode>COUPON_INQUIRY</RequestCode> <TraceID>190820113916N000000</TraceID> <Amount>0.00</Amount> <SVAN>123</SVAN> <ResponseCode hostCode=""1"">D</ResponseCode> <DisplayMessage>There is no account number or the account number (123) is too short</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-20T11:39:16"))) { var e = await Assert.ThrowsAsync <OracleHospitalityClientException>( () => sut.CouponInquiryAsync(new AccountNumber("123"))); Assert.Equal("1", e.Code); Assert.Equal("There is no account number or the account number (123) is too short", e.Message); } }
public async Task loyalty_account_created_with_rule_awards_pos_print_text_non_empty() { const string response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""00"" retransmit=""n""> <RequestCode>POINT_ISSUE</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0</Amount> <SVAN>luxo7wt7mrm8rj4t0j24twi3</SVAN> <ItemType>T</ItemType> <ItemNumber>1234</ItemNumber> <AccountCurrency>DKK</AccountCurrency> <AccountBalance>0.00</AccountBalance> <LocalBalance>0.00</LocalBalance> <ExchangeRate>1.00</ExchangeRate> <ResponseCode>A</ResponseCode> <ProgramCode>lux</ProgramCode> <ProgramName>lux</ProgramName> <PointsIssued>0</PointsIssued> <BonusPointsIssued>0</BonusPointsIssued> <PrintLines> <PrintLine>LUX BENEFIT</PrintLine> </PrintLines> <DisplayMessage>Transaction Complete. </DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var actual = await sut.PointIssueAsync(new AccountNumber("luxo7wt7mrm8rj4t0j24twi3")); Assert.Equal(ItemType.Kind.Tender, actual.ItemType.Value); Assert.Equal(1234, actual.ItemNumber.Value); Assert.Equal(Currency.Kind.DKK, actual.AccountCurrency.Value); Assert.Equal(0.00m, actual.AccountBalance.Value); Assert.Equal(0.00m, actual.LocalBalance.Value); Assert.Equal(1.00m, actual.ExchangeRate.Value); Assert.Equal("lux", actual.ProgramCode.Value); Assert.Equal("lux", actual.ProgramName.Value); Assert.Equal(0m, actual.PointsIssued.Value); Assert.Equal(0m, actual.BonusPointsIssued.Value); Assert.Single(actual.PrintLines.Values); Assert.Equal("LUX BENEFIT", actual.PrintLines.Values[0].Value); Assert.Equal("Transaction Complete. ", actual.DisplayMessage.Value); } }
public async Task end_to_end() { // To create a new account, specify a non-existing account number. // Creating an account isn't part of this test because (1) accounts // can never be deleted and (2) we'd have to determine next // available account number prior to creating the account. var accountNumber = new AccountNumber("2200000"); var client = new PosClient(_messageSequencingStrategy, _executor); var pointIssue = await client.PointIssueAsync(accountNumber); var couponInquiry = await client.CouponInquiryAsync(pointIssue.AccountNumber); var couponCode = new CouponCode("10DKK"); var couponIssue = await client.CouponIssueAsync(accountNumber, couponCode); var couponAccept = await client.CouponAcceptAsync(accountNumber, couponIssue.CouponCode); }
public async Task valid_coupon_code() { const string response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""00"" retransmit=""n""> <RequestCode>SV_ISSUE_COUPON</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>123</SVAN> <AccountCurrency>DKK</AccountCurrency> <ExchangeRate>1.00</ExchangeRate> <ItemType>T</ItemType> <ItemNumber>1</ItemNumber> <PrintLines /> <CouponCode>1006022</CouponCode> <ResponseCode>A</ResponseCode> <DisplayMessage>Coupon (10 DKK) has been issued to this account.</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var actual = await sut.CouponIssueAsync(new AccountNumber("123"), new CouponCode("doesNotMatter")); Assert.Equal("1006022", actual.CouponCode.Value); Assert.Equal("Coupon (10 DKK) has been issued to this account.", actual.DisplayMessage.Value); Assert.Equal(ItemType.Kind.Tender, actual.ItemType.Value); Assert.Equal(1, actual.ItemNumber.Value); Assert.Empty(actual.PrintLines.Values); Assert.Equal(Currency.Kind.DKK, actual.AccountCurrency.Value); Assert.Equal(1.00m, actual.ExchangeRate.Value); } }
public LoginResponse parseRequest() { PosClient posClient = new PosClient("127.0.0.1", 4245); posClient.ConnectAndLogin(request.merchantIdentifier, request.merchantSecret, Payworks.PayClient.Environment.TEST, (devices, error) => { if (error != null) { Console.WriteLine(error); } if (devices != null) { CyberSourceClass.dev = devices[0]; } }); LoginResponse resp = new LoginResponse(); resp.merchantid = request.merchantId; resp.status = "OK"; return(resp); }
public void startDeviceTransaction() { transactionParameters = new TransactionParameters.Builder().Charge(8, Currency.USD).Subject("Bunch of bamboozles").CustomIdentifier("123abc123").Build(); transactionProcessParameters = new TransactionProcessParameters.Builder().Build(); posClient = new PosClient("127.0.0.1", 4245); switch (posClient.State) { case ClientState.INITIALIZED: Console.WriteLine("Connection was initailized but not connected"); break; case ClientState.CONNECTED: Console.WriteLine("Connection was initailized and we are connected"); break; case ClientState.DISCONNECTED: Console.WriteLine("Connection was initailized but we are disconnected"); break; } ConnectAndLoginCompleted c = new ConnectAndLoginCompleted(handleConfirmation); posClient.ConnectAndLogin(mercIdentifier, merchSecret, Payworks.PayClient.Environment.TEST, c); if (posClient.State.Equals(ClientState.CONNECTED)) { Console.WriteLine("we got a connection. Press any key to continue."); Console.ReadLine(); } Console.WriteLine("Waiting for transaction task."); Console.ReadLine(); posClient.GetTransactionModule().GetTransaction("123abc123", (transaction, error) => { if (transaction.Status.Equals(TransactionState.ACCEPTED)) { Console.WriteLine("Test transaction was accepted. Press any key to exit."); Console.ReadLine(); } }); }
public async Task with_both_unconsumed_element_and_backend_reporting_error_unconsumed_exception_takes_precedence() { // Only check ResponseCode and throw exception after validating // every element and attribute. Otherwise, we miss the opportunity // to catch responses of unanticipated forms. const string response = @" <?xml version=""1.0"" encoding=""UTF-8""?> <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""0"" retransmit=""n""> <RequestCode>COUPON_INQUIRY</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>42</SVAN> <ResponseCode hostCode=""93"">D</ResponseCode> <DisplayMessage>Coupon (NotExist) cannot be found</DisplayMessage> <NewElement>42</NewElement> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var e = await Assert.ThrowsAsync <OracleHospitalityClientException>(() => sut.CouponInquiryAsync(new AccountNumber("42"))); Assert.Contains( "<SVCMessage><NewElement>42</NewElement></SVCMessage>", e.InnerException.Message.Replace(Environment.NewLine, "").Replace(" ", "")); } }
public async Task valid_coupon_code() { // For SV_ACCEPT_COUPON response, SVAN changes meaning from // mirroring the request SVAN to holding the issued CouponCode. const string response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""00"" retransmit=""n""> <RequestCode>SV_ACCEPT_COUPON</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>1005016</SVAN> <ItemType>D</ItemType> <ItemNumber>150</ItemNumber> <ResponseCode>A</ResponseCode> <DisplayMessage>10 DKK Coupon accepted</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var actual = await sut.CouponAcceptAsync(new AccountNumber("doesNotMatter"), new CouponCode("1005016")); Assert.Equal(ItemType.Kind.Discount, actual.ItemType.Value); Assert.Equal(150, actual.ItemNumber.Value); Assert.Equal("10 DKK Coupon accepted", actual.DisplayMessage.Value); Assert.Equal("1005016", actual.AccountNumber.Value); } }
public async Task valid_account_with_two_coupons() { const string response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""00"" retransmit=""n""> <RequestCode>COUPON_INQUIRY</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>123</SVAN> <AccountCurrency>DKK</AccountCurrency> <ExchangeRate>1.00</ExchangeRate> <ResponseCode>A</ResponseCode> <Actions> <Action> <Type tid=""12"">Accept Coupon</Type> <Data pid=""9"">1005016</Data> <Code>10DKK</Code> <Text>Coupon: 10 DKK, Always Valid</Text> </Action> <Action> <Type tid=""12"">Accept Coupon</Type> <Data pid=""9"">1006014</Data> <Code>10DKK</Code> <Text>Coupon: 10 DKK, Always Valid</Text> </Action> </Actions> <PrintLines/> <DisplayMessage>There are 2 eligible coupons for this card.</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var actual = await sut.CouponInquiryAsync(new AccountNumber("123")); Assert.Equal("There are 2 eligible coupons for this card.", actual.DisplayMessage.Value); Assert.Equal(2, actual.Actions.Count); var a = actual.Actions[0]; AssertAction( a, ActionType.TransactionId.AcceptCoupon, ActionData.PromptId.PleaseEnterCoupon, "1005016", "10DKK", "Coupon: 10 DKK, Always Valid"); var b = actual.Actions[1]; AssertAction( b, ActionType.TransactionId.AcceptCoupon, ActionData.PromptId.PleaseEnterCoupon, "1006014", "10DKK", "Coupon: 10 DKK, Always Valid"); } }
public async Task valid_account_with_one_coupon() { var response = @" <SVCMessage hostVersion=""9.1.0000.2301"" version=""1"" posIntfcName=""posInterfaceName"" posIntfcVersion=""1.00"" language=""en-US"" currency=""DKK"" sequence=""00"" retransmit=""n""> <RequestCode>COUPON_INQUIRY</RequestCode> <TraceID>190826145135N000000</TraceID> <Amount>0.00</Amount> <SVAN>123</SVAN> <AccountCurrency>DKK</AccountCurrency> <ExchangeRate>1.00</ExchangeRate> <ResponseCode>A</ResponseCode> <Actions> <Action> <Type tid=""12"">Accept Coupon</Type> <Data pid=""9"">1004019</Data> <Code>10DKK</Code> <Text>Coupon: 10 DKK, Always Valid</Text> </Action> </Actions> <PrintLines /> <DisplayMessage>There is an eligible coupon for this card.</DisplayMessage> </SVCMessage>"; var handler = CreateMockMessageHandler(HttpStatusCode.OK, CreateSoapResponse(response.Trim())); var executor = new OracleHospitalityExecutor(_options, _executorLogger, new HttpClient(handler)); var sut = new PosClient(_messageSequencingStrategy, executor); using (new TimeProviderTestScope(() => DateTime.Parse("2019-08-26T14:51:35"))) { var actual = await sut.CouponInquiryAsync(new AccountNumber("123")); // Attributes Assert.Equal("9.1.0000.2301", actual.HostVersion.Value); Assert.Equal("1", actual.Version.Value); Assert.Equal("posInterfaceName", actual.PosInterfaceName.Value); Assert.Equal("en-US", actual.Language.Value); Assert.Equal(Currency.Kind.DKK, actual.Currency.Value); Assert.Equal(0, actual.SequenceNumber.Value); Assert.Equal(Transmission.Kind.Normal, actual.Transmission.Value); // Elements Assert.Equal(TransactionKind.COUPON_INQUIRY, actual.RequestCode.Value); Assert.Equal("190826145135N000000", actual.TraceId.ToString()); Assert.Equal(0, actual.Amount.Value); Assert.Equal("123", actual.AccountNumber.Value); Assert.Equal(Currency.Kind.DKK, actual.AccountCurrency.Value); Assert.Equal(1.00m, actual.ExchangeRate.Value); Assert.Equal(ResponseCode.Kind.Approved, actual.ResponseCode.Value); Assert.Single(actual.Actions); var action = actual.Actions[0]; AssertAction( action, ActionType.TransactionId.AcceptCoupon, ActionData.PromptId.PleaseEnterCoupon, "1004019", "10DKK", "Coupon: 10 DKK, Always Valid"); Assert.Empty(actual.PrintLines.Values); Assert.Equal("There is an eligible coupon for this card.", actual.DisplayMessage.Value); } }