paddle-python-sdk 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. examples/__init__.py +0 -0
  2. examples/catalog_management.py +166 -0
  3. examples/event_polling.py +56 -0
  4. examples/get_products.py +46 -0
  5. examples/logger.py +31 -0
  6. paddle_billing/Client.py +201 -0
  7. paddle_billing/ConditionallyRemoveImportMeta.py +14 -0
  8. paddle_billing/Entities/Address.py +44 -0
  9. paddle_billing/Entities/Adjustment.py +45 -0
  10. paddle_billing/Entities/Adjustments/AdjustmentCustomerBalance.py +18 -0
  11. paddle_billing/Entities/Adjustments/AdjustmentItem.py +26 -0
  12. paddle_billing/Entities/Adjustments/__init__.py +2 -0
  13. paddle_billing/Entities/Business.py +38 -0
  14. paddle_billing/Entities/Collections/AddressCollection.py +18 -0
  15. paddle_billing/Entities/Collections/AdjustmentCollection.py +18 -0
  16. paddle_billing/Entities/Collections/BusinessCollection.py +18 -0
  17. paddle_billing/Entities/Collections/Collection.py +47 -0
  18. paddle_billing/Entities/Collections/CreditBalanceCollection.py +18 -0
  19. paddle_billing/Entities/Collections/CustomerCollection.py +18 -0
  20. paddle_billing/Entities/Collections/DiscountCollection.py +18 -0
  21. paddle_billing/Entities/Collections/EventCollection.py +18 -0
  22. paddle_billing/Entities/Collections/EventTypeCollection.py +18 -0
  23. paddle_billing/Entities/Collections/NotificationCollection.py +18 -0
  24. paddle_billing/Entities/Collections/NotificationLogCollection.py +18 -0
  25. paddle_billing/Entities/Collections/NotificationSettingCollection.py +18 -0
  26. paddle_billing/Entities/Collections/Paginator.py +29 -0
  27. paddle_billing/Entities/Collections/PriceCollection.py +18 -0
  28. paddle_billing/Entities/Collections/ProductCollection.py +18 -0
  29. paddle_billing/Entities/Collections/ReportCollection.py +18 -0
  30. paddle_billing/Entities/Collections/SubscriptionCollection.py +18 -0
  31. paddle_billing/Entities/Collections/SubscriptionPreviewCollection.py +18 -0
  32. paddle_billing/Entities/Collections/TransactionCollection.py +18 -0
  33. paddle_billing/Entities/Collections/TransactionPreviewCollection.py +18 -0
  34. paddle_billing/Entities/Collections/TransactionsDataCollection.py +18 -0
  35. paddle_billing/Entities/Collections/__init__.py +21 -0
  36. paddle_billing/Entities/CreditBalance.py +22 -0
  37. paddle_billing/Entities/Customer.py +36 -0
  38. paddle_billing/Entities/DateTime.py +43 -0
  39. paddle_billing/Entities/Discount.py +51 -0
  40. paddle_billing/Entities/Discounts/DiscountStatus.py +8 -0
  41. paddle_billing/Entities/Discounts/DiscountType.py +7 -0
  42. paddle_billing/Entities/Discounts/__init__.py +2 -0
  43. paddle_billing/Entities/Entity.py +12 -0
  44. paddle_billing/Entities/Event.py +51 -0
  45. paddle_billing/Entities/EventType.py +23 -0
  46. paddle_billing/Entities/Events/EventTypeName.py +52 -0
  47. paddle_billing/Entities/Events/__init__.py +1 -0
  48. paddle_billing/Entities/Notification.py +42 -0
  49. paddle_billing/Entities/NotificationLog.py +25 -0
  50. paddle_billing/Entities/NotificationSetting.py +34 -0
  51. paddle_billing/Entities/NotificationSettings/NotificationSettingType.py +6 -0
  52. paddle_billing/Entities/NotificationSettings/__init__.py +1 -0
  53. paddle_billing/Entities/Notifications/NotificationOrigin.py +6 -0
  54. paddle_billing/Entities/Notifications/NotificationPayout.py +24 -0
  55. paddle_billing/Entities/Notifications/NotificationPayoutStatus.py +6 -0
  56. paddle_billing/Entities/Notifications/NotificationStatus.py +8 -0
  57. paddle_billing/Entities/Notifications/__init__.py +4 -0
  58. paddle_billing/Entities/Price.py +68 -0
  59. paddle_billing/Entities/PricePreview.py +34 -0
  60. paddle_billing/Entities/PricingPreviews/PricePreviewDetails.py +15 -0
  61. paddle_billing/Entities/PricingPreviews/PricePreviewDiscounts.py +20 -0
  62. paddle_billing/Entities/PricingPreviews/PricePreviewItem.py +16 -0
  63. paddle_billing/Entities/PricingPreviews/PricePreviewLineItem.py +38 -0
  64. paddle_billing/Entities/PricingPreviews/PricePreviewTotalsFormatted.py +20 -0
  65. paddle_billing/Entities/PricingPreviews/PricePreviewUnitTotalsFormatted.py +20 -0
  66. paddle_billing/Entities/PricingPreviews/__init__.py +6 -0
  67. paddle_billing/Entities/Product.py +45 -0
  68. paddle_billing/Entities/Report.py +32 -0
  69. paddle_billing/Entities/ReportCSV.py +13 -0
  70. paddle_billing/Entities/Reports/ReportFilter.py +20 -0
  71. paddle_billing/Entities/Reports/ReportFilterName.py +17 -0
  72. paddle_billing/Entities/Reports/ReportFilterOperator.py +6 -0
  73. paddle_billing/Entities/Reports/ReportStatus.py +8 -0
  74. paddle_billing/Entities/Reports/ReportType.py +10 -0
  75. paddle_billing/Entities/Reports/__init__.py +5 -0
  76. paddle_billing/Entities/Shared/Action.py +10 -0
  77. paddle_billing/Entities/Shared/AddressPreview.py +18 -0
  78. paddle_billing/Entities/Shared/AdjustmentItemTotals.py +18 -0
  79. paddle_billing/Entities/Shared/AdjustmentProration.py +18 -0
  80. paddle_billing/Entities/Shared/AdjustmentStatus.py +8 -0
  81. paddle_billing/Entities/Shared/AdjustmentTimePeriod.py +17 -0
  82. paddle_billing/Entities/Shared/AdjustmentTotals.py +26 -0
  83. paddle_billing/Entities/Shared/AdjustmentType.py +8 -0
  84. paddle_billing/Entities/Shared/AvailablePaymentMethods.py +11 -0
  85. paddle_billing/Entities/Shared/BillingDetails.py +22 -0
  86. paddle_billing/Entities/Shared/BillingDetailsUpdate.py +22 -0
  87. paddle_billing/Entities/Shared/Card.py +24 -0
  88. paddle_billing/Entities/Shared/CatalogType.py +6 -0
  89. paddle_billing/Entities/Shared/ChargebackFee.py +18 -0
  90. paddle_billing/Entities/Shared/Checkout.py +12 -0
  91. paddle_billing/Entities/Shared/CollectionMode.py +6 -0
  92. paddle_billing/Entities/Shared/Contacts.py +16 -0
  93. paddle_billing/Entities/Shared/CountryCode.py +233 -0
  94. paddle_billing/Entities/Shared/CurrencyCode.py +34 -0
  95. paddle_billing/Entities/Shared/CurrencyCodeAdjustments.py +7 -0
  96. paddle_billing/Entities/Shared/CurrencyCodePayouts.py +17 -0
  97. paddle_billing/Entities/Shared/CustomData.py +10 -0
  98. paddle_billing/Entities/Shared/Data.py +9 -0
  99. paddle_billing/Entities/Shared/ErrorCode.py +21 -0
  100. paddle_billing/Entities/Shared/ImportMeta.py +16 -0
  101. paddle_billing/Entities/Shared/Interval.py +8 -0
  102. paddle_billing/Entities/Shared/Meta.py +7 -0
  103. paddle_billing/Entities/Shared/MetaPaginated.py +18 -0
  104. paddle_billing/Entities/Shared/MethodDetails.py +19 -0
  105. paddle_billing/Entities/Shared/Money.py +28 -0
  106. paddle_billing/Entities/Shared/Original.py +18 -0
  107. paddle_billing/Entities/Shared/Pagination.py +20 -0
  108. paddle_billing/Entities/Shared/PaymentAttemptStatus.py +13 -0
  109. paddle_billing/Entities/Shared/PaymentMethodType.py +14 -0
  110. paddle_billing/Entities/Shared/PayoutTotalsAdjustment.py +29 -0
  111. paddle_billing/Entities/Shared/PriceQuantity.py +16 -0
  112. paddle_billing/Entities/Shared/Status.py +6 -0
  113. paddle_billing/Entities/Shared/TaxCategory.py +13 -0
  114. paddle_billing/Entities/Shared/TaxMode.py +7 -0
  115. paddle_billing/Entities/Shared/TaxRatesUsed.py +18 -0
  116. paddle_billing/Entities/Shared/TimePeriod.py +18 -0
  117. paddle_billing/Entities/Shared/Totals.py +20 -0
  118. paddle_billing/Entities/Shared/TransactionDetailsPreview.py +22 -0
  119. paddle_billing/Entities/Shared/TransactionLineItemPreview.py +28 -0
  120. paddle_billing/Entities/Shared/TransactionOrigin.py +10 -0
  121. paddle_billing/Entities/Shared/TransactionPaymentAttempt.py +35 -0
  122. paddle_billing/Entities/Shared/TransactionPayoutTotals.py +36 -0
  123. paddle_billing/Entities/Shared/TransactionPayoutTotalsAdjusted.py +29 -0
  124. paddle_billing/Entities/Shared/TransactionStatus.py +11 -0
  125. paddle_billing/Entities/Shared/TransactionTotals.py +36 -0
  126. paddle_billing/Entities/Shared/TransactionTotalsAdjusted.py +28 -0
  127. paddle_billing/Entities/Shared/UnitPriceOverride.py +19 -0
  128. paddle_billing/Entities/Shared/UnitTotals.py +20 -0
  129. paddle_billing/Entities/Shared/__init__.py +56 -0
  130. paddle_billing/Entities/Subscription.py +86 -0
  131. paddle_billing/Entities/SubscriptionPreview.py +79 -0
  132. paddle_billing/Entities/Subscriptions/SubscriptionAdjustmentItem.py +24 -0
  133. paddle_billing/Entities/Subscriptions/SubscriptionAdjustmentPreview.py +22 -0
  134. paddle_billing/Entities/Subscriptions/SubscriptionCharge.py +18 -0
  135. paddle_billing/Entities/Subscriptions/SubscriptionCredit.py +18 -0
  136. paddle_billing/Entities/Subscriptions/SubscriptionDetails.py +34 -0
  137. paddle_billing/Entities/Subscriptions/SubscriptionDiscount.py +19 -0
  138. paddle_billing/Entities/Subscriptions/SubscriptionEffectiveFrom.py +6 -0
  139. paddle_billing/Entities/Subscriptions/SubscriptionItem.py +35 -0
  140. paddle_billing/Entities/Subscriptions/SubscriptionItemStatus.py +7 -0
  141. paddle_billing/Entities/Subscriptions/SubscriptionItems.py +20 -0
  142. paddle_billing/Entities/Subscriptions/SubscriptionItemsWithPrice.py +19 -0
  143. paddle_billing/Entities/Subscriptions/SubscriptionManagementUrls.py +16 -0
  144. paddle_billing/Entities/Subscriptions/SubscriptionNextTransaction.py +23 -0
  145. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogPrice.py +30 -0
  146. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogPriceWithProduct.py +32 -0
  147. paddle_billing/Entities/Subscriptions/SubscriptionNonCatalogProduct.py +26 -0
  148. paddle_billing/Entities/Subscriptions/SubscriptionOnPaymentFailure.py +6 -0
  149. paddle_billing/Entities/Subscriptions/SubscriptionPreviewSubscriptionUpdateSummary.py +22 -0
  150. paddle_billing/Entities/Subscriptions/SubscriptionPrice.py +28 -0
  151. paddle_billing/Entities/Subscriptions/SubscriptionProration.py +18 -0
  152. paddle_billing/Entities/Subscriptions/SubscriptionProrationBillingMode.py +9 -0
  153. paddle_billing/Entities/Subscriptions/SubscriptionResult.py +22 -0
  154. paddle_billing/Entities/Subscriptions/SubscriptionResultAction.py +6 -0
  155. paddle_billing/Entities/Subscriptions/SubscriptionResumeEffectiveFrom.py +5 -0
  156. paddle_billing/Entities/Subscriptions/SubscriptionScheduledChange.py +21 -0
  157. paddle_billing/Entities/Subscriptions/SubscriptionScheduledChangeAction.py +7 -0
  158. paddle_billing/Entities/Subscriptions/SubscriptionStatus.py +10 -0
  159. paddle_billing/Entities/Subscriptions/SubscriptionTimePeriod.py +17 -0
  160. paddle_billing/Entities/Subscriptions/SubscriptionTransactionItem.py +23 -0
  161. paddle_billing/Entities/Subscriptions/SubscriptionTransactionLineItem.py +33 -0
  162. paddle_billing/Entities/Subscriptions/SubscriptionUpdateItem.py +16 -0
  163. paddle_billing/Entities/Subscriptions/__init__.py +31 -0
  164. paddle_billing/Entities/Transaction.py +98 -0
  165. paddle_billing/Entities/TransactionData.py +15 -0
  166. paddle_billing/Entities/TransactionPreview.py +40 -0
  167. paddle_billing/Entities/Transactions/TransactionAdjustmentsTotals.py +30 -0
  168. paddle_billing/Entities/Transactions/TransactionBreakdown.py +18 -0
  169. paddle_billing/Entities/Transactions/TransactionCardType.py +14 -0
  170. paddle_billing/Entities/Transactions/TransactionCreateItem.py +16 -0
  171. paddle_billing/Entities/Transactions/TransactionCreateItemWithPrice.py +11 -0
  172. paddle_billing/Entities/Transactions/TransactionDetails.py +32 -0
  173. paddle_billing/Entities/Transactions/TransactionItem.py +24 -0
  174. paddle_billing/Entities/Transactions/TransactionItemPreviewWithNonCatalogPrice.py +21 -0
  175. paddle_billing/Entities/Transactions/TransactionItemPreviewWithPrice.py +24 -0
  176. paddle_billing/Entities/Transactions/TransactionItemPreviewWithPriceId.py +18 -0
  177. paddle_billing/Entities/Transactions/TransactionLineItem.py +35 -0
  178. paddle_billing/Entities/Transactions/TransactionNonCatalogPrice.py +39 -0
  179. paddle_billing/Entities/Transactions/TransactionNonCatalogPriceWithProduct.py +41 -0
  180. paddle_billing/Entities/Transactions/TransactionNonCatalogProduct.py +25 -0
  181. paddle_billing/Entities/Transactions/TransactionProration.py +18 -0
  182. paddle_billing/Entities/Transactions/TransactionTimePeriod.py +17 -0
  183. paddle_billing/Entities/Transactions/TransactionUpdateTransactionItem.py +8 -0
  184. paddle_billing/Entities/Transactions/__init__.py +20 -0
  185. paddle_billing/Entities/__init__.py +0 -0
  186. paddle_billing/EnumStringify.py +2 -0
  187. paddle_billing/Environment.py +14 -0
  188. paddle_billing/Exceptions/ApiError.py +28 -0
  189. paddle_billing/Exceptions/ApiErrors/AddressApiError.py +5 -0
  190. paddle_billing/Exceptions/ApiErrors/AdjustmentApiError.py +5 -0
  191. paddle_billing/Exceptions/ApiErrors/BusinessApiError.py +5 -0
  192. paddle_billing/Exceptions/ApiErrors/CustomerApiError.py +5 -0
  193. paddle_billing/Exceptions/ApiErrors/DiscountApiError.py +5 -0
  194. paddle_billing/Exceptions/ApiErrors/PriceApiError.py +5 -0
  195. paddle_billing/Exceptions/ApiErrors/ProductApiError.py +5 -0
  196. paddle_billing/Exceptions/ApiErrors/SubscriptionApiError.py +5 -0
  197. paddle_billing/Exceptions/ApiErrors/TransactionApiError.py +5 -0
  198. paddle_billing/Exceptions/ApiErrors/__init__.py +0 -0
  199. paddle_billing/Exceptions/FieldError.py +8 -0
  200. paddle_billing/Exceptions/SdkException.py +2 -0
  201. paddle_billing/Exceptions/SdkExceptions/InvalidArgumentException.py +8 -0
  202. paddle_billing/Exceptions/SdkExceptions/MalformedResponse.py +7 -0
  203. paddle_billing/Exceptions/SdkExceptions/__init__.py +0 -0
  204. paddle_billing/Exceptions/__init__.py +0 -0
  205. paddle_billing/FiltersNone.py +8 -0
  206. paddle_billing/FiltersUndefined.py +11 -0
  207. paddle_billing/HasParameters.py +11 -0
  208. paddle_billing/Logger/Formatter.py +18 -0
  209. paddle_billing/Logger/NullHandler.py +6 -0
  210. paddle_billing/Logger/__init__.py +30 -0
  211. paddle_billing/Notifications/Entities/Address.py +44 -0
  212. paddle_billing/Notifications/Entities/Adjustment.py +45 -0
  213. paddle_billing/Notifications/Entities/Adjustments/AdjustmentItem.py +26 -0
  214. paddle_billing/Notifications/Entities/Adjustments/__init__.py +1 -0
  215. paddle_billing/Notifications/Entities/Business.py +39 -0
  216. paddle_billing/Notifications/Entities/Businesses/BusinessesContacts.py +16 -0
  217. paddle_billing/Notifications/Entities/Businesses/__init__.py +1 -0
  218. paddle_billing/Notifications/Entities/Customer.py +36 -0
  219. paddle_billing/Notifications/Entities/DateTime.py +43 -0
  220. paddle_billing/Notifications/Entities/Discount.py +51 -0
  221. paddle_billing/Notifications/Entities/Discounts/DiscountStatus.py +8 -0
  222. paddle_billing/Notifications/Entities/Discounts/DiscountType.py +7 -0
  223. paddle_billing/Notifications/Entities/Discounts/__init__.py +2 -0
  224. paddle_billing/Notifications/Entities/Entity.py +12 -0
  225. paddle_billing/Notifications/Entities/Payout.py +24 -0
  226. paddle_billing/Notifications/Entities/Payouts/PayoutStatus.py +6 -0
  227. paddle_billing/Notifications/Entities/Payouts/__init__.py +1 -0
  228. paddle_billing/Notifications/Entities/Price.py +66 -0
  229. paddle_billing/Notifications/Entities/Product.py +45 -0
  230. paddle_billing/Notifications/Entities/Report.py +32 -0
  231. paddle_billing/Notifications/Entities/Reports/ReportFilter.py +20 -0
  232. paddle_billing/Notifications/Entities/Reports/ReportFilterName.py +17 -0
  233. paddle_billing/Notifications/Entities/Reports/ReportFilterOperator.py +6 -0
  234. paddle_billing/Notifications/Entities/Reports/ReportStatus.py +8 -0
  235. paddle_billing/Notifications/Entities/Reports/ReportType.py +10 -0
  236. paddle_billing/Notifications/Entities/Reports/__init__.py +5 -0
  237. paddle_billing/Notifications/Entities/Shared/Action.py +10 -0
  238. paddle_billing/Notifications/Entities/Shared/AddressPreview.py +18 -0
  239. paddle_billing/Notifications/Entities/Shared/AdjustmentItemTotals.py +18 -0
  240. paddle_billing/Notifications/Entities/Shared/AdjustmentProration.py +18 -0
  241. paddle_billing/Notifications/Entities/Shared/AdjustmentStatus.py +8 -0
  242. paddle_billing/Notifications/Entities/Shared/AdjustmentTimePeriod.py +17 -0
  243. paddle_billing/Notifications/Entities/Shared/AdjustmentTotals.py +26 -0
  244. paddle_billing/Notifications/Entities/Shared/AdjustmentType.py +8 -0
  245. paddle_billing/Notifications/Entities/Shared/AvailablePaymentMethods.py +11 -0
  246. paddle_billing/Notifications/Entities/Shared/BillingDetails.py +22 -0
  247. paddle_billing/Notifications/Entities/Shared/Card.py +24 -0
  248. paddle_billing/Notifications/Entities/Shared/CatalogType.py +6 -0
  249. paddle_billing/Notifications/Entities/Shared/ChargebackFee.py +18 -0
  250. paddle_billing/Notifications/Entities/Shared/Checkout.py +12 -0
  251. paddle_billing/Notifications/Entities/Shared/CollectionMode.py +6 -0
  252. paddle_billing/Notifications/Entities/Shared/CountryCode.py +233 -0
  253. paddle_billing/Notifications/Entities/Shared/CurrencyCode.py +34 -0
  254. paddle_billing/Notifications/Entities/Shared/CurrencyCodeAdjustments.py +7 -0
  255. paddle_billing/Notifications/Entities/Shared/CurrencyCodePayouts.py +17 -0
  256. paddle_billing/Notifications/Entities/Shared/CustomData.py +10 -0
  257. paddle_billing/Notifications/Entities/Shared/Data.py +9 -0
  258. paddle_billing/Notifications/Entities/Shared/ErrorCode.py +21 -0
  259. paddle_billing/Notifications/Entities/Shared/ImportMeta.py +16 -0
  260. paddle_billing/Notifications/Entities/Shared/Interval.py +8 -0
  261. paddle_billing/Notifications/Entities/Shared/MethodDetails.py +19 -0
  262. paddle_billing/Notifications/Entities/Shared/Money.py +28 -0
  263. paddle_billing/Notifications/Entities/Shared/Original.py +18 -0
  264. paddle_billing/Notifications/Entities/Shared/PaymentAttemptStatus.py +13 -0
  265. paddle_billing/Notifications/Entities/Shared/PaymentMethodType.py +15 -0
  266. paddle_billing/Notifications/Entities/Shared/PayoutTotalsAdjustment.py +29 -0
  267. paddle_billing/Notifications/Entities/Shared/PriceQuantity.py +16 -0
  268. paddle_billing/Notifications/Entities/Shared/Status.py +6 -0
  269. paddle_billing/Notifications/Entities/Shared/TaxCategory.py +13 -0
  270. paddle_billing/Notifications/Entities/Shared/TaxMode.py +7 -0
  271. paddle_billing/Notifications/Entities/Shared/TaxRatesUsed.py +18 -0
  272. paddle_billing/Notifications/Entities/Shared/TimePeriod.py +18 -0
  273. paddle_billing/Notifications/Entities/Shared/Totals.py +20 -0
  274. paddle_billing/Notifications/Entities/Shared/TransactionOrigin.py +10 -0
  275. paddle_billing/Notifications/Entities/Shared/TransactionPaymentAttempt.py +35 -0
  276. paddle_billing/Notifications/Entities/Shared/TransactionPayoutTotals.py +36 -0
  277. paddle_billing/Notifications/Entities/Shared/TransactionPayoutTotalsAdjusted.py +29 -0
  278. paddle_billing/Notifications/Entities/Shared/TransactionStatus.py +11 -0
  279. paddle_billing/Notifications/Entities/Shared/TransactionTotals.py +36 -0
  280. paddle_billing/Notifications/Entities/Shared/TransactionTotalsAdjusted.py +28 -0
  281. paddle_billing/Notifications/Entities/Shared/UnitPriceOverride.py +19 -0
  282. paddle_billing/Notifications/Entities/Shared/UnitTotals.py +20 -0
  283. paddle_billing/Notifications/Entities/Shared/__init__.py +46 -0
  284. paddle_billing/Notifications/Entities/Subscription.py +76 -0
  285. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionAdjustmentItem.py +24 -0
  286. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionCharge.py +18 -0
  287. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionCredit.py +18 -0
  288. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionDiscount.py +19 -0
  289. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionEffectiveFrom.py +6 -0
  290. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionItem.py +35 -0
  291. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionItemStatus.py +7 -0
  292. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionOnPaymentFailure.py +6 -0
  293. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionPrice.py +28 -0
  294. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionScheduledChange.py +21 -0
  295. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionScheduledChangeAction.py +7 -0
  296. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionStatus.py +10 -0
  297. paddle_billing/Notifications/Entities/Subscriptions/SubscriptionTimePeriod.py +17 -0
  298. paddle_billing/Notifications/Entities/Subscriptions/__init__.py +13 -0
  299. paddle_billing/Notifications/Entities/Transaction.py +75 -0
  300. paddle_billing/Notifications/Entities/Transactions/TransactionAdjustmentsTotals.py +30 -0
  301. paddle_billing/Notifications/Entities/Transactions/TransactionBreakdown.py +18 -0
  302. paddle_billing/Notifications/Entities/Transactions/TransactionCardType.py +14 -0
  303. paddle_billing/Notifications/Entities/Transactions/TransactionDetails.py +32 -0
  304. paddle_billing/Notifications/Entities/Transactions/TransactionItem.py +24 -0
  305. paddle_billing/Notifications/Entities/Transactions/TransactionLineItem.py +35 -0
  306. paddle_billing/Notifications/Entities/Transactions/TransactionProration.py +18 -0
  307. paddle_billing/Notifications/Entities/Transactions/TransactionTimePeriod.py +17 -0
  308. paddle_billing/Notifications/Entities/Transactions/__init__.py +11 -0
  309. paddle_billing/Notifications/Entities/__init__.py +0 -0
  310. paddle_billing/Notifications/Events/AddressCreated.py +17 -0
  311. paddle_billing/Notifications/Events/AddressUpdated.py +17 -0
  312. paddle_billing/Notifications/Events/AdjustmentCreated.py +17 -0
  313. paddle_billing/Notifications/Events/AdjustmentUpdated.py +17 -0
  314. paddle_billing/Notifications/Events/BusinessCreated.py +17 -0
  315. paddle_billing/Notifications/Events/BusinessUpdated.py +17 -0
  316. paddle_billing/Notifications/Events/CustomerCreated.py +17 -0
  317. paddle_billing/Notifications/Events/CustomerUpdated.py +17 -0
  318. paddle_billing/Notifications/Events/DiscountCreated.py +17 -0
  319. paddle_billing/Notifications/Events/DiscountImported.py +17 -0
  320. paddle_billing/Notifications/Events/DiscountUpdated.py +17 -0
  321. paddle_billing/Notifications/Events/PayoutCreated.py +17 -0
  322. paddle_billing/Notifications/Events/PayoutPaid.py +17 -0
  323. paddle_billing/Notifications/Events/PriceCreated.py +17 -0
  324. paddle_billing/Notifications/Events/PriceUpdated.py +17 -0
  325. paddle_billing/Notifications/Events/ProductCreated.py +17 -0
  326. paddle_billing/Notifications/Events/ProductUpdated.py +17 -0
  327. paddle_billing/Notifications/Events/ReportCreated.py +17 -0
  328. paddle_billing/Notifications/Events/ReportUpdated.py +17 -0
  329. paddle_billing/Notifications/Events/SubscriptionActivated.py +17 -0
  330. paddle_billing/Notifications/Events/SubscriptionCanceled.py +17 -0
  331. paddle_billing/Notifications/Events/SubscriptionCreated.py +17 -0
  332. paddle_billing/Notifications/Events/SubscriptionImported.py +17 -0
  333. paddle_billing/Notifications/Events/SubscriptionPastDue.py +17 -0
  334. paddle_billing/Notifications/Events/SubscriptionPaused.py +17 -0
  335. paddle_billing/Notifications/Events/SubscriptionResumed.py +17 -0
  336. paddle_billing/Notifications/Events/SubscriptionTrialing.py +17 -0
  337. paddle_billing/Notifications/Events/SubscriptionUpdated.py +17 -0
  338. paddle_billing/Notifications/Events/TransactionBilled.py +17 -0
  339. paddle_billing/Notifications/Events/TransactionCanceled.py +17 -0
  340. paddle_billing/Notifications/Events/TransactionCompleted.py +16 -0
  341. paddle_billing/Notifications/Events/TransactionCreated.py +17 -0
  342. paddle_billing/Notifications/Events/TransactionPaid.py +17 -0
  343. paddle_billing/Notifications/Events/TransactionPastDue.py +17 -0
  344. paddle_billing/Notifications/Events/TransactionPaymentFailed.py +17 -0
  345. paddle_billing/Notifications/Events/TransactionReady.py +17 -0
  346. paddle_billing/Notifications/Events/TransactionUpdated.py +17 -0
  347. paddle_billing/Notifications/Events/__init__.py +0 -0
  348. paddle_billing/Notifications/PaddleSignature.py +128 -0
  349. paddle_billing/Notifications/Secret.py +8 -0
  350. paddle_billing/Notifications/Verifier.py +55 -0
  351. paddle_billing/Notifications/__init__.py +3 -0
  352. paddle_billing/Options.py +10 -0
  353. paddle_billing/PaddleStrEnum.py +44 -0
  354. paddle_billing/RecursivelyRemoveKey.py +14 -0
  355. paddle_billing/Resources/Addresses/AddressesClient.py +58 -0
  356. paddle_billing/Resources/Addresses/Operations/CreateAddress.py +20 -0
  357. paddle_billing/Resources/Addresses/Operations/ListAddresses.py +42 -0
  358. paddle_billing/Resources/Addresses/Operations/UpdateAddress.py +21 -0
  359. paddle_billing/Resources/Addresses/Operations/__init__.py +3 -0
  360. paddle_billing/Resources/Addresses/__init__.py +0 -0
  361. paddle_billing/Resources/Adjustments/AdjustmentsClient.py +36 -0
  362. paddle_billing/Resources/Adjustments/Operations/Create/AdjustmentItem.py +11 -0
  363. paddle_billing/Resources/Adjustments/Operations/Create/__init__.py +0 -0
  364. paddle_billing/Resources/Adjustments/Operations/CreateAdjustment.py +28 -0
  365. paddle_billing/Resources/Adjustments/Operations/ListAdjustments.py +60 -0
  366. paddle_billing/Resources/Adjustments/Operations/__init__.py +3 -0
  367. paddle_billing/Resources/Adjustments/__init__.py +0 -0
  368. paddle_billing/Resources/Businesses/BusinessesClient.py +58 -0
  369. paddle_billing/Resources/Businesses/Operations/CreateBusiness.py +17 -0
  370. paddle_billing/Resources/Businesses/Operations/ListBusinesses.py +45 -0
  371. paddle_billing/Resources/Businesses/Operations/UpdateBusiness.py +18 -0
  372. paddle_billing/Resources/Businesses/Operations/__init__.py +3 -0
  373. paddle_billing/Resources/Businesses/__init__.py +0 -0
  374. paddle_billing/Resources/Customers/CustomersClient.py +65 -0
  375. paddle_billing/Resources/Customers/Operations/CreateCustomer.py +16 -0
  376. paddle_billing/Resources/Customers/Operations/ListCreditBalances.py +28 -0
  377. paddle_billing/Resources/Customers/Operations/ListCustomers.py +50 -0
  378. paddle_billing/Resources/Customers/Operations/UpdateCustomer.py +17 -0
  379. paddle_billing/Resources/Customers/Operations/__init__.py +4 -0
  380. paddle_billing/Resources/Customers/__init__.py +0 -0
  381. paddle_billing/Resources/Discounts/DiscountsClient.py +55 -0
  382. paddle_billing/Resources/Discounts/Operations/CreateDiscount.py +24 -0
  383. paddle_billing/Resources/Discounts/Operations/ListDiscounts.py +46 -0
  384. paddle_billing/Resources/Discounts/Operations/UpdateDiscount.py +25 -0
  385. paddle_billing/Resources/Discounts/Operations/__init__.py +3 -0
  386. paddle_billing/Resources/Discounts/__init__.py +0 -0
  387. paddle_billing/Resources/EventTypes/EventTypesClient.py +22 -0
  388. paddle_billing/Resources/EventTypes/__init__.py +0 -0
  389. paddle_billing/Resources/Events/EventsClient.py +26 -0
  390. paddle_billing/Resources/Events/Operations/ListEvents.py +12 -0
  391. paddle_billing/Resources/Events/Operations/__init__.py +1 -0
  392. paddle_billing/Resources/Events/__init__.py +0 -0
  393. paddle_billing/Resources/NotificationLogs/NotificationLogsClient.py +26 -0
  394. paddle_billing/Resources/NotificationLogs/Operations/ListNotificationLogs.py +11 -0
  395. paddle_billing/Resources/NotificationLogs/Operations/__init__.py +1 -0
  396. paddle_billing/Resources/NotificationLogs/__init__.py +0 -0
  397. paddle_billing/Resources/NotificationSettings/NotificationSettingsClient.py +54 -0
  398. paddle_billing/Resources/NotificationSettings/Operations/CreateNotificationSetting.py +21 -0
  399. paddle_billing/Resources/NotificationSettings/Operations/UpdateNotificationSetting.py +20 -0
  400. paddle_billing/Resources/NotificationSettings/Operations/__init__.py +2 -0
  401. paddle_billing/Resources/NotificationSettings/__init__.py +0 -0
  402. paddle_billing/Resources/Notifications/NotificationsClient.py +44 -0
  403. paddle_billing/Resources/Notifications/Operations/ListNotifications.py +58 -0
  404. paddle_billing/Resources/Notifications/Operations/__init__.py +1 -0
  405. paddle_billing/Resources/Notifications/__init__.py +0 -0
  406. paddle_billing/Resources/Prices/Operations/CreatePrice.py +23 -0
  407. paddle_billing/Resources/Prices/Operations/List/Includes.py +5 -0
  408. paddle_billing/Resources/Prices/Operations/List/__init__.py +0 -0
  409. paddle_billing/Resources/Prices/Operations/ListPrices.py +62 -0
  410. paddle_billing/Resources/Prices/Operations/UpdatePrice.py +23 -0
  411. paddle_billing/Resources/Prices/Operations/__init__.py +4 -0
  412. paddle_billing/Resources/Prices/PricesClient.py +65 -0
  413. paddle_billing/Resources/Prices/__init__.py +0 -0
  414. paddle_billing/Resources/PricingPreviews/Operations/PreviewPrice.py +20 -0
  415. paddle_billing/Resources/PricingPreviews/Operations/__init__.py +1 -0
  416. paddle_billing/Resources/PricingPreviews/PricingPreviewsClient.py +20 -0
  417. paddle_billing/Resources/PricingPreviews/__init__.py +0 -0
  418. paddle_billing/Resources/Products/Operations/CreateProduct.py +18 -0
  419. paddle_billing/Resources/Products/Operations/List/Includes.py +5 -0
  420. paddle_billing/Resources/Products/Operations/List/__init__.py +0 -0
  421. paddle_billing/Resources/Products/Operations/ListProducts.py +59 -0
  422. paddle_billing/Resources/Products/Operations/UpdateProduct.py +19 -0
  423. paddle_billing/Resources/Products/Operations/__init__.py +4 -0
  424. paddle_billing/Resources/Products/ProductsClient.py +70 -0
  425. paddle_billing/Resources/Products/__init__.py +0 -0
  426. paddle_billing/Resources/Reports/Operations/CreateReport.py +27 -0
  427. paddle_billing/Resources/Reports/Operations/ListReports.py +35 -0
  428. paddle_billing/Resources/Reports/Operations/__init__.py +2 -0
  429. paddle_billing/Resources/Reports/ReportsClient.py +51 -0
  430. paddle_billing/Resources/Reports/__init__.py +0 -0
  431. paddle_billing/Resources/Shared/Operations/List/Comparator.py +8 -0
  432. paddle_billing/Resources/Shared/Operations/List/DateComparison.py +31 -0
  433. paddle_billing/Resources/Shared/Operations/List/OrderBy.py +21 -0
  434. paddle_billing/Resources/Shared/Operations/List/Pager.py +24 -0
  435. paddle_billing/Resources/Shared/Operations/List/__init__.py +0 -0
  436. paddle_billing/Resources/Shared/Operations/__init__.py +4 -0
  437. paddle_billing/Resources/Shared/__init__.py +0 -0
  438. paddle_billing/Resources/Subscriptions/Operations/CancelSubscription.py +12 -0
  439. paddle_billing/Resources/Subscriptions/Operations/CreateOneTimeCharge.py +22 -0
  440. paddle_billing/Resources/Subscriptions/Operations/Get/Includes.py +6 -0
  441. paddle_billing/Resources/Subscriptions/Operations/Get/__init__.py +0 -0
  442. paddle_billing/Resources/Subscriptions/Operations/ListSubscriptions.py +59 -0
  443. paddle_billing/Resources/Subscriptions/Operations/PauseSubscription.py +19 -0
  444. paddle_billing/Resources/Subscriptions/Operations/PreviewOneTimeCharge.py +22 -0
  445. paddle_billing/Resources/Subscriptions/Operations/PreviewUpdateSubscription.py +37 -0
  446. paddle_billing/Resources/Subscriptions/Operations/ResumeSubscription.py +17 -0
  447. paddle_billing/Resources/Subscriptions/Operations/Update/SubscriptionDiscount.py +9 -0
  448. paddle_billing/Resources/Subscriptions/Operations/Update/__init__.py +0 -0
  449. paddle_billing/Resources/Subscriptions/Operations/UpdateSubscription.py +37 -0
  450. paddle_billing/Resources/Subscriptions/Operations/__init__.py +10 -0
  451. paddle_billing/Resources/Subscriptions/SubscriptionsClient.py +121 -0
  452. paddle_billing/Resources/Subscriptions/__init__.py +0 -0
  453. paddle_billing/Resources/Transactions/Operations/CreateTransaction.py +25 -0
  454. paddle_billing/Resources/Transactions/Operations/List/Includes.py +11 -0
  455. paddle_billing/Resources/Transactions/Operations/List/Origin.py +10 -0
  456. paddle_billing/Resources/Transactions/Operations/List/__init__.py +0 -0
  457. paddle_billing/Resources/Transactions/Operations/ListTransactions.py +86 -0
  458. paddle_billing/Resources/Transactions/Operations/PreviewTransaction.py +24 -0
  459. paddle_billing/Resources/Transactions/Operations/UpdateTransaction.py +25 -0
  460. paddle_billing/Resources/Transactions/Operations/__init__.py +6 -0
  461. paddle_billing/Resources/Transactions/TransactionsClient.py +90 -0
  462. paddle_billing/Resources/Transactions/__init__.py +0 -0
  463. paddle_billing/Resources/__init__.py +0 -0
  464. paddle_billing/ResponseParser.py +65 -0
  465. paddle_billing/Undefined.py +2 -0
  466. paddle_billing/__init__.py +4 -0
  467. paddle_python_sdk-0.1.0.dist-info/LICENSE +190 -0
  468. paddle_python_sdk-0.1.0.dist-info/METADATA +184 -0
  469. paddle_python_sdk-0.1.0.dist-info/RECORD +517 -0
  470. paddle_python_sdk-0.1.0.dist-info/WHEEL +5 -0
  471. paddle_python_sdk-0.1.0.dist-info/top_level.txt +3 -0
  472. tests/Functional/Resources/Addresses/__init__.py +0 -0
  473. tests/Functional/Resources/Addresses/test_AddressesClient.py +274 -0
  474. tests/Functional/Resources/Adjustments/__init__.py +0 -0
  475. tests/Functional/Resources/Adjustments/test_AdjustmentsClient.py +188 -0
  476. tests/Functional/Resources/Businesses/__init__.py +0 -0
  477. tests/Functional/Resources/Businesses/test_BusinessesClient.py +279 -0
  478. tests/Functional/Resources/Customers/__init__.py +0 -0
  479. tests/Functional/Resources/Customers/test_CustomersClient.py +291 -0
  480. tests/Functional/Resources/Discounts/__init__.py +0 -0
  481. tests/Functional/Resources/Discounts/test_DiscountsClient.py +280 -0
  482. tests/Functional/Resources/EventTypes/__init__.py +0 -0
  483. tests/Functional/Resources/EventTypes/test_EventTypesClient.py +43 -0
  484. tests/Functional/Resources/Events/__init__.py +0 -0
  485. tests/Functional/Resources/Events/test_EventsClient.py +64 -0
  486. tests/Functional/Resources/NotificationLogs/__init__.py +0 -0
  487. tests/Functional/Resources/NotificationLogs/test_NotificationLogsClient.py +68 -0
  488. tests/Functional/Resources/NotificationSettings/__init__.py +0 -0
  489. tests/Functional/Resources/NotificationSettings/test_NotificationSettingsClient.py +287 -0
  490. tests/Functional/Resources/Notifications/__init__.py +0 -0
  491. tests/Functional/Resources/Notifications/test_NotificationsClient.py +202 -0
  492. tests/Functional/Resources/Prices/__init__.py +0 -0
  493. tests/Functional/Resources/Prices/test_PricesClient.py +307 -0
  494. tests/Functional/Resources/PricingPreviews/__init__.py +0 -0
  495. tests/Functional/Resources/PricingPreviews/test_PricingPreviewsClient.py +92 -0
  496. tests/Functional/Resources/Products/__init__.py +0 -0
  497. tests/Functional/Resources/Products/test_ProductsClient.py +271 -0
  498. tests/Functional/Resources/Reports/__init__.py +0 -0
  499. tests/Functional/Resources/Reports/test_ReportsClient.py +197 -0
  500. tests/Functional/Resources/Subscriptions/__init__.py +0 -0
  501. tests/Functional/Resources/Subscriptions/test_SubscriptionsClient.py +758 -0
  502. tests/Functional/Resources/Transactions/__init__.py +0 -0
  503. tests/Functional/Resources/Transactions/test_TransactionsClient.py +585 -0
  504. tests/Functional/Resources/__init__.py +0 -0
  505. tests/Functional/__init__.py +0 -0
  506. tests/Unit/Logger/__init__.py +0 -0
  507. tests/Unit/Logger/test_Logger.py +10 -0
  508. tests/Unit/Notification/__init__.py +0 -0
  509. tests/Unit/Notification/test_Verifier.py +63 -0
  510. tests/Unit/PaddleStrEnum/__init__.py +0 -0
  511. tests/Unit/PaddleStrEnum/test_PaddleStrEnum.py +52 -0
  512. tests/Unit/__init__.py +0 -0
  513. tests/Utils/FakeResponse.py +6 -0
  514. tests/Utils/ReadsFixture.py +33 -0
  515. tests/Utils/TestClient.py +48 -0
  516. tests/Utils/__init__.py +1 -0
  517. tests/__init__.py +0 -0
@@ -0,0 +1,287 @@
1
+ from json import loads
2
+ from pytest import mark
3
+ from urllib.parse import unquote
4
+
5
+ from paddle_billing.Entities.Collections import NotificationSettingCollection
6
+ from paddle_billing.Entities.Events import EventTypeName
7
+ from paddle_billing.Entities.NotificationSetting import NotificationSetting
8
+ from paddle_billing.Entities.NotificationSettings import NotificationSettingType
9
+
10
+ from paddle_billing.Resources.NotificationSettings.Operations import CreateNotificationSetting, UpdateNotificationSetting
11
+
12
+ from tests.Utils.TestClient import mock_requests, test_client
13
+ from tests.Utils.ReadsFixture import ReadsFixtures
14
+
15
+
16
+ class TestNotificationSettingsClient:
17
+ @mark.parametrize(
18
+ 'operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
19
+ [
20
+ (
21
+ CreateNotificationSetting(
22
+ description = 'Slack notifications',
23
+ type = NotificationSettingType.Url,
24
+ destination = 'https://hooks.slack.com/example',
25
+ include_sensitive_fields = False,
26
+ subscribed_events = [
27
+ EventTypeName.TransactionBilled,
28
+ EventTypeName.TransactionCanceled,
29
+ EventTypeName.TransactionCompleted,
30
+ EventTypeName.TransactionCreated,
31
+ EventTypeName.TransactionPaymentFailed,
32
+ EventTypeName.SubscriptionCreated,
33
+ ],
34
+ ),
35
+ ReadsFixtures.read_raw_json_fixture('request/create_basic'),
36
+ 200,
37
+ ReadsFixtures.read_raw_json_fixture('response/minimal_entity'),
38
+ '/notification-settings',
39
+ ), (
40
+ CreateNotificationSetting(
41
+ api_version = 1,
42
+ description = 'Slack notifications',
43
+ type = NotificationSettingType.Url,
44
+ destination = 'https://hooks.slack.com/example',
45
+ include_sensitive_fields = False,
46
+ subscribed_events = [
47
+ EventTypeName.TransactionBilled,
48
+ EventTypeName.TransactionCanceled,
49
+ EventTypeName.TransactionCompleted,
50
+ EventTypeName.TransactionCreated,
51
+ EventTypeName.TransactionPaymentFailed,
52
+ EventTypeName.TransactionReady,
53
+ EventTypeName.TransactionUpdated,
54
+ EventTypeName.SubscriptionActivated,
55
+ EventTypeName.SubscriptionCreated,
56
+ EventTypeName.SubscriptionPastDue,
57
+ EventTypeName.SubscriptionPaused,
58
+ EventTypeName.SubscriptionResumed,
59
+ EventTypeName.SubscriptionTrialing,
60
+ EventTypeName.SubscriptionUpdated,
61
+ ],
62
+ ),
63
+ ReadsFixtures.read_raw_json_fixture('request/create_full'),
64
+ 200,
65
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
66
+ '/notification-settings',
67
+ ),
68
+ ],
69
+ ids=[
70
+ "Create notification-setting with basic data",
71
+ "Create notification-setting with full data",
72
+ ],
73
+ )
74
+ def test_create_notification_setting_uses_expected_payload(
75
+ self,
76
+ test_client,
77
+ mock_requests,
78
+ operation,
79
+ expected_request_body,
80
+ expected_response_status,
81
+ expected_response_body,
82
+ expected_url,
83
+ ):
84
+ expected_url = f"{test_client.base_url}{expected_url}"
85
+ mock_requests.post(expected_url, status_code=expected_response_status, text=expected_response_body)
86
+
87
+ response = test_client.client.notification_settings.create(operation)
88
+ response_json = test_client.client.notification_settings.response.json()
89
+ request_json = test_client.client.payload
90
+ last_request = mock_requests.last_request
91
+
92
+ assert isinstance(response, NotificationSetting)
93
+ assert last_request is not None
94
+ assert last_request.method == 'POST'
95
+ assert test_client.client.status_code == expected_response_status
96
+ assert unquote(last_request.url) == expected_url, \
97
+ "The URL does not match the expected URL, verify the query string is correct"
98
+ assert loads(request_json) == loads(expected_request_body), \
99
+ "The request JSON doesn't match the expected fixture JSON"
100
+ assert response_json == loads(str(expected_response_body)), \
101
+ "The response JSON doesn't match the expected fixture JSON"
102
+
103
+
104
+ @mark.parametrize(
105
+ 'notification_setting_id, operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
106
+ [
107
+ (
108
+ 'ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
109
+ UpdateNotificationSetting(active=False),
110
+ ReadsFixtures.read_raw_json_fixture('request/update_single'),
111
+ 200,
112
+ ReadsFixtures.read_raw_json_fixture('response/minimal_entity'),
113
+ '/notification-settings/ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
114
+ ), (
115
+ 'ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
116
+ UpdateNotificationSetting(description='Slack notifications (old)', active=False),
117
+ ReadsFixtures.read_raw_json_fixture('request/update_partial'),
118
+ 200,
119
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
120
+ '/notification-settings/ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
121
+ ), (
122
+ 'ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
123
+ UpdateNotificationSetting(
124
+ active = False,
125
+ api_version = 1,
126
+ description = 'Slack notifications (old)',
127
+ destination = 'https://hooks.slack.com/example',
128
+ include_sensitive_fields = False,
129
+ subscribed_events = [
130
+ EventTypeName.TransactionBilled,
131
+ EventTypeName.TransactionCanceled,
132
+ EventTypeName.TransactionCompleted,
133
+ EventTypeName.TransactionCreated,
134
+ EventTypeName.TransactionPaymentFailed,
135
+ EventTypeName.TransactionReady,
136
+ EventTypeName.TransactionUpdated,
137
+ EventTypeName.SubscriptionActivated,
138
+ EventTypeName.SubscriptionCreated,
139
+ EventTypeName.SubscriptionPastDue,
140
+ EventTypeName.SubscriptionPaused,
141
+ EventTypeName.SubscriptionResumed,
142
+ EventTypeName.SubscriptionTrialing,
143
+ EventTypeName.SubscriptionUpdated,
144
+ ],
145
+ ),
146
+ ReadsFixtures.read_raw_json_fixture('request/update_full'),
147
+ 200,
148
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
149
+ '/notification-settings/ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
150
+ ),
151
+ ],
152
+ ids=[
153
+ "Update notification setting with basic data",
154
+ "Update notification setting with partial data",
155
+ "Update notification setting with full data",
156
+ ],
157
+ )
158
+ def test_update_notification_setting_uses_expected_payload(
159
+ self,
160
+ test_client,
161
+ mock_requests,
162
+ notification_setting_id,
163
+ operation,
164
+ expected_request_body,
165
+ expected_response_status,
166
+ expected_response_body,
167
+ expected_url,
168
+ ):
169
+ expected_url = f"{test_client.base_url}{expected_url}"
170
+ mock_requests.patch(expected_url, status_code=expected_response_status, text=expected_response_body)
171
+
172
+ response = test_client.client.notification_settings.update(notification_setting_id, operation)
173
+ response_json = test_client.client.notification_settings.response.json()
174
+ request_json = test_client.client.payload
175
+ last_request = mock_requests.last_request
176
+
177
+ assert isinstance(response, NotificationSetting)
178
+ assert last_request is not None
179
+ assert last_request.method == 'PATCH'
180
+ assert test_client.client.status_code == expected_response_status
181
+ assert unquote(last_request.url) == expected_url, \
182
+ "The URL does not match the expected URL, verify the query string is correct"
183
+ assert loads(request_json) == loads(expected_request_body), \
184
+ "The request JSON doesn't match the expected fixture JSON"
185
+ assert response_json == loads(str(expected_response_body)), \
186
+ "The response JSON doesn't match the expected fixture JSON"
187
+
188
+
189
+ @mark.parametrize(
190
+ 'expected_response_status, expected_response_body, expected_url',
191
+ [(200, ReadsFixtures.read_raw_json_fixture('response/list_default'), '/notification-settings',)],
192
+ ids=["List notification-settings"],
193
+ )
194
+ def test_list_notification_settings_returns_expected_response(
195
+ self,
196
+ test_client,
197
+ mock_requests,
198
+ expected_response_status,
199
+ expected_response_body,
200
+ expected_url,
201
+ ):
202
+ expected_url = f"{test_client.base_url}{expected_url}"
203
+ mock_requests.get(expected_url, status_code=expected_response_status)
204
+
205
+ response = test_client.client.notification_settings.list()
206
+ last_request = mock_requests.last_request
207
+
208
+ assert isinstance(response, NotificationSettingCollection)
209
+ assert last_request is not None
210
+ assert last_request.method == 'GET'
211
+ assert test_client.client.status_code == expected_response_status
212
+ assert unquote(last_request.url) == expected_url, \
213
+ "The URL does not match the expected URL, verify the query string is correct"
214
+
215
+
216
+ @mark.parametrize(
217
+ 'notification_setting_id, expected_response_status, expected_response_body, expected_url',
218
+ [(
219
+ 'ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
220
+ 200,
221
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
222
+ '/notification-settings/ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
223
+ )],
224
+ ids=["Get a notification setting by its id"],
225
+ )
226
+ def test_get_notification_settings_returns_expected_response(
227
+ self,
228
+ test_client,
229
+ mock_requests,
230
+ notification_setting_id,
231
+ expected_response_status,
232
+ expected_response_body,
233
+ expected_url,
234
+ ):
235
+ expected_url = f"{test_client.base_url}{expected_url}"
236
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
237
+
238
+ response = test_client.client.notification_settings.get(notification_setting_id)
239
+ response_json = test_client.client.notification_settings.response.json()
240
+ last_request = mock_requests.last_request
241
+
242
+ assert isinstance(response, NotificationSetting)
243
+ assert last_request is not None
244
+ assert last_request.method == 'GET'
245
+ assert test_client.client.status_code == expected_response_status
246
+ assert unquote(last_request.url) == expected_url, \
247
+ "The URL does not match the expected URL, verify the query string is correct"
248
+ assert response_json == loads(str(expected_response_body)), \
249
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
250
+
251
+
252
+ @mark.parametrize(
253
+ 'notification_setting_id, expected_response_status, expected_response_body, expected_url',
254
+ [(
255
+ 'ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
256
+ 200,
257
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
258
+ '/notification-settings/ntfset_01gkpjp8bkm3tm53kdgkx6sms7',
259
+ )],
260
+ ids=["Delete a notification setting by its id"],
261
+ )
262
+ def test_delete_notification_setting_returns_expected_response(
263
+ self,
264
+ test_client,
265
+ mock_requests,
266
+ notification_setting_id,
267
+ expected_response_status,
268
+ expected_response_body,
269
+ expected_url,
270
+ ):
271
+ """Although the API doesn't specify a returned body, in practice it returns the deleted notification setting."""
272
+
273
+ expected_url = f"{test_client.base_url}{expected_url}"
274
+ mock_requests.delete(expected_url, status_code=expected_response_status, text=expected_response_body)
275
+
276
+ response = test_client.client.notification_settings.delete(notification_setting_id)
277
+ response_json = test_client.client.notification_settings.response.json()
278
+ last_request = mock_requests.last_request
279
+
280
+ assert isinstance(response, NotificationSetting)
281
+ assert last_request is not None
282
+ assert last_request.method == 'DELETE'
283
+ assert test_client.client.status_code == expected_response_status
284
+ assert unquote(last_request.url) == expected_url, \
285
+ "The URL does not match the expected URL, verify the query string is correct"
286
+ assert response_json == loads(str(expected_response_body)), \
287
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
File without changes
@@ -0,0 +1,202 @@
1
+ from json import loads
2
+ from pytest import mark
3
+ from urllib.parse import unquote
4
+
5
+ from paddle_billing.Entities.Collections import NotificationCollection
6
+ from paddle_billing.Entities.DateTime import DateTime
7
+ from paddle_billing.Entities.Notification import Notification
8
+ from paddle_billing.Entities.Notifications import NotificationStatus
9
+
10
+ from paddle_billing.Resources.Notifications.Operations import ListNotifications
11
+ from paddle_billing.Resources.Shared.Operations import Pager
12
+
13
+ from tests.Utils.TestClient import mock_requests, test_client
14
+ from tests.Utils.ReadsFixture import ReadsFixtures
15
+
16
+
17
+ class TestNotificationsClient:
18
+ @mark.parametrize(
19
+ 'operation, expected_response_status, expected_response_body, expected_url',
20
+ [
21
+ (
22
+ ListNotifications(),
23
+ 200,
24
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
25
+ '/notifications',
26
+ ), (
27
+ ListNotifications(Pager()),
28
+ 200,
29
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
30
+ '/notifications?order_by=id[asc]&per_page=50',
31
+ ), (
32
+ ListNotifications(Pager(after='nft_01h83xenpcfjyhkqr4x214m02x')),
33
+ 200,
34
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
35
+ '/notifications?after=nft_01h83xenpcfjyhkqr4x214m02x&order_by=id[asc]&per_page=50',
36
+ ), (
37
+ ListNotifications(notification_setting_ids=['nftset_01h83xenpcfjyhkqr4x214m02']),
38
+ 200,
39
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
40
+ '/notifications?notification_setting_id=nftset_01h83xenpcfjyhkqr4x214m02',
41
+ ), (
42
+ ListNotifications(notification_setting_ids=[
43
+ 'nftset_01h83xenpcfjyhkqr4x214m02',
44
+ 'nftset_01h8brhckjd6qk4n7e4py2340t',
45
+ ]),
46
+ 200,
47
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
48
+ '/notifications?notification_setting_id=nftset_01h83xenpcfjyhkqr4x214m02,nftset_01h8brhckjd6qk4n7e4py2340t',
49
+ ), (
50
+ ListNotifications(statuses=[NotificationStatus.Delivered]),
51
+ 200,
52
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
53
+ '/notifications?status=delivered',
54
+ ), (
55
+ ListNotifications(statuses=[NotificationStatus.Delivered, NotificationStatus.NotAttempted]),
56
+ 200,
57
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
58
+ '/notifications?status=delivered,not_attempted',
59
+ ), (
60
+ ListNotifications(filter='txn_01h83xenpcfjyhkqr4x214m02'),
61
+ 200,
62
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
63
+ '/notifications?filter=txn_01h83xenpcfjyhkqr4x214m02',
64
+ ), (
65
+ ListNotifications(search='transaction.created'),
66
+ 200,
67
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
68
+ '/notifications?search=transaction.created',
69
+ ), (
70
+ ListNotifications(end=DateTime('2023-12-25T00:00:00.000Z')),
71
+ 200,
72
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
73
+ '/notifications?to=2023-12-25T00:00:00.000000Z',
74
+ ), (
75
+ ListNotifications(start=DateTime('2023-12-24T00:00:00.000Z')),
76
+ 200,
77
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
78
+ '/notifications?from=2023-12-24T00:00:00.000000Z',
79
+ ), (
80
+ ListNotifications(
81
+ start = DateTime('2023-12-24T00:00:00.000Z'),
82
+ end = DateTime('2023-12-25T00:00:00.000Z'),
83
+ ),
84
+ 200,
85
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
86
+ '/notifications?to=2023-12-25T00:00:00.000000Z&from=2023-12-24T00:00:00.000000Z',
87
+ ),
88
+ ],
89
+ ids=[
90
+ "List transactions without pagination",
91
+ "List transactions with default pagination",
92
+ "List paginated transactions after specified transaction_id",
93
+ "List transactions filtered by notification_setting_id",
94
+ "List transactions filtered by multiple notification_setting_ids",
95
+ "List transactions filtered by status",
96
+ "List transactions filtered by multiple statuses",
97
+ "List transactions filtered by id",
98
+ "List transactions filtered by search string",
99
+ "List transactions filtered by to time",
100
+ "List transactions filtered by from time",
101
+ "List transactions filtered by to & from time",
102
+ ],
103
+ )
104
+ def test_list_transactions_returns_expected_response(
105
+ self,
106
+ test_client,
107
+ mock_requests,
108
+ operation,
109
+ expected_response_status,
110
+ expected_response_body,
111
+ expected_url,
112
+ ):
113
+ expected_url = f"{test_client.base_url}{expected_url}"
114
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
115
+
116
+ response = test_client.client.notifications.list(operation)
117
+ last_request = mock_requests.last_request
118
+
119
+ assert isinstance(response, NotificationCollection)
120
+ assert last_request is not None
121
+ assert last_request.method == 'GET'
122
+ assert test_client.client.status_code == expected_response_status
123
+ assert unquote(last_request.url) == expected_url, \
124
+ "The URL does not match the expected URL, verify the query string is correct"
125
+
126
+ @mark.parametrize(
127
+ 'notification_id, expected_response_status, expected_response_body, expected_url',
128
+ [(
129
+ 'nft_01h8441jn5pcwrfhwh78jqt8hk',
130
+ 200,
131
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
132
+ '/notifications/nft_01h8441jn5pcwrfhwh78jqt8hk',
133
+ )],
134
+ ids=["Get a notification by its id"],
135
+ )
136
+ def test_get_notification_returns_expected_response(
137
+ self,
138
+ test_client,
139
+ mock_requests,
140
+ notification_id,
141
+ expected_response_status,
142
+ expected_response_body,
143
+ expected_url,
144
+ ):
145
+ expected_url = f"{test_client.base_url}{expected_url}"
146
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
147
+
148
+ response = test_client.client.notifications.get(notification_id)
149
+ response_json = test_client.client.notifications.response.json()
150
+ last_request = mock_requests.last_request
151
+
152
+ assert isinstance(response, Notification)
153
+ assert last_request is not None
154
+ assert last_request.method == 'GET'
155
+ assert test_client.client.status_code == expected_response_status
156
+ assert unquote(last_request.url) == expected_url, \
157
+ "The URL does not match the expected URL, verify the query string is correct"
158
+ assert response_json == loads(str(expected_response_body)), \
159
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
160
+
161
+
162
+ @mark.parametrize(
163
+ 'notification_id,'
164
+ 'expected_response_status,'
165
+ 'expected_response_body,'
166
+ 'expected_response_notification_id,'
167
+ 'expected_url',
168
+ [(
169
+ 'nft_01h8441jn5pcwrfhwh78jqt8hk',
170
+ 200,
171
+ ReadsFixtures.read_raw_json_fixture('response/replay'),
172
+ 'ntf_01h46h1s2zabpkdks7yt4vkgkc',
173
+ '/notifications/nft_01h8441jn5pcwrfhwh78jqt8hk',
174
+ )],
175
+ ids=["Replay a notification by its id"],
176
+ )
177
+ def test_replacy_notification_returns_expected_response(
178
+ self,
179
+ test_client,
180
+ mock_requests,
181
+ notification_id,
182
+ expected_response_status,
183
+ expected_response_body,
184
+ expected_response_notification_id,
185
+ expected_url,
186
+ ):
187
+ expected_url = f"{test_client.base_url}{expected_url}"
188
+ mock_requests.post(expected_url, status_code=expected_response_status, text=expected_response_body)
189
+
190
+ response = test_client.client.notifications.replay(notification_id)
191
+ response_json = test_client.client.notifications.response.json()
192
+ last_request = mock_requests.last_request
193
+
194
+ assert last_request is not None
195
+ assert last_request.method == 'POST'
196
+ assert test_client.client.status_code == expected_response_status
197
+ assert unquote(last_request.url) == expected_url, \
198
+ "The URL does not match the expected URL, verify the query string is correct"
199
+ assert response_json == loads(str(expected_response_body)), \
200
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
201
+ assert response == expected_response_notification_id, \
202
+ "The response notification_id doesn't match the expected fixture JSON notification_id"
File without changes