From 337b3bacd862dcde41e32e0ce99004eb811947c3 Mon Sep 17 00:00:00 2001 From: Wiktor Plaga Date: Mon, 1 Dec 2025 13:53:44 +0100 Subject: [PATCH 1/2] Add fetching additional DataSource fields --- README.md | 20 +++ src/DataSource.php | 22 ++- src/Service/RequestService.php | 14 ++ tests/Unit/DataSourceTest.php | 310 +++++++++++++++++++++++++++++++++ 4 files changed, 364 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/DataSourceTest.php diff --git a/README.md b/README.md index 9d067a9..d372d21 100644 --- a/README.md +++ b/README.md @@ -99,12 +99,32 @@ $ds = ChartMogul\DataSource::create([ ChartMogul\DataSource::retrieve($uuid); ``` +Include extra fields: + +```php +ChartMogul\DataSource::retrieve($uuid, [ + 'with_processing_status' => true, + 'with_auto_churn_subscription_setting' => true, + 'with_invoice_handling_setting' => true +]); +``` + **List Datasources** ```php ChartMogul\DataSource::all(); ``` +Include extra fields: + +```php +ChartMogul\DataSource::all([ + 'with_processing_status' => true, + 'with_auto_churn_subscription_setting' => true, + 'with_invoice_handling_setting' => true +]); +``` + **Delete a Datasource** ```php diff --git a/src/DataSource.php b/src/DataSource.php index 40caa71..447bf21 100644 --- a/src/DataSource.php +++ b/src/DataSource.php @@ -2,11 +2,12 @@ namespace ChartMogul; +use ChartMogul\Http\ClientInterface; use ChartMogul\Resource\AbstractResource; use ChartMogul\Service\CreateTrait; use ChartMogul\Service\AllTrait; use ChartMogul\Service\DestroyTrait; -use ChartMogul\Service\GetTrait; +use ChartMogul\Service\RequestService; /** * @codeCoverageIgnore @@ -14,13 +15,15 @@ * @property-read string $status * @property-read string $created_at * @property-read string $system + * @property-read string $processing_status + * @property-read string $auto_churn_subscription_setting + * @property-read string $invoice_handling_setting */ class DataSource extends AbstractResource { use CreateTrait; use AllTrait; use DestroyTrait; - use GetTrait; /** * @ignore @@ -41,6 +44,21 @@ class DataSource extends AbstractResource protected $status; protected $created_at; protected $system; + protected $processing_status; + protected $auto_churn_subscription_setting; + protected $invoice_handling_setting; public $name; + + public static function retrieve($uuid, $query = [], ?ClientInterface $client = null) + { + return (new RequestService($client)) + ->setResourceClass(static::class) + ->getWithQuery($uuid, $query); + } + + public static function get($uuid, $query = [], ?ClientInterface $client = null) + { + return static::retrieve($uuid, $query, $client); + } } diff --git a/src/Service/RequestService.php b/src/Service/RequestService.php index 9160896..95bad7c 100644 --- a/src/Service/RequestService.php +++ b/src/Service/RequestService.php @@ -202,4 +202,18 @@ public function get($uuid = null) return $class::fromArray($response, $this->client); } + + public function getWithQuery($uuid = null, $query = []) + { + $class = $this->resourceClass; + $response = $this->client + ->setResourceKey($class::RESOURCE_NAME) + ->send( + $uuid ? $class::RESOURCE_PATH.'/'.$uuid : $class::RESOURCE_PATH, + 'GET', + $query + ); + + return $class::fromArray($response, $this->client); + } } diff --git a/tests/Unit/DataSourceTest.php b/tests/Unit/DataSourceTest.php new file mode 100644 index 0000000..0a26c2d --- /dev/null +++ b/tests/Unit/DataSourceTest.php @@ -0,0 +1,310 @@ +getMockClient(0, [200], $stream); + + $result = DataSource::create([ + 'name' => 'In-house Billing' + ], $cmClient); + + $request = $mockClient->getRequests()[0]; + + $this->assertEquals("POST", $request->getMethod()); + $uri = $request->getUri(); + $this->assertEquals("", $uri->getQuery()); + $this->assertEquals("/v1/data_sources", $uri->getPath()); + + $this->assertTrue($result instanceof DataSource); + $this->assertEquals("ds_fef05d54-47b4-431b-aed2-eb6b9e545430", $result->uuid); + $this->assertEquals("In-house Billing", $result->name); + $this->assertEquals("idle", $result->status); + $this->assertEquals("custom", $result->system); + $this->assertEquals("2016-01-10T15:34:05.000Z", $result->created_at); + } + + public function testRetrieveDataSource() + { + $stream = Psr7\stream_for(DataSourceTest::RETRIEVE_DATA_SOURCE_JSON); + list($cmClient, $mockClient) = $this->getMockClient(0, [200], $stream); + + $uuid = 'ds_fef05d54-47b4-431b-aed2-eb6b9e545430'; + + $result = DataSource::retrieve($uuid, [ + 'with_processing_status' => true, + 'with_auto_churn_subscription_setting' => true, + 'with_invoice_handling_setting' => true + ], $cmClient); + $request = $mockClient->getRequests()[0]; + + $this->assertEquals("GET", $request->getMethod()); + $uri = $request->getUri(); + $this->assertEquals("with_processing_status=1&with_auto_churn_subscription_setting=1&with_invoice_handling_setting=1", $uri->getQuery()); + $this->assertEquals("/v1/data_sources/".$uuid, $uri->getPath()); + + $this->assertTrue($result instanceof DataSource); + $this->assertEquals($uuid, $result->uuid); + $this->assertEquals("In-house Billing", $result->name); + $this->assertEquals("idle", $result->status); + $this->assertEquals("custom", $result->system); + $this->assertEquals("2016-01-10T15:34:05.000Z", $result->created_at); + $this->assertEquals(["processed" => 61, "failed" => 3, "pending" => 0], $result->processing_status); + $this->assertEquals(true, $result->auto_churn_subscription_setting); + $this->assertIsArray($result->invoice_handling_setting); + $this->assertArrayHasKey('manual', $result->invoice_handling_setting); + $this->assertArrayHasKey('automatic', $result->invoice_handling_setting); + } + + public function testGetDataSource() + { + $stream = Psr7\stream_for(DataSourceTest::RETRIEVE_DATA_SOURCE_JSON); + list($cmClient, $mockClient) = $this->getMockClient(0, [200], $stream); + + $uuid = 'ds_fef05d54-47b4-431b-aed2-eb6b9e545430'; + + // Test the alias method get() + $result = DataSource::get($uuid, [], $cmClient); + $request = $mockClient->getRequests()[0]; + + $this->assertEquals("GET", $request->getMethod()); + $uri = $request->getUri(); + $this->assertEquals("", $uri->getQuery()); + $this->assertEquals("/v1/data_sources/".$uuid, $uri->getPath()); + + $this->assertTrue($result instanceof DataSource); + $this->assertEquals($uuid, $result->uuid); + } + + public function testListDataSources() + { + $stream = Psr7\stream_for(DataSourceTest::LIST_DATA_SOURCES_JSON); + list($cmClient, $mockClient) = $this->getMockClient(0, [200], $stream); + + $result = DataSource::all([ + 'with_processing_status' => true, + 'with_auto_churn_subscription_setting' => true, + 'with_invoice_handling_setting' => true + ], $cmClient); + $request = $mockClient->getRequests()[0]; + + $this->assertEquals("GET", $request->getMethod()); + $uri = $request->getUri(); + $this->assertEquals("with_processing_status=1&with_auto_churn_subscription_setting=1&with_invoice_handling_setting=1", $uri->getQuery()); + $this->assertEquals("/v1/data_sources", $uri->getPath()); + + $this->assertTrue($result instanceof Collection); + $this->assertCount(2, $result); + $this->assertTrue($result[0] instanceof DataSource); + $this->assertTrue($result[1] instanceof DataSource); + + // Test first data source + $this->assertEquals("ds_fef05d54-47b4-431b-aed2-eb6b9e545430", $result[0]->uuid); + $this->assertEquals("In-house Billing", $result[0]->name); + $this->assertEquals("idle", $result[0]->status); + $this->assertEquals("custom", $result[0]->system); + + // Test second data source + $this->assertEquals("ds_1234abcd-47b4-431b-aed2-eb6b9e545431", $result[1]->uuid); + $this->assertEquals("Stripe", $result[1]->name); + $this->assertEquals("imported", $result[1]->status); + $this->assertEquals("stripe", $result[1]->system); + + // Test pagination properties + $this->assertEquals(false, $result->has_more); + $this->assertEquals(200, $result->per_page); + $this->assertEquals(1, $result->page); + } + + public function testDeleteDataSource() + { + $stream = Psr7\stream_for('{}'); + list($cmClient, $mockClient) = $this->getMockClient(0, [204], $stream); + + $uuid = 'ds_fef05d54-47b4-431b-aed2-eb6b9e545430'; + $dataSource = new DataSource(['uuid' => $uuid], $cmClient); + + $result = $dataSource->destroy(); + $request = $mockClient->getRequests()[0]; + + $this->assertEquals("DELETE", $request->getMethod()); + $uri = $request->getUri(); + $this->assertEquals("", $uri->getQuery()); + $this->assertEquals("/v1/data_sources/".$uuid, $uri->getPath()); + + $this->assertTrue($result); + } + + public function testDataSourceProperties() + { + $dataSource = new DataSource([ + 'uuid' => 'ds_test-uuid', + 'name' => 'Test Data Source', + 'status' => 'active', + 'created_at' => '2023-01-01T00:00:00.000Z', + 'system' => 'custom', + 'processing_status' => ['processed' => 61, 'failed' => 3, 'pending' => 0], + 'auto_churn_subscription_setting' => true, + 'invoice_handling_setting' => [ + 'manual' => [ + 'create_subscription_when_invoice_is' => 'open', + 'update_subscription_when_invoice_is' => 'open', + 'prevent_subscription_for_invoice_voided' => true, + 'prevent_subscription_for_invoice_refunded' => false, + 'prevent_subscription_for_invoice_written_off' => true + ], + 'automatic' => [ + 'create_subscription_when_invoice_is' => 'open', + 'update_subscription_when_invoice_is' => 'open', + 'prevent_subscription_for_invoice_voided' => true, + 'prevent_subscription_for_invoice_refunded' => false, + 'prevent_subscription_for_invoice_written_off' => true + ] + ] + ]); + + // Test read-only properties + $this->assertEquals('ds_test-uuid', $dataSource->uuid); + $this->assertEquals('active', $dataSource->status); + $this->assertEquals('2023-01-01T00:00:00.000Z', $dataSource->created_at); + $this->assertEquals('custom', $dataSource->system); + $this->assertEquals(['processed' => 61, 'failed' => 3, 'pending' => 0], $dataSource->processing_status); + $this->assertEquals(true, $dataSource->auto_churn_subscription_setting); + $this->assertIsArray($dataSource->invoice_handling_setting); + $this->assertArrayHasKey('manual', $dataSource->invoice_handling_setting); + $this->assertArrayHasKey('automatic', $dataSource->invoice_handling_setting); + + // Test writable property + $this->assertEquals('Test Data Source', $dataSource->name); + + // Test that name is writable + $dataSource->name = 'Updated Name'; + $this->assertEquals('Updated Name', $dataSource->name); + } + + public function testDataSourceConstants() + { + $this->assertEquals('/v1/data_sources', DataSource::RESOURCE_PATH); + $this->assertEquals('Data Source', DataSource::RESOURCE_NAME); + $this->assertEquals('data_sources', DataSource::ROOT_KEY); + } + + public function testDataSourceToArray() + { + $dataSource = new DataSource([ + 'uuid' => 'ds_test-uuid', + 'name' => 'Test Data Source', + 'status' => 'active', + 'created_at' => '2023-01-01T00:00:00.000Z', + 'system' => 'custom' + ]); + + $array = $dataSource->toArray(); + + $this->assertIsArray($array); + $this->assertEquals('ds_test-uuid', $array['uuid']); + $this->assertEquals('Test Data Source', $array['name']); + $this->assertEquals('active', $array['status']); + $this->assertEquals('2023-01-01T00:00:00.000Z', $array['created_at']); + $this->assertEquals('custom', $array['system']); + } +} From d737c1022b2f289953ec06963c7b5242e20962ed Mon Sep 17 00:00:00 2001 From: Wiktor Plaga Date: Tue, 9 Dec 2025 10:07:57 +0100 Subject: [PATCH 2/2] Update auto_churn_subscription_setting response format --- src/DataSource.php | 6 +++--- tests/Unit/DataSourceTest.php | 28 ++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/DataSource.php b/src/DataSource.php index 447bf21..eb3c6bc 100644 --- a/src/DataSource.php +++ b/src/DataSource.php @@ -15,9 +15,9 @@ * @property-read string $status * @property-read string $created_at * @property-read string $system - * @property-read string $processing_status - * @property-read string $auto_churn_subscription_setting - * @property-read string $invoice_handling_setting + * @property-read array $processing_status + * @property-read array $auto_churn_subscription_setting + * @property-read array $invoice_handling_setting */ class DataSource extends AbstractResource { diff --git a/tests/Unit/DataSourceTest.php b/tests/Unit/DataSourceTest.php index 0a26c2d..bf7de20 100644 --- a/tests/Unit/DataSourceTest.php +++ b/tests/Unit/DataSourceTest.php @@ -29,7 +29,10 @@ class DataSourceTest extends TestCase "failed": 3, "pending": 0 }, - "auto_churn_subscription_setting": true, + "auto_churn_subscription_setting": { + "enabled": true, + "interval": 30 + }, "invoice_handling_setting": { "manual": { "create_subscription_when_invoice_is": "open", @@ -61,7 +64,10 @@ class DataSourceTest extends TestCase "failed": 3, "pending": 0 }, - "auto_churn_subscription_setting": true, + "auto_churn_subscription_setting": { + "enabled": true, + "interval": 30 + }, "invoice_handling_setting": { "manual": { "create_subscription_when_invoice_is": "open", @@ -90,7 +96,10 @@ class DataSourceTest extends TestCase "failed": 3, "pending": 0 }, - "auto_churn_subscription_setting": "disabled", + "auto_churn_subscription_setting": { + "enabled": false, + "interval": null + }, "invoice_handling_setting": "multiple_invoices_per_subscription" } ], @@ -149,7 +158,9 @@ public function testRetrieveDataSource() $this->assertEquals("custom", $result->system); $this->assertEquals("2016-01-10T15:34:05.000Z", $result->created_at); $this->assertEquals(["processed" => 61, "failed" => 3, "pending" => 0], $result->processing_status); - $this->assertEquals(true, $result->auto_churn_subscription_setting); + $this->assertIsArray($result->auto_churn_subscription_setting); + $this->assertEquals(true, $result->auto_churn_subscription_setting['enabled']); + $this->assertEquals(30, $result->auto_churn_subscription_setting['interval']); $this->assertIsArray($result->invoice_handling_setting); $this->assertArrayHasKey('manual', $result->invoice_handling_setting); $this->assertArrayHasKey('automatic', $result->invoice_handling_setting); @@ -243,7 +254,10 @@ public function testDataSourceProperties() 'created_at' => '2023-01-01T00:00:00.000Z', 'system' => 'custom', 'processing_status' => ['processed' => 61, 'failed' => 3, 'pending' => 0], - 'auto_churn_subscription_setting' => true, + 'auto_churn_subscription_setting' => [ + 'enabled' => true, + 'interval' => 30 + ], 'invoice_handling_setting' => [ 'manual' => [ 'create_subscription_when_invoice_is' => 'open', @@ -268,7 +282,9 @@ public function testDataSourceProperties() $this->assertEquals('2023-01-01T00:00:00.000Z', $dataSource->created_at); $this->assertEquals('custom', $dataSource->system); $this->assertEquals(['processed' => 61, 'failed' => 3, 'pending' => 0], $dataSource->processing_status); - $this->assertEquals(true, $dataSource->auto_churn_subscription_setting); + $this->assertIsArray($dataSource->auto_churn_subscription_setting); + $this->assertEquals(true, $dataSource->auto_churn_subscription_setting['enabled']); + $this->assertEquals(30, $dataSource->auto_churn_subscription_setting['interval']); $this->assertIsArray($dataSource->invoice_handling_setting); $this->assertArrayHasKey('manual', $dataSource->invoice_handling_setting); $this->assertArrayHasKey('automatic', $dataSource->invoice_handling_setting);