Add Zone Subscription Creation (#196)
Consuming the tenant API requires this as a part of the provisioning
This commit is contained in:
51
src/Endpoints/ZoneSubscriptions.php
Normal file
51
src/Endpoints/ZoneSubscriptions.php
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Cloudflare\API\Endpoints;
|
||||||
|
|
||||||
|
use Cloudflare\API\Adapter\Adapter;
|
||||||
|
use Cloudflare\API\Traits\BodyAccessorTrait;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
|
class ZoneSubscriptions implements API
|
||||||
|
{
|
||||||
|
use BodyAccessorTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Adapter
|
||||||
|
*/
|
||||||
|
private $adapter;
|
||||||
|
|
||||||
|
public function __construct(Adapter $adapter)
|
||||||
|
{
|
||||||
|
$this->adapter = $adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function listZoneSubscriptions(string $zoneId): \stdClass
|
||||||
|
{
|
||||||
|
$user = $this->adapter->get('zones/' . $zoneId . '/subscriptions');
|
||||||
|
$this->body = json_decode($user->getBody());
|
||||||
|
|
||||||
|
return (object)[
|
||||||
|
'result' => $this->body->result,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addZoneSubscription(string $zoneId, string $ratePlanId = ''): stdClass
|
||||||
|
{
|
||||||
|
$options = [];
|
||||||
|
|
||||||
|
if (empty($ratePlanId) === false) {
|
||||||
|
$options['rate_plan'] = [
|
||||||
|
'id' => $ratePlanId,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingSubscription = $this->listZoneSubscriptions($zoneId);
|
||||||
|
$method = empty($existingSubscription->result) ? 'post' : 'put';
|
||||||
|
|
||||||
|
$subscription = $this->adapter->{$method}('zones/' . $zoneId . '/subscription', $options);
|
||||||
|
$this->body = json_decode($subscription->getBody());
|
||||||
|
|
||||||
|
return $this->body->result;
|
||||||
|
}
|
||||||
|
}
|
||||||
81
tests/Endpoints/ZoneSubscriptionsTest.php
Normal file
81
tests/Endpoints/ZoneSubscriptionsTest.php
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Cloudflare\API\Adapter\Adapter;
|
||||||
|
use Cloudflare\API\Endpoints\ZoneSubscriptions;
|
||||||
|
|
||||||
|
class ZoneSubscriptionsTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testListZoneSubscriptions()
|
||||||
|
{
|
||||||
|
$response = $this->getPsr7JsonResponseForFixture('Endpoints/listZoneSubscriptions.json');
|
||||||
|
|
||||||
|
$mock = $this->getMockBuilder(Adapter::class)->getMock();
|
||||||
|
$mock->method('get')->willReturn($response);
|
||||||
|
|
||||||
|
$mock->expects($this->once())
|
||||||
|
->method('get')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/subscriptions')
|
||||||
|
);
|
||||||
|
|
||||||
|
$zoneSubscriptions = new ZoneSubscriptions($mock);
|
||||||
|
$zoneSubscriptions->listZoneSubscriptions('023e105f4ecef8ad9ca31a8372d0c353');
|
||||||
|
|
||||||
|
$this->assertEquals('506e3185e9c882d175a2d0cb0093d9f2', $zoneSubscriptions->getBody()->result[0]->id);
|
||||||
|
$this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zoneSubscriptions->getBody()->result[0]->zone->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddZoneSubscriptionIfMissing()
|
||||||
|
{
|
||||||
|
$postResponse = $this->getPsr7JsonResponseForFixture('Endpoints/createZoneSubscription.json');
|
||||||
|
$getResponse = $this->getPsr7JsonResponseForFixture('Endpoints/listEmptyZoneSubscriptions.json');
|
||||||
|
|
||||||
|
$mock = $this->getMockBuilder(Adapter::class)->getMock();
|
||||||
|
$mock->method('post')->willReturn($postResponse);
|
||||||
|
$mock->method('get')->willReturn($getResponse);
|
||||||
|
|
||||||
|
$mock->expects($this->once())
|
||||||
|
->method('post')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/subscription'),
|
||||||
|
$this->equalTo([
|
||||||
|
'rate_plan' => [
|
||||||
|
'id' => 'PARTNER_PRO',
|
||||||
|
],
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$zoneSubscriptions = new ZoneSubscriptions($mock);
|
||||||
|
$zoneSubscriptions->addZoneSubscription('023e105f4ecef8ad9ca31a8372d0c353', 'PARTNER_PRO');
|
||||||
|
|
||||||
|
$this->assertEquals('506e3185e9c882d175a2d0cb0093d9f2', $zoneSubscriptions->getBody()->result->id);
|
||||||
|
$this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zoneSubscriptions->getBody()->result->zone->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddZoneSubscriptionIfExisting()
|
||||||
|
{
|
||||||
|
$postResponse = $this->getPsr7JsonResponseForFixture('Endpoints/createZoneSubscription.json');
|
||||||
|
$getResponse = $this->getPsr7JsonResponseForFixture('Endpoints/listZoneSubscriptions.json');
|
||||||
|
|
||||||
|
$mock = $this->getMockBuilder(Adapter::class)->getMock();
|
||||||
|
$mock->method('put')->willReturn($postResponse);
|
||||||
|
$mock->method('get')->willReturn($getResponse);
|
||||||
|
|
||||||
|
$mock->expects($this->once())
|
||||||
|
->method('put')
|
||||||
|
->with(
|
||||||
|
$this->equalTo('zones/023e105f4ecef8ad9ca31a8372d0c353/subscription'),
|
||||||
|
$this->equalTo([
|
||||||
|
'rate_plan' => [
|
||||||
|
'id' => 'PARTNER_PRO',
|
||||||
|
],
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
$zoneSubscriptions = new ZoneSubscriptions($mock);
|
||||||
|
$zoneSubscriptions->addZoneSubscription('023e105f4ecef8ad9ca31a8372d0c353', 'PARTNER_PRO');
|
||||||
|
|
||||||
|
$this->assertEquals('506e3185e9c882d175a2d0cb0093d9f2', $zoneSubscriptions->getBody()->result->id);
|
||||||
|
$this->assertEquals('023e105f4ecef8ad9ca31a8372d0c353', $zoneSubscriptions->getBody()->result->zone->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
40
tests/Fixtures/Endpoints/createZoneSubscription.json
Normal file
40
tests/Fixtures/Endpoints/createZoneSubscription.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"errors": [],
|
||||||
|
"messages": [],
|
||||||
|
"result": {
|
||||||
|
"app": {
|
||||||
|
"install_id": null
|
||||||
|
},
|
||||||
|
"id": "506e3185e9c882d175a2d0cb0093d9f2",
|
||||||
|
"state": "Paid",
|
||||||
|
"price": 20,
|
||||||
|
"currency": "USD",
|
||||||
|
"component_values": [
|
||||||
|
{
|
||||||
|
"name": "page_rules",
|
||||||
|
"value": 20,
|
||||||
|
"default": 5,
|
||||||
|
"price": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zone": {
|
||||||
|
"id": "023e105f4ecef8ad9ca31a8372d0c353",
|
||||||
|
"name": "example.com"
|
||||||
|
},
|
||||||
|
"frequency": "monthly",
|
||||||
|
"rate_plan": {
|
||||||
|
"id": "free",
|
||||||
|
"public_name": "Business Plan",
|
||||||
|
"currency": "USD",
|
||||||
|
"scope": "zone",
|
||||||
|
"sets": [
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
"is_contract": false,
|
||||||
|
"externally_managed": false
|
||||||
|
},
|
||||||
|
"current_period_end": "2014-03-31T12:20:00Z",
|
||||||
|
"current_period_start": "2014-05-11T12:20:00Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
tests/Fixtures/Endpoints/listEmptyZoneSubscriptions.json
Normal file
6
tests/Fixtures/Endpoints/listEmptyZoneSubscriptions.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"errors": [],
|
||||||
|
"messages": [],
|
||||||
|
"result": []
|
||||||
|
}
|
||||||
42
tests/Fixtures/Endpoints/listZoneSubscriptions.json
Normal file
42
tests/Fixtures/Endpoints/listZoneSubscriptions.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"errors": [],
|
||||||
|
"messages": [],
|
||||||
|
"result": [
|
||||||
|
{
|
||||||
|
"app": {
|
||||||
|
"install_id": null
|
||||||
|
},
|
||||||
|
"id": "506e3185e9c882d175a2d0cb0093d9f2",
|
||||||
|
"state": "Paid",
|
||||||
|
"price": 20,
|
||||||
|
"currency": "USD",
|
||||||
|
"component_values": [
|
||||||
|
{
|
||||||
|
"name": "page_rules",
|
||||||
|
"value": 20,
|
||||||
|
"default": 5,
|
||||||
|
"price": 5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zone": {
|
||||||
|
"id": "023e105f4ecef8ad9ca31a8372d0c353",
|
||||||
|
"name": "example.com"
|
||||||
|
},
|
||||||
|
"frequency": "monthly",
|
||||||
|
"rate_plan": {
|
||||||
|
"id": "free",
|
||||||
|
"public_name": "Business Plan",
|
||||||
|
"currency": "USD",
|
||||||
|
"scope": "zone",
|
||||||
|
"sets": [
|
||||||
|
{}
|
||||||
|
],
|
||||||
|
"is_contract": false,
|
||||||
|
"externally_managed": false
|
||||||
|
},
|
||||||
|
"current_period_end": "2014-03-31T12:20:00Z",
|
||||||
|
"current_period_start": "2014-05-11T12:20:00Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user