Skip to content

Commit

Permalink
fix: Adjustment items can be omitted when adjustment type is full
Browse files Browse the repository at this point in the history
  • Loading branch information
davidgrayston-paddle committed Dec 17, 2024
1 parent 6f5191e commit ce4c7d1
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 5 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

Check our main [developer changelog](https://developer.paddle.com/?utm_source=dx&utm_medium=paddle-php-sdk) for information about changes to the Paddle Billing platform, the Paddle API, and other developer tools.

## [1.7.2] - 2024-12-17

### Fixed

- Adjustment items can be omitted for when adjustment type is full

## [1.7.1] - 2024-12-13

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@

class Client
{
private const SDK_VERSION = '1.7.1';
private const SDK_VERSION = '1.7.2';

public readonly LoggerInterface $logger;
public readonly Options $options;
Expand Down
16 changes: 12 additions & 4 deletions src/Resources/Adjustments/Operations/CreateAdjustment.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,36 @@ class CreateAdjustment implements \JsonSerializable
*/
public function __construct(
public readonly Action $action,
public readonly array|Undefined $items,
public readonly array|Undefined|null $items,
public readonly string $reason,
public readonly string $transactionId,
public readonly AdjustmentType|Undefined $type = new Undefined(),
) {
if ($this->type === AdjustmentType::Partial() && ($this->items instanceof Undefined || empty($this->items))) {
$typeIsFull = AdjustmentType::Full()->equals($this->type);

if (! $typeIsFull && ($this->items instanceof Undefined || empty($this->items))) {
throw InvalidArgumentException::arrayIsEmpty('items');
}

if ($typeIsFull && is_array($this->items)) {
throw new InvalidArgumentException('items are not allowed when the adjustment type is full');
}
}

public function jsonSerialize(): array
{
$items = [];
if (is_array($this->items)) {
$items = [];

if (! $this->items instanceof Undefined) {
foreach ($this->items as $item) {
$items[] = [
'item_id' => $item->itemId,
'type' => $item->type->getValue(),
'amount' => $item->amount,
];
}
} else {
$items = $this->items;
}

return $this->filterUndefined([
Expand Down
41 changes: 41 additions & 0 deletions tests/Functional/Resources/Adjustments/AdjustmentsClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Paddle\SDK\Resources\Adjustments\Operations\ListAdjustments;
use Paddle\SDK\Resources\Shared\Operations\List\Pager;
use Paddle\SDK\Tests\Utils\ReadsFixtures;
use Paddle\SDK\Undefined;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
Expand Down Expand Up @@ -100,6 +101,46 @@ public static function createOperationsProvider(): \Generator
new Response(200, body: self::readRawJsonFixture('response/full_entity')),
self::readRawJsonFixture('request/create_full'),
];

yield 'Partial type with items' => [
new CreateAdjustment(
Action::Refund(),
[new AdjustmentItem(
'txnitm_01h8bxryv3065dyh6103p3yg28',
AdjustmentType::Partial(),
'100',
)],
'error',
'txn_01h8bxpvx398a7zbawb77y0kp5',
\Paddle\SDK\Entities\Adjustment\AdjustmentType::Partial(),
),
new Response(200, body: self::readRawJsonFixture('response/minimal_entity')),
self::readRawJsonFixture('request/create_type_partial_with_items'),
];

yield 'Full type with no items' => [
new CreateAdjustment(
Action::Refund(),
new Undefined(),
'error',
'txn_01h8bxpvx398a7zbawb77y0kp5',
\Paddle\SDK\Entities\Adjustment\AdjustmentType::Full(),
),
new Response(200, body: self::readRawJsonFixture('response/minimal_entity')),
self::readRawJsonFixture('request/create_type_full_with_no_items'),
];

yield 'Full type with null items' => [
new CreateAdjustment(
Action::Refund(),
null,
'error',
'txn_01h8bxpvx398a7zbawb77y0kp5',
\Paddle\SDK\Entities\Adjustment\AdjustmentType::Full(),
),
new Response(200, body: self::readRawJsonFixture('response/minimal_entity')),
self::readRawJsonFixture('request/create_type_full_with_null_items'),
];
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"action": "refund",
"type": "full",
"reason": "error",
"transaction_id": "txn_01h8bxpvx398a7zbawb77y0kp5"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"action": "refund",
"type": "full",
"items": null,
"reason": "error",
"transaction_id": "txn_01h8bxpvx398a7zbawb77y0kp5"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"action": "refund",
"type": "partial",
"items": [
{
"item_id": "txnitm_01h8bxryv3065dyh6103p3yg28",
"type": "partial",
"amount": "100"
}
],
"reason": "error",
"transaction_id": "txn_01h8bxpvx398a7zbawb77y0kp5"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

declare(strict_types=1);

namespace Paddle\SDK\Tests\Unit\Resources\Adjustments\Operations;

use Paddle\SDK\Entities\Adjustment\AdjustmentType;
use Paddle\SDK\Entities\Shared\Action;
use Paddle\SDK\Exceptions\SdkExceptions\InvalidArgumentException;
use Paddle\SDK\Resources\Adjustments\Operations\CreateAdjustment;
use Paddle\SDK\Undefined;
use PHPUnit\Framework\TestCase;

class CreateAdjustmentTest extends TestCase
{
/**
* @test
*
* @dataProvider invalidItemsDataProvider
*/
public function it_validates_items(array|Undefined|null $items, AdjustmentType $type, string $expectedExceptionMessage): void
{
self::expectException(InvalidArgumentException::class);
self::expectExceptionMessage($expectedExceptionMessage);

new CreateAdjustment(
Action::Refund(),
$items,
'error',
'txn_01h8bxpvx398a7zbawb77y0kp5',
$type,
);
}

public static function invalidItemsDataProvider(): \Generator
{
yield 'Empty' => [
[],
AdjustmentType::Partial(),
'items cannot be empty',
];
yield 'Undefined' => [
new Undefined(),
AdjustmentType::Partial(),
'items cannot be empty',
];
yield 'Null' => [
null,
AdjustmentType::Partial(),
'items cannot be empty',
];
yield 'Items for full type' => [
[],
AdjustmentType::Full(),
'items are not allowed when the adjustment type is full',
];
}
}

0 comments on commit ce4c7d1

Please sign in to comment.