Skip to content

Commit eca4b1d

Browse files
CLI-1596: Added SiteInstance Database and Site Instance Database Backup. (#516)
* CLI-1596: Added ssh_url in CodebaseEnvironmentResponse. * CLI-1596: Added ssh_url Mutation Testing. * CLI-1596: Added ssh_url Mutation Testing. * CLI-1596: Added SiteInstance Database Backup. * CLI-1596: Added SiteInstance Database Backup. * CLI-1596: Added SiteInstance Database Backup.
1 parent f294d9a commit eca4b1d

8 files changed

Lines changed: 117 additions & 116 deletions

src/Endpoints/SiteInstances.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
namespace AcquiaCloudApi\Endpoints;
44

5-
use AcquiaCloudApi\Response\BackupResponse;
6-
use AcquiaCloudApi\Response\BackupsResponse;
75
use AcquiaCloudApi\Response\DomainResponse;
86
use AcquiaCloudApi\Response\DomainsResponse;
97
use AcquiaCloudApi\Response\OperationResponse;
8+
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse;
9+
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupsResponse;
1010
use AcquiaCloudApi\Response\SiteInstanceResponse;
1111
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
1212

@@ -66,11 +66,11 @@ public function copyDatabase(string $siteId, string $environmentId, string $sour
6666
/**
6767
* Returns a list of database backups for a site instance.
6868
*
69-
* @return BackupsResponse<BackupResponse>
69+
* @return SiteInstanceDatabaseBackupsResponse<SiteInstanceDatabaseBackupResponse>
7070
*/
71-
public function getDatabaseBackups(string $siteId, string $environmentId): BackupsResponse
71+
public function getDatabaseBackups(string $siteId, string $environmentId): SiteInstanceDatabaseBackupsResponse
7272
{
73-
return new BackupsResponse(
73+
return new SiteInstanceDatabaseBackupsResponse(
7474
$this->client->request(
7575
'get',
7676
"/site-instances/$siteId.$environmentId/database/backups"
@@ -94,9 +94,12 @@ public function createDatabaseBackup(string $siteId, string $environmentId): Ope
9494
/**
9595
* Returns details about a specific database backup.
9696
*/
97-
public function getDatabaseBackup(string $siteId, string $environmentId, string $backupId): BackupResponse
98-
{
99-
return new BackupResponse(
97+
public function getDatabaseBackup(
98+
string $siteId,
99+
string $environmentId,
100+
string $backupId
101+
): SiteInstanceDatabaseBackupResponse {
102+
return new SiteInstanceDatabaseBackupResponse(
100103
$this->client->request(
101104
'get',
102105
"/site-instances/$siteId.$environmentId/database/backups/$backupId"
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace AcquiaCloudApi\Response;
4+
5+
class SiteInstanceDatabaseBackupResponse
6+
{
7+
public string $id;
8+
public string $database_id;
9+
public string $created_at;
10+
public object $links;
11+
12+
public function __construct(object $data)
13+
{
14+
$this->id = $data->id;
15+
$this->database_id = $data->database_id;
16+
$this->created_at = $data->created_at;
17+
$this->links = $data->_links;
18+
}
19+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace AcquiaCloudApi\Response;
4+
5+
use ArrayObject;
6+
7+
/**
8+
* @template-extends \ArrayObject<int, \AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse>
9+
*/
10+
class SiteInstanceDatabaseBackupsResponse extends ArrayObject
11+
{
12+
/**
13+
* @param array<object> $backups
14+
*/
15+
public function __construct(array $backups)
16+
{
17+
parent::__construct(
18+
array_map(
19+
static function ($backup) {
20+
return new SiteInstanceDatabaseBackupResponse($backup);
21+
},
22+
$backups
23+
),
24+
self::ARRAY_AS_PROPS
25+
);
26+
}
27+
}

src/Response/SiteInstanceDatabaseResponse.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,19 @@ class SiteInstanceDatabaseResponse
1010

1111
public string $databaseRole;
1212

13-
public string $databaseUser;
13+
public string $databaseUserName;
1414

1515
public string $databasePassword;
1616

17-
public int $databasePort;
18-
1917
public object $links;
2018

2119
public function __construct(object $database)
2220
{
2321
$this->databaseHost = $database->database_host;
2422
$this->databaseName = $database->database_name;
2523
$this->databaseRole = $database->database_role;
26-
$this->databaseUser = $database->database_user;
24+
$this->databaseUserName = $database->database_user_name;
2725
$this->databasePassword = $database->database_password;
28-
$this->databasePort = $database->database_port;
2926
$this->links = $database->_links;
3027
}
3128
}

tests/Endpoints/SiteInstancesTest.php

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
use AcquiaCloudApi\Endpoints\SiteInstances;
77
use AcquiaCloudApi\Response\SiteInstanceResponse;
88
use AcquiaCloudApi\Response\SiteInstanceDatabaseResponse;
9-
use AcquiaCloudApi\Response\BackupResponse;
10-
use AcquiaCloudApi\Response\BackupsResponse;
119
use AcquiaCloudApi\Response\CodebaseEnvironmentResponse;
1210
use AcquiaCloudApi\Response\DomainResponse;
1311
use AcquiaCloudApi\Response\DomainsResponse;
1412
use AcquiaCloudApi\Response\OperationResponse;
13+
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupResponse;
14+
use AcquiaCloudApi\Response\SiteInstanceDatabaseBackupsResponse;
1515
use AcquiaCloudApi\Response\SiteResponse;
1616

1717
class SiteInstancesTest extends CloudApiTestCase
@@ -51,9 +51,8 @@ public function testGetSiteInstanceDatabase(): void
5151
$this->assertEquals('localhost', $result->databaseHost);
5252
$this->assertEquals('example_db', $result->databaseName);
5353
$this->assertEquals('primary', $result->databaseRole);
54-
$this->assertEquals('example_user', $result->databaseUser);
54+
$this->assertEquals('example_user', $result->databaseUserName);
5555
$this->assertEquals('example_password', $result->databasePassword);
56-
$this->assertEquals(3306, $result->databasePort);
5756
}
5857

5958
public function testCopyDatabase(): void
@@ -90,17 +89,19 @@ public function testGetDatabaseBackups(): void
9089
'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3'
9190
);
9291

93-
$this->assertInstanceOf(BackupsResponse::class, $result);
92+
$this->assertInstanceOf(SiteInstanceDatabaseBackupsResponse::class, $result);
9493
$this->assertNotEmpty($result);
9594

9695
foreach ($result as $record) {
97-
$this->assertInstanceOf(BackupResponse::class, $record);
96+
$this->assertInstanceOf(SiteInstanceDatabaseBackupResponse::class, $record);
9897
}
9998

10099
// Test first backup
101100
$firstBackup = $result[0];
102-
$this->assertEquals(1, $firstBackup->id);
103-
$this->assertEquals('daily', $firstBackup->type);
101+
$this->assertEquals('e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3', $firstBackup->id);
102+
$this->assertEquals('b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3', $firstBackup->database_id);
103+
$this->assertEquals('2025-04-01T13:01:06.603Z', $firstBackup->created_at);
104+
$this->assertIsObject($firstBackup->links);
104105
}
105106

106107
public function testCreateDatabaseBackup(): void
@@ -127,14 +128,14 @@ public function testGetDatabaseBackup(): void
127128
$result = $siteInstances->getDatabaseBackup(
128129
'3e8ecbec-ea7c-4260-8414-ef2938c859bc',
129130
'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
130-
'1'
131+
'backup-123'
131132
);
132133

133-
$this->assertInstanceOf(BackupResponse::class, $result);
134-
$this->assertEquals(1, $result->id);
135-
$this->assertEquals('daily', $result->type);
136-
$this->assertEquals('2023-01-15T10:00:00.000Z', $result->startedAt);
137-
$this->assertEquals('2023-01-15T10:30:00.000Z', $result->completedAt);
134+
$this->assertInstanceOf(SiteInstanceDatabaseBackupResponse::class, $result);
135+
$this->assertEquals('e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3', $result->id);
136+
$this->assertEquals('b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3', $result->database_id);
137+
$this->assertEquals('2025-04-01T13:01:06.603Z', $result->created_at);
138+
$this->assertIsObject($result->links);
138139
}
139140

140141
public function testDownloadDatabaseBackup(): void
@@ -198,11 +199,11 @@ public function testGetDomain(): void
198199
$client = $this->getMockClient($response);
199200

200201
$siteInstances = new SiteInstances($client);
201-
$result = $siteInstances->getDomain(
202-
'3e8ecbec-ea7c-4260-8414-ef2938c859bc',
203-
'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
204-
'example.com'
205-
);
202+
$result = $siteInstances->getDomain(
203+
'3e8ecbec-ea7c-4260-8414-ef2938c859bc',
204+
'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3',
205+
'example.com'
206+
);
206207

207208
$this->assertInstanceOf(DomainResponse::class, $result);
208209
$this->assertEquals('example.com', $result->hostname);
@@ -309,9 +310,8 @@ public function testDatabaseResponseTransformations(): void
309310
$this->assertNotNull($result->databaseHost);
310311
$this->assertNotNull($result->databaseName);
311312
$this->assertNotNull($result->databaseRole);
312-
$this->assertNotNull($result->databaseUser);
313+
$this->assertNotNull($result->databaseUserName);
313314
$this->assertNotNull($result->databasePassword);
314-
$this->assertIsInt($result->databasePort);
315315
$this->assertIsObject($result->links);
316316
}
317317

@@ -326,15 +326,14 @@ public function testBackupsResponseTransformations(): void
326326
'a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3'
327327
);
328328

329-
$this->assertInstanceOf(BackupsResponse::class, $result);
329+
$this->assertInstanceOf(SiteInstanceDatabaseBackupsResponse::class, $result);
330330

331331
// Enhanced array iteration to catch array transformation mutations
332332
$itemCount = 0;
333333
foreach ($result as $index => $backupResponse) {
334-
$this->assertInstanceOf(BackupResponse::class, $backupResponse);
334+
$this->assertInstanceOf(SiteInstanceDatabaseBackupResponse::class, $backupResponse);
335335
$this->assertNotNull($backupResponse); // Catches NewObject mutations
336-
$this->assertIsInt($backupResponse->id);
337-
$this->assertIsString($backupResponse->type);
336+
$this->assertStringContainsString("e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3", $backupResponse->id);
338337
$itemCount++;
339338
}
340339

@@ -345,7 +344,7 @@ public function testBackupsResponseTransformations(): void
345344
if (count($result) > 0) {
346345
$this->assertArrayHasKey(0, $result);
347346
$firstBackup = $result[0];
348-
$this->assertInstanceOf(BackupResponse::class, $firstBackup);
347+
$this->assertInstanceOf(SiteInstanceDatabaseBackupResponse::class, $firstBackup);
349348
$this->assertNotNull($firstBackup->id);
350349
}
351350
}
Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
11
{
2-
"id": 1,
3-
"database": {
4-
"id": 1,
5-
"name": "example_db"
6-
},
7-
"type": "daily",
8-
"started_at": "2023-01-15T10:00:00.000Z",
9-
"completed_at": "2023-01-15T10:30:00.000Z",
10-
"flags": {
11-
"deleted": false
12-
},
13-
"environment": {
14-
"id": "a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
15-
"name": "dev"
16-
},
17-
"_links": {
18-
"self": {
19-
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups/1"
2+
"id": "e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
3+
"database_id": "b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
4+
"created_at": "2025-04-01T13:01:06.603Z",
5+
"_links": {
6+
"self": {
7+
"href": "https://environment-service-php.acquia.com/api/environments/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/backups/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3"
8+
}
209
}
21-
}
2210
}
Lines changed: 24 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
{
2+
"count": 1,
3+
"total": 1,
4+
"pagination": {
5+
"total": 1,
6+
"limit": 25,
7+
"offset": 1
8+
},
9+
"_embedded": {
10+
"items": [
11+
{
12+
"id": "e0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
13+
"database_id": "b0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
14+
"created_at": "2025-04-01T13:01:06.603Z",
15+
"_links": {
16+
"self": {
17+
"href": "https://environment-service-php.acquia.com/api/environments/3e8ecbec-ea7c-4260-8414-ef2938c859bc.d3f7270e-c45f-4801-9308-5e8afe84a323/database/backups/a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3"
18+
}
19+
}
20+
}
21+
]
22+
},
223
"_links": {
324
"self": {
425
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1"
@@ -18,61 +39,9 @@
1839
"sort": {
1940
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1{&sort}",
2041
"templated": true
42+
},
43+
"prev": {
44+
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups?limit=25&offset=1"
2145
}
22-
},
23-
"count": 2,
24-
"total": 2,
25-
"pagination": {
26-
"total": 2,
27-
"limit": 25,
28-
"offset": 1
29-
},
30-
"_embedded": {
31-
"items": [
32-
{
33-
"id": 1,
34-
"database": {
35-
"id": 1,
36-
"name": "example_db"
37-
},
38-
"type": "daily",
39-
"started_at": "2023-01-15T10:00:00.000Z",
40-
"completed_at": "2023-01-15T10:30:00.000Z",
41-
"flags": {
42-
"deleted": false
43-
},
44-
"environment": {
45-
"id": "a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
46-
"name": "dev"
47-
},
48-
"_links": {
49-
"self": {
50-
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups/1"
51-
}
52-
}
53-
},
54-
{
55-
"id": 2,
56-
"database": {
57-
"id": 1,
58-
"name": "example_db"
59-
},
60-
"type": "manual",
61-
"started_at": "2023-01-16T10:00:00.000Z",
62-
"completed_at": "2023-01-16T10:30:00.000Z",
63-
"flags": {
64-
"deleted": false
65-
},
66-
"environment": {
67-
"id": "a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3",
68-
"name": "dev"
69-
},
70-
"_links": {
71-
"self": {
72-
"href": "https://environment-service-php.acquia.com/api/site-instances/3e8ecbec-ea7c-4260-8414-ef2938c859bc.a0c9dff7-56b6-4c0d-bad0-0e6593f66cd3/database/backups/2"
73-
}
74-
}
75-
}
76-
]
7746
}
7847
}

tests/Fixtures/Endpoints/SiteInstances/getSiteInstanceDatabase.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
"database_host": "localhost",
88
"database_name": "example_db",
99
"database_role": "primary",
10-
"database_user": "example_user",
11-
"database_password": "example_password",
12-
"database_port": 3306
10+
"database_user_name": "example_user",
11+
"database_password": "example_password"
1312
}

0 commit comments

Comments
 (0)