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,279 @@
1
+ from json import loads
2
+ from pytest import mark
3
+ from urllib.parse import unquote
4
+
5
+ from paddle_billing.Entities.Business import Business
6
+ from paddle_billing.Entities.Collections import BusinessCollection
7
+ from paddle_billing.Entities.Shared import Contacts, CustomData, Status
8
+
9
+ from paddle_billing.Resources.Businesses.Operations import CreateBusiness, ListBusinesses, UpdateBusiness
10
+ from paddle_billing.Resources.Shared.Operations import Pager
11
+
12
+ from tests.Utils.TestClient import mock_requests, test_client
13
+ from tests.Utils.ReadsFixture import ReadsFixtures
14
+
15
+
16
+ class TestBusinessesClient:
17
+ @mark.parametrize(
18
+ 'customer_id, operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
19
+ [
20
+ (
21
+ 'ctm_01h844p3h41s12zs5mn4axja51',
22
+ CreateBusiness('ChatApp Inc.'),
23
+ ReadsFixtures.read_raw_json_fixture('request/create_basic'),
24
+ 200,
25
+ ReadsFixtures.read_raw_json_fixture('response/minimal_entity'),
26
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses',
27
+ ), (
28
+ 'ctm_01h844p3h41s12zs5mn4axja51',
29
+ CreateBusiness(
30
+ name = 'ChatApp Inc.',
31
+ company_number = '555775291485',
32
+ tax_identifier = '555952383',
33
+ contacts = [Contacts('Parker Jones', 'parker@example.com')],
34
+ custom_data = CustomData({'customer_reference_id': 'abcd1234'}),
35
+ ),
36
+ ReadsFixtures.read_raw_json_fixture('request/create_full'),
37
+ 200,
38
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
39
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses',
40
+ ),
41
+ ],
42
+ ids=[
43
+ "Create business with basic data",
44
+ "Create business with full data",
45
+ ],
46
+ )
47
+ def test_create_business_uses_expected_payload(
48
+ self,
49
+ test_client,
50
+ mock_requests,
51
+ customer_id,
52
+ operation,
53
+ expected_request_body,
54
+ expected_response_status,
55
+ expected_response_body,
56
+ expected_url,
57
+ ):
58
+ expected_url = f"{test_client.base_url}{expected_url}"
59
+ mock_requests.post(expected_url, status_code=expected_response_status, text=expected_response_body)
60
+
61
+ response = test_client.client.businesses.create(customer_id, operation)
62
+ response_json = test_client.client.businesses.response.json()
63
+ request_json = test_client.client.payload
64
+ last_request = mock_requests.last_request
65
+
66
+ assert isinstance(response, Business)
67
+ assert last_request is not None
68
+ assert last_request.method == 'POST'
69
+ assert test_client.client.status_code == expected_response_status
70
+ assert unquote(last_request.url) == expected_url, \
71
+ "The URL does not match the expected URL, verify the query string is correct"
72
+ assert loads(request_json) == loads(expected_request_body), \
73
+ "The request JSON doesn't match the expected fixture JSON"
74
+ assert response_json == loads(str(expected_response_body)), \
75
+ "The response JSON doesn't match the expected fixture JSON"
76
+
77
+
78
+ @mark.parametrize(
79
+ 'customer_id, business_id, operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
80
+ [
81
+ (
82
+ 'ctm_01h844p3h41s12zs5mn4axja51',
83
+ 'biz_01h84a7hr4pzhsajkm8tev89ev',
84
+ UpdateBusiness(name='ChatApp Inc.'),
85
+ ReadsFixtures.read_raw_json_fixture('request/update_single'),
86
+ 200,
87
+ ReadsFixtures.read_raw_json_fixture('response/minimal_entity'),
88
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses/biz_01h84a7hr4pzhsajkm8tev89ev',
89
+ ), (
90
+ 'ctm_01h844p3h41s12zs5mn4axja51',
91
+ 'biz_01h84a7hr4pzhsajkm8tev89ev',
92
+ UpdateBusiness(
93
+ name = 'ChatApp Inc.',
94
+ contacts = [
95
+ Contacts('Parker Jones', 'parker@example.com'),
96
+ Contacts('Jo Riley', 'jo@example.com'),
97
+ Contacts('Jesse Garcia', 'jo@example.com'),
98
+ ],
99
+ ),
100
+ ReadsFixtures.read_raw_json_fixture('request/update_partial'),
101
+ 200,
102
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
103
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses/biz_01h84a7hr4pzhsajkm8tev89ev',
104
+ ), (
105
+ 'ctm_01h844p3h41s12zs5mn4axja51',
106
+ 'biz_01h84a7hr4pzhsajkm8tev89ev',
107
+ UpdateBusiness(
108
+ name = 'ChatApp Inc.',
109
+ company_number = '555775291485',
110
+ tax_identifier = '555952383',
111
+ status = Status.Active,
112
+ custom_data = CustomData({'customer_reference_id': 'abcd1234'}),
113
+ contacts = [
114
+ Contacts('Parker Jones', 'parker@example.com'),
115
+ Contacts('Jo Riley', 'jo@example.com'),
116
+ Contacts('Jesse Garcia', 'jo@example.com'),
117
+ ],
118
+ ),
119
+ ReadsFixtures.read_raw_json_fixture('request/update_full'),
120
+ 200,
121
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
122
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses/biz_01h84a7hr4pzhsajkm8tev89ev',
123
+ ),
124
+ ],
125
+ ids=[
126
+ "Update business with basic data",
127
+ "Update business with partial data",
128
+ "Update business with full data",
129
+ ],
130
+ )
131
+ def test_update_business_uses_expected_payload(
132
+ self,
133
+ test_client,
134
+ mock_requests,
135
+ customer_id,
136
+ business_id,
137
+ operation,
138
+ expected_request_body,
139
+ expected_response_status,
140
+ expected_response_body,
141
+ expected_url,
142
+ ):
143
+ expected_url = f"{test_client.base_url}{expected_url}"
144
+ mock_requests.patch(expected_url, status_code=expected_response_status, text=expected_response_body)
145
+
146
+ response = test_client.client.businesses.update(customer_id, business_id, operation)
147
+ response_json = test_client.client.businesses.response.json()
148
+ request_json = test_client.client.payload
149
+ last_request = mock_requests.last_request
150
+
151
+ assert isinstance(response, Business)
152
+ assert last_request is not None
153
+ assert last_request.method == 'PATCH'
154
+ assert test_client.client.status_code == expected_response_status
155
+ assert unquote(last_request.url) == expected_url, \
156
+ "The URL does not match the expected URL, verify the query string is correct"
157
+ assert loads(request_json) == loads(expected_request_body), \
158
+ "The request JSON doesn't match the expected fixture JSON"
159
+ assert response_json == loads(str(expected_response_body)), \
160
+ "The response JSON doesn't match the expected fixture JSON"
161
+
162
+
163
+ @mark.parametrize(
164
+ 'customer_id, operation, expected_response_status, expected_response_body, expected_url',
165
+ [
166
+ (
167
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
168
+ ListBusinesses(),
169
+ 200,
170
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
171
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses',
172
+ ), (
173
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
174
+ ListBusinesses(Pager()),
175
+ 200,
176
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
177
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?order_by=id[asc]&per_page=50',
178
+ ), (
179
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
180
+ ListBusinesses(Pager(after='biz_01h84a7hr4pzhsajkm8tev89ev')),
181
+ 200,
182
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
183
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?after=biz_01h84a7hr4pzhsajkm8tev89ev&order_by=id[asc]&per_page=50',
184
+ ), (
185
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
186
+ ListBusinesses(statuses=[Status.Archived]),
187
+ 200,
188
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
189
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?status=archived',
190
+ ), (
191
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
192
+ ListBusinesses(ids=['biz_01h84a7hr4pzhsajkm8tev89ev']),
193
+ 200,
194
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
195
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?id=biz_01h84a7hr4pzhsajkm8tev89ev',
196
+ ), (
197
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
198
+ ListBusinesses(ids=['biz_01h84a7hr4pzhsajkm8tev89ev', 'biz_01hf6pv0tmnw1cs0bcj2z8nmqx']),
199
+ 200,
200
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
201
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?id=biz_01h84a7hr4pzhsajkm8tev89ev,biz_01hf6pv0tmnw1cs0bcj2z8nmqx',
202
+ ), (
203
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
204
+ ListBusinesses(search='ChatApp'),
205
+ 200,
206
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
207
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/businesses?search=ChatApp',
208
+ ),
209
+ ],
210
+ ids=[
211
+ "List businesses without pagination",
212
+ "List businesses with default pagination",
213
+ "List paginated businesses after specified product id",
214
+ "List businesses filtered by status",
215
+ "List businesses filtered by id",
216
+ "List businesses filtered by multiple ids",
217
+ "List businesses with includes",
218
+ ],
219
+ )
220
+ def test_list_businesses_returns_expected_response(
221
+ self,
222
+ test_client,
223
+ mock_requests,
224
+ customer_id,
225
+ operation,
226
+ expected_response_status,
227
+ expected_response_body,
228
+ expected_url,
229
+ ):
230
+ expected_url = f"{test_client.base_url}{expected_url}"
231
+ mock_requests.get(expected_url, status_code=expected_response_status)
232
+
233
+ response = test_client.client.businesses.list(customer_id, operation)
234
+ last_request = mock_requests.last_request
235
+
236
+ assert isinstance(response, BusinessCollection)
237
+ assert last_request is not None
238
+ assert last_request.method == 'GET'
239
+ assert test_client.client.status_code == expected_response_status
240
+ assert unquote(last_request.url) == expected_url, \
241
+ "The URL does not match the expected URL, verify the query string is correct"
242
+
243
+
244
+ @mark.parametrize(
245
+ 'customer_id, business_id, expected_response_status, expected_response_body, expected_url',
246
+ [(
247
+ 'ctm_01h844p3h41s12zs5mn4axja51',
248
+ 'biz_01h84a7hr4pzhsajkm8tev89ev',
249
+ 200,
250
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
251
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51/businesses/biz_01h84a7hr4pzhsajkm8tev89ev',
252
+ )],
253
+ ids=["Get a business by its id"],
254
+ )
255
+ def test_get_businesses_returns_expected_response(
256
+ self,
257
+ test_client,
258
+ mock_requests,
259
+ customer_id,
260
+ business_id,
261
+ expected_response_status,
262
+ expected_response_body,
263
+ expected_url,
264
+ ):
265
+ expected_url = f"{test_client.base_url}{expected_url}"
266
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
267
+
268
+ response = test_client.client.businesses.get(customer_id, business_id)
269
+ response_json = test_client.client.businesses.response.json()
270
+ last_request = mock_requests.last_request
271
+
272
+ assert isinstance(response, Business)
273
+ assert last_request is not None
274
+ assert last_request.method == 'GET'
275
+ assert test_client.client.status_code == expected_response_status
276
+ assert unquote(last_request.url) == expected_url, \
277
+ "The URL does not match the expected URL, verify the query string is correct"
278
+ assert response_json == loads(str(expected_response_body)), \
279
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
File without changes
@@ -0,0 +1,291 @@
1
+ from json import loads
2
+ from pytest import mark
3
+ from urllib.parse import unquote
4
+
5
+ from paddle_billing.Entities.Collections import CreditBalanceCollection, CustomerCollection
6
+ from paddle_billing.Entities.Customer import Customer
7
+ from paddle_billing.Entities.Shared import CustomData, Status
8
+
9
+ from paddle_billing.Resources.Customers.Operations import CreateCustomer, ListCustomers, UpdateCustomer
10
+ from paddle_billing.Resources.Shared.Operations import Pager
11
+
12
+ from tests.Utils.TestClient import mock_requests, test_client
13
+ from tests.Utils.ReadsFixture import ReadsFixtures
14
+
15
+
16
+ class TestCustomersClient:
17
+ @mark.parametrize(
18
+ 'operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
19
+ [
20
+ (
21
+ CreateCustomer('test2@example.com'),
22
+ ReadsFixtures.read_raw_json_fixture('request/create_basic'),
23
+ 200,
24
+ ReadsFixtures.read_raw_json_fixture('response/minimal_entity'),
25
+ '/customers',
26
+ ), (
27
+ CreateCustomer(
28
+ email = 'test2@example.com',
29
+ name = 'Alex Wilson',
30
+ custom_data = CustomData({'customer_reference_id': 'abcd1234'}),
31
+ locale = 'en',
32
+ ),
33
+ ReadsFixtures.read_raw_json_fixture('request/create_full'),
34
+ 200,
35
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
36
+ '/customers',
37
+ ),
38
+ ],
39
+ ids=[
40
+ "Create customer with just an email address",
41
+ "Create customer with basic information",
42
+ ],
43
+ )
44
+ def test_create_customer_uses_expected_payload(
45
+ self,
46
+ test_client,
47
+ mock_requests,
48
+ operation,
49
+ expected_request_body,
50
+ expected_response_status,
51
+ expected_response_body,
52
+ expected_url,
53
+ ):
54
+ expected_url = f"{test_client.base_url}{expected_url}"
55
+ mock_requests.post(expected_url, status_code=expected_response_status, text=expected_response_body)
56
+
57
+ response = test_client.client.customers.create(operation)
58
+ response_json = test_client.client.customers.response.json()
59
+ request_json = test_client.client.payload
60
+ last_request = mock_requests.last_request
61
+
62
+ assert isinstance(response, Customer)
63
+ assert last_request is not None
64
+ assert last_request.method == 'POST'
65
+ assert test_client.client.status_code == expected_response_status
66
+ assert unquote(last_request.url) == expected_url, \
67
+ "The URL does not match the expected URL, verify the query string is correct"
68
+ assert loads(request_json) == loads(expected_request_body), \
69
+ "The request JSON doesn't match the expected fixture JSON"
70
+ assert response_json == loads(str(expected_response_body)), \
71
+ "The response JSON doesn't match the expected fixture JSON"
72
+
73
+
74
+ @mark.parametrize(
75
+ 'customer_id, operation, expected_request_body, expected_response_status, expected_response_body, expected_url',
76
+ [
77
+ (
78
+ 'ctm_01h844p3h41s12zs5mn4axja51',
79
+ UpdateCustomer(name='Alex Wilson'),
80
+ ReadsFixtures.read_raw_json_fixture('request/update_single'),
81
+ 200,
82
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
83
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51',
84
+ ), (
85
+ 'ctm_01h844p3h41s12zs5mn4axja51',
86
+ UpdateCustomer(name='Alex Wilson', email='test1@example.com'),
87
+ ReadsFixtures.read_raw_json_fixture('request/update_partial'),
88
+ 200,
89
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
90
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51',
91
+ ), (
92
+ 'ctm_01h844p3h41s12zs5mn4axja51',
93
+ UpdateCustomer(
94
+ name ='Alex Wilson',
95
+ email ='test1@example.com',
96
+ locale = 'el',
97
+ custom_data = CustomData({'customer_reference_id': 'abcd1234'}),
98
+ status = Status.Active,
99
+ ),
100
+ ReadsFixtures.read_raw_json_fixture('request/update_full'),
101
+ 200,
102
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
103
+ '/customers/ctm_01h844p3h41s12zs5mn4axja51',
104
+ ),
105
+ ],
106
+ ids=[
107
+ "Update customer with single new value",
108
+ "Update customer with partial new values",
109
+ "Update customer with all new values",
110
+ ],
111
+ )
112
+ def test_update_customer_uses_expected_payload(
113
+ self,
114
+ test_client,
115
+ mock_requests,
116
+ customer_id,
117
+ operation,
118
+ expected_request_body,
119
+ expected_response_status,
120
+ expected_response_body,
121
+ expected_url,
122
+ ):
123
+ expected_url = f"{test_client.base_url}{expected_url}"
124
+ mock_requests.patch(expected_url, status_code=expected_response_status, text=expected_response_body)
125
+
126
+ response = test_client.client.customers.update(customer_id, operation)
127
+ response_json = test_client.client.customers.response.json()
128
+ request_json = test_client.client.payload
129
+ last_request = mock_requests.last_request
130
+
131
+ assert isinstance(response, Customer)
132
+ assert last_request is not None
133
+ assert last_request.method == 'PATCH'
134
+ assert test_client.client.status_code == expected_response_status
135
+ assert unquote(last_request.url) == expected_url, \
136
+ "The URL does not match the expected URL, verify the query string is correct"
137
+ assert loads(request_json) == loads(expected_request_body), \
138
+ "The request JSON doesn't match the expected fixture JSON"
139
+ assert response_json == loads(str(expected_response_body)), \
140
+ "The response JSON doesn't match the expected fixture JSON"
141
+
142
+
143
+ @mark.parametrize(
144
+ 'operation, expected_response_status, expected_response_body, expected_url',
145
+ [
146
+ (
147
+ ListCustomers(),
148
+ 200,
149
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
150
+ '/customers',
151
+ ), (
152
+ ListCustomers(Pager()),
153
+ 200,
154
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
155
+ '/customers?order_by=id[asc]&per_page=50',
156
+ ), (
157
+ ListCustomers(Pager(after='ctm_01h8441jn5pcwrfhwh78jqt8hk')),
158
+ 200,
159
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
160
+ '/customers?after=ctm_01h8441jn5pcwrfhwh78jqt8hk&order_by=id[asc]&per_page=50',
161
+ ), (
162
+ ListCustomers(statuses=[Status.Archived]),
163
+ 200,
164
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
165
+ '/customers?status=archived',
166
+ ), (
167
+ ListCustomers(ids=['ctm_01h8441jn5pcwrfhwh78jqt8hk']),
168
+ 200,
169
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
170
+ '/customers?id=ctm_01h8441jn5pcwrfhwh78jqt8hk',
171
+ ), (
172
+ ListCustomers(ids=['ctm_01h8441jn5pcwrfhwh78jqt8hk', 'ctm_01h844p3h41s12zs5mn4axja51']),
173
+ 200,
174
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
175
+ '/customers?id=ctm_01h8441jn5pcwrfhwh78jqt8hk,ctm_01h844p3h41s12zs5mn4axja51',
176
+ ), (
177
+ ListCustomers(search='Alex'),
178
+ 200,
179
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
180
+ '/customers?search=Alex',
181
+ ), (
182
+ ListCustomers(emails=['dx@paddle.com']),
183
+ 200,
184
+ ReadsFixtures.read_raw_json_fixture('response/list_default'),
185
+ '/customers?email=dx@paddle.com',
186
+ ),
187
+ ],
188
+ ids=[
189
+ "List customers without pagination",
190
+ "List customers with default pagination",
191
+ "List paginated customers after specified transaction_id",
192
+ "List customers filtered by status",
193
+ "List customers filtered by id",
194
+ "List customers filtered by multiple ids",
195
+ "List customers filtered by search term",
196
+ "List customers filtered by email addresses",
197
+ ],
198
+ )
199
+ def test_list_customers_returns_expected_response(
200
+ self,
201
+ test_client,
202
+ mock_requests,
203
+ operation,
204
+ expected_response_status,
205
+ expected_response_body,
206
+ expected_url,
207
+ ):
208
+ expected_url = f"{test_client.base_url}{expected_url}"
209
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
210
+
211
+ response = test_client.client.customers.list(operation)
212
+ last_request = mock_requests.last_request
213
+
214
+ assert isinstance(response, CustomerCollection)
215
+ assert last_request is not None
216
+ assert last_request.method == 'GET'
217
+ assert test_client.client.status_code == expected_response_status
218
+ assert unquote(last_request.url) == expected_url, \
219
+ "The URL does not match the expected URL, verify the query string is correct"
220
+
221
+
222
+ @mark.parametrize(
223
+ 'customer_id, expected_response_status, expected_response_body, expected_url',
224
+ [(
225
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
226
+ 200,
227
+ ReadsFixtures.read_raw_json_fixture('response/full_entity'),
228
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk',
229
+ )],
230
+ ids=["Get customer by its id"],
231
+ )
232
+ def test_get_customers_returns_expected_response(
233
+ self,
234
+ test_client,
235
+ mock_requests,
236
+ customer_id,
237
+ expected_response_status,
238
+ expected_response_body,
239
+ expected_url,
240
+ ):
241
+ expected_url = f"{test_client.base_url}{expected_url}"
242
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
243
+
244
+ response = test_client.client.customers.get(customer_id)
245
+ response_json = test_client.client.customers.response.json()
246
+ last_request = mock_requests.last_request
247
+
248
+ assert isinstance(response, Customer)
249
+ assert last_request is not None
250
+ assert last_request.method == 'GET'
251
+ assert test_client.client.status_code == expected_response_status
252
+ assert unquote(last_request.url) == expected_url, \
253
+ "The URL does not match the expected URL, verify the query string is correct"
254
+ assert response_json == loads(str(expected_response_body)), \
255
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
256
+
257
+
258
+ @mark.parametrize(
259
+ 'customer_id, expected_response_status, expected_response_body, expected_url',
260
+ [(
261
+ 'ctm_01h8441jn5pcwrfhwh78jqt8hk',
262
+ 200,
263
+ ReadsFixtures.read_raw_json_fixture('response/list_credit_balances'),
264
+ '/customers/ctm_01h8441jn5pcwrfhwh78jqt8hk/credit-balances',
265
+ )],
266
+ ids=["List a customer's credit balances"],
267
+ )
268
+ def test_list_credit_balance_customers_returns_expected_response(
269
+ self,
270
+ test_client,
271
+ mock_requests,
272
+ customer_id,
273
+ expected_response_status,
274
+ expected_response_body,
275
+ expected_url,
276
+ ):
277
+ expected_url = f"{test_client.base_url}{expected_url}"
278
+ mock_requests.get(expected_url, status_code=expected_response_status, text=expected_response_body)
279
+
280
+ response = test_client.client.customers.credit_balances(customer_id)
281
+ response_json = test_client.client.customers.response.json()
282
+ last_request = mock_requests.last_request
283
+
284
+ assert isinstance(response, CreditBalanceCollection)
285
+ assert last_request is not None
286
+ assert last_request.method == 'GET'
287
+ assert test_client.client.status_code == expected_response_status
288
+ assert unquote(last_request.url) == expected_url, \
289
+ "The URL does not match the expected URL, verify the query string is correct"
290
+ assert response_json == loads(str(expected_response_body)), \
291
+ "The response JSON generated by ResponseParser() doesn't match the expected fixture JSON"
File without changes