diff options
| -rw-r--r-- | src/purchasing/inapppurchase/ubuntu/qubuntuinapppurchasebackend.cpp | 23 | ||||
| -rw-r--r-- | tests/auto/purchasing/ubuntu/tst_qinappstore_ubuntu.cpp | 86 |
2 files changed, 98 insertions, 11 deletions
diff --git a/src/purchasing/inapppurchase/ubuntu/qubuntuinapppurchasebackend.cpp b/src/purchasing/inapppurchase/ubuntu/qubuntuinapppurchasebackend.cpp index cc3c556..a879e77 100644 --- a/src/purchasing/inapppurchase/ubuntu/qubuntuinapppurchasebackend.cpp +++ b/src/purchasing/inapppurchase/ubuntu/qubuntuinapppurchasebackend.cpp @@ -208,19 +208,22 @@ void QUbuntuInAppPurchaseBackend::itemObserver(const QString &sku, if (prev == PAY_PACKAGE_ITEM_STATUS_PURCHASING) { - if ((status == PAY_PACKAGE_ITEM_STATUS_APPROVED) || - (status == PAY_PACKAGE_ITEM_STATUS_PURCHASED)) - { - auto item = pay_package_get_item(m_package.data(), qUtf8Printable(sku)); + auto item = pay_package_get_item(m_package.data(), qUtf8Printable(sku)); + + switch (status) { + case PAY_PACKAGE_ITEM_STATUS_APPROVED: + case PAY_PACKAGE_ITEM_STATUS_PURCHASED: emitTransactionReadyForItem(item, QInAppTransaction::PurchaseApproved); - pay_item_unref(item); - } - else if (status == PAY_PACKAGE_ITEM_STATUS_NOT_PURCHASED) - { - auto item = pay_package_get_item(m_package.data(), qUtf8Printable(sku)); + break; + case PAY_PACKAGE_ITEM_STATUS_NOT_PURCHASED: + case PAY_PACKAGE_ITEM_STATUS_UNKNOWN: emitTransactionReadyForItem(item, QInAppTransaction::PurchaseFailed); - pay_item_unref(item); + break; + default: + qCritical() << "Unexpected status transition to:" << status; + break; } + pay_item_unref(item); } m_statuses[sku] = status; diff --git a/tests/auto/purchasing/ubuntu/tst_qinappstore_ubuntu.cpp b/tests/auto/purchasing/ubuntu/tst_qinappstore_ubuntu.cpp index 6eae435..adf6cee 100644 --- a/tests/auto/purchasing/ubuntu/tst_qinappstore_ubuntu.cpp +++ b/tests/auto/purchasing/ubuntu/tst_qinappstore_ubuntu.cpp @@ -71,6 +71,8 @@ private slots: void registeredProducts(); void restorePurchases(); void successfulPurchase(); + void purchaseCancelled(); + void purchaseAccessDenied(); private: @@ -91,7 +93,9 @@ private: QMap<QString,IAP> m_iaps { { "sword", { 0, 0, 0, "available", "$1", QInAppProduct::Consumable, "sword", "Sword", "A Sword." } }, { "shield", { 1000, 0, 100, "approved", "$1", QInAppProduct::Unlockable, "shield", "Shield", "A Shield." } }, - { "amulet", { 1000, 1010, 101, "purchased", "$1", QInAppProduct::Unlockable, "amulet", "Amulet", "An Amulet." } } + { "amulet", { 1000, 1010, 101, "purchased", "$1", QInAppProduct::Unlockable, "amulet", "Amulet", "An Amulet." } }, + { "cancel", { 0, 0, 0, "available", "$0", QInAppProduct::Unlockable, "cancel", "Cancel", "For testing cancelling of purchase." } }, + { "denied", { 0, 0, 0, "available", "$0", QInAppProduct::Unlockable, "denied", "Denied", "For testing access denied by trust store." } } }; void verifyProduct(const QInAppProduct *product, const IAP item) { @@ -333,6 +337,86 @@ void tst_QInAppStore::successfulPurchase() QCOMPARE(finalizedSku, sku); } +void tst_QInAppStore::purchaseCancelled() +{ + // SETUP + + StoreMock mock (PACKAGE_S, storeItems()); + + // instantiate a store with the registered products + QInAppStore store(this); + for (const auto &item : m_iaps) + store.registerProduct(item.type, item.sku); + + // Set our expectations. + + const int expectedRegistered = 0; + const int expectedUnknown = 0; + const int expectedReady = 1; + const auto sku = QString::fromUtf8("cancel"); + const auto expectedTimeStamp = QDateTime::currentDateTime(); + + // TEST: PURCHASE + + QSignalSpy registered (&store, SIGNAL(productRegistered(QInAppProduct *))); + QSignalSpy unknown (&store, SIGNAL(productUnknown(QInAppProduct::ProductType,QString))); + QSignalSpy ready (&store, SIGNAL(transactionReady(QInAppTransaction *))); + + auto product = store.registeredProduct(sku); + QVERIFY(product != nullptr); + product->purchase(); + + QTRY_COMPARE (ready.length(), expectedReady); + QCOMPARE (registered.length(), expectedRegistered); + QCOMPARE (unknown.length(), expectedUnknown); + auto transaction = ready.at(0).at(0).value<QInAppTransaction *>(); + QVERIFY (transaction->errorString().isEmpty()); + QCOMPARE (transaction->failureReason(), QInAppTransaction::NoFailure); + QVERIFY (transaction->orderId() != 0); + verifyProduct(transaction->product(), m_iaps[sku]); + QCOMPARE (transaction->status(), QInAppTransaction::PurchaseFailed); +} + +void tst_QInAppStore::purchaseAccessDenied() +{ + // SETUP + + StoreMock mock (PACKAGE_S, storeItems()); + + // instantiate a store with the registered products + QInAppStore store(this); + for (const auto &item : m_iaps) + store.registerProduct(item.type, item.sku); + + // Set our expectations. + + const int expectedRegistered = 0; + const int expectedUnknown = 0; + const int expectedReady = 1; + const auto sku = QString::fromUtf8("denied"); + const auto expectedTimeStamp = QDateTime::currentDateTime(); + + // TEST: PURCHASE + + QSignalSpy registered (&store, SIGNAL(productRegistered(QInAppProduct *))); + QSignalSpy unknown (&store, SIGNAL(productUnknown(QInAppProduct::ProductType,QString))); + QSignalSpy ready (&store, SIGNAL(transactionReady(QInAppTransaction *))); + + auto product = store.registeredProduct(sku); + QVERIFY(product != nullptr); + product->purchase(); + + QTRY_COMPARE (ready.length(), expectedReady); + QCOMPARE (registered.length(), expectedRegistered); + QCOMPARE (unknown.length(), expectedUnknown); + auto transaction = ready.at(0).at(0).value<QInAppTransaction *>(); + QVERIFY (transaction->errorString().isEmpty()); + QCOMPARE (transaction->failureReason(), QInAppTransaction::NoFailure); + QVERIFY (transaction->orderId() != 0); + verifyProduct(transaction->product(), m_iaps[sku]); + QCOMPARE (transaction->status(), QInAppTransaction::PurchaseFailed); +} + QTEST_GUILESS_MAIN(tst_QInAppStore) |
