Skip to content

Commit

Permalink
Add Zone Subscription Creation (#196)
Browse files Browse the repository at this point in the history
Consuming the tenant API requires this as a part of the provisioning
  • Loading branch information
phily245 authored Oct 13, 2021
1 parent 12ac2bb commit 5024c2a
Show file tree
Hide file tree
Showing 5 changed files with 220 additions and 0 deletions.
51 changes: 51 additions & 0 deletions src/Endpoints/ZoneSubscriptions.php
Original file line number Diff line number Diff line change
@@ -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 changes: 81 additions & 0 deletions tests/Endpoints/ZoneSubscriptionsTest.php
Original file line number Diff line number Diff line change
@@ -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 changes: 40 additions & 0 deletions tests/Fixtures/Endpoints/createZoneSubscription.json
Original file line number Diff line number Diff line change
@@ -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 changes: 6 additions & 0 deletions tests/Fixtures/Endpoints/listEmptyZoneSubscriptions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"success": true,
"errors": [],
"messages": [],
"result": []
}
42 changes: 42 additions & 0 deletions tests/Fixtures/Endpoints/listZoneSubscriptions.json
Original file line number Diff line number Diff line change
@@ -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"
}
]
}

0 comments on commit 5024c2a

Please sign in to comment.