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);
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
        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(" ", ""));
            }
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
        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");
            }
        }
Пример #13
0
        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);
            }
        }