Skip to content

Commit

Permalink
feat(migration-attributes): tests
Browse files Browse the repository at this point in the history
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>

d

Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
  • Loading branch information
ArtificialOwl committed Jul 28, 2024
1 parent 5cf6e54 commit caffae9
Show file tree
Hide file tree
Showing 15 changed files with 449 additions and 26 deletions.
1 change: 1 addition & 0 deletions apps/testing/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
'OCA\\Testing\\Listener\\RegisterDeclarativeSettingsListener' => $baseDir . '/../lib/Listener/RegisterDeclarativeSettingsListener.php',
'OCA\\Testing\\Listener\\SetDeclarativeSettingsValueListener' => $baseDir . '/../lib/Listener/SetDeclarativeSettingsValueListener.php',
'OCA\\Testing\\Locking\\FakeDBLockingProvider' => $baseDir . '/../lib/Locking/FakeDBLockingProvider.php',
'OCA\\Testing\\Migration\\Version30000Date20240102030405' => $baseDir . '/../lib/Migration/Version30000Date20240102030405.php',
'OCA\\Testing\\Provider\\FakeText2ImageProvider' => $baseDir . '/../lib/Provider/FakeText2ImageProvider.php',
'OCA\\Testing\\Provider\\FakeTextProcessingProvider' => $baseDir . '/../lib/Provider/FakeTextProcessingProvider.php',
'OCA\\Testing\\Provider\\FakeTextProcessingProviderSync' => $baseDir . '/../lib/Provider/FakeTextProcessingProviderSync.php',
Expand Down
1 change: 1 addition & 0 deletions apps/testing/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class ComposerStaticInitTesting
'OCA\\Testing\\Listener\\RegisterDeclarativeSettingsListener' => __DIR__ . '/..' . '/../lib/Listener/RegisterDeclarativeSettingsListener.php',
'OCA\\Testing\\Listener\\SetDeclarativeSettingsValueListener' => __DIR__ . '/..' . '/../lib/Listener/SetDeclarativeSettingsValueListener.php',
'OCA\\Testing\\Locking\\FakeDBLockingProvider' => __DIR__ . '/..' . '/../lib/Locking/FakeDBLockingProvider.php',
'OCA\\Testing\\Migration\\Version30000Date20240102030405' => __DIR__ . '/..' . '/../lib/Migration/Version30000Date20240102030405.php',
'OCA\\Testing\\Provider\\FakeText2ImageProvider' => __DIR__ . '/..' . '/../lib/Provider/FakeText2ImageProvider.php',
'OCA\\Testing\\Provider\\FakeTextProcessingProvider' => __DIR__ . '/..' . '/../lib/Provider/FakeTextProcessingProvider.php',
'OCA\\Testing\\Provider\\FakeTextProcessingProviderSync' => __DIR__ . '/..' . '/../lib/Provider/FakeTextProcessingProviderSync.php',
Expand Down
41 changes: 41 additions & 0 deletions apps/testing/lib/Migration/Version30000Date20240102030405.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Testing\Migration;

use Closure;
use OCP\Migration\Attributes\AddColumn;
use OCP\Migration\Attributes\AddIndex;
use OCP\Migration\Attributes\ColumnType;
use OCP\Migration\Attributes\CreateTable;
use OCP\Migration\Attributes\DropColumn;
use OCP\Migration\Attributes\DropIndex;
use OCP\Migration\Attributes\DropTable;
use OCP\Migration\Attributes\IndexType;
use OCP\Migration\Attributes\ModifyColumn;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;

#[DropTable('old_table')]
#[CreateTable('new_table', description: 'Table is used to store things, but also to get more things', notes: ['this is a notice', 'and another one, if really needed'])]
#[AddColumn('my_table')]
#[AddColumn('my_table', 'another_field')]
#[AddColumn('other_table', 'last_one', ColumnType::DATE)]
#[AddIndex('my_table')]
#[AddIndex('my_table', IndexType::PRIMARY)]
#[DropColumn('other_table')]
#[DropColumn('other_table', 'old_column', description: 'field is not used anymore and replaced by \'last_one\'')]
#[DropIndex('other_table')]
#[ModifyColumn('other_table')]
#[ModifyColumn('other_table', 'this_field')]
#[ModifyColumn('other_table', 'this_field', ColumnType::BIGINT)]
class Version30000Date20240102030405 extends SimpleMigrationStep {
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
return null;
}
}
4 changes: 2 additions & 2 deletions lib/private/Migration/MetadataManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public function __construct(
*
* @param string $appId
*
* @return array
* @return array<string, MigrationAttribute[]>

Check failure

Code scanning / Psalm

MoreSpecificReturnType Error

The declared return type 'array<string, array<array-key, OCP\Migration\Attributes\MigrationAttribute>>' for OC\Migration\MetadataManager::extractMigrationAttributes is more specific than the inferred return type 'array<string, list>'

Check failure on line 39 in lib/private/Migration/MetadataManager.php

View workflow job for this annotation

GitHub Actions / static-code-analysis

MoreSpecificReturnType

lib/private/Migration/MetadataManager.php:39:13: MoreSpecificReturnType: The declared return type 'array<string, array<array-key, OCP\Migration\Attributes\MigrationAttribute>>' for OC\Migration\MetadataManager::extractMigrationAttributes is more specific than the inferred return type 'array<string, list<object>>' (see https://psalm.dev/070)
* @since 30.0.0
*/
public function extractMigrationAttributes(string $appId): array {
Expand Down Expand Up @@ -144,7 +144,7 @@ private function createAttribute(array $item): MigrationAttribute {
}

try {
$attribute = new $class();
$attribute = new $class($item['table'] ?? '');
return $attribute->import($item);
} catch (\Error) {
throw new AttributeException('cannot import Attribute');
Expand Down
3 changes: 1 addition & 2 deletions lib/private/Updater/ReleaseMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ public function downloadMetadata(string $url): array {
try {
$response = $client->get($url, [
'timeout' => 10,
'connect_timeout' => 10,
'verify' => false,
'connect_timeout' => 10
]);
} catch (Exception $e) {
throw new ReleaseMetadataException('could not reach metadata at ' . $url, previous: $e);
Expand Down
5 changes: 2 additions & 3 deletions lib/public/Migration/Attributes/AddColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ class AddColumn extends ColumnMigrationAttribute {
*/
public function definition(): string {
$type = is_null($this->getType()) ? '' : ' (' . $this->getType()->value . ')';
$table = empty($this->getTable()) ? '' : ' to table \'' . $this->getTable() . '\'';
return empty($this->getName()) ?
'Addition of a new column' . $type . $table
: 'Addition of column \'' . $this->getName() . '\'' . $type . $table;
'Addition of a new column' . $type . ' to table \'' . $this->getTable() . '\''
: 'Addition of column \'' . $this->getName() . '\'' . $type . ' to table \'' . $this->getTable() . '\'';
}
}
3 changes: 1 addition & 2 deletions lib/public/Migration/Attributes/AddIndex.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class AddIndex extends IndexMigrationAttribute {
*/
public function definition(): string {
$type = is_null($this->getType()) ? '' : ' (' . $this->getType()->value . ')';
$table = empty($this->getTable()) ? '' : ' to table \'' . $this->getTable() . '\'';
return 'Addition of a new index' . $type . $table;
return 'Addition of a new index' . $type . ' to table \'' . $this->getTable() . '\'';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
class ColumnMigrationAttribute extends MigrationAttribute implements JsonSerializable {
public function __construct(

Check failure on line 17 in lib/public/Migration/Attributes/ColumnMigrationAttribute.php

View workflow job for this annotation

GitHub Actions / static-code-analysis-ocp

InvalidDocblock

lib/public/Migration/Attributes/ColumnMigrationAttribute.php:17:2: InvalidDocblock: PHPDoc is required for methods in OCP. (see https://psalm.dev/008)
string $table = '',
string $table,
private string $name = '',
private ?ColumnType $type = null,
string $description = '',
Expand Down
5 changes: 2 additions & 3 deletions lib/public/Migration/Attributes/DropColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ class DropColumn extends ColumnMigrationAttribute {
* @since 30.0.0
*/
public function definition(): string {
$table = empty($this->getTable()) ? '' : ' from table \'' . $this->getTable() . '\'';
return empty($this->getName()) ?
'Deletion of a column' . $table
: 'Deletion of column \'' . $this->getName() . '\'' . $table;
'Deletion of a column from table \'' . $this->getTable() . '\''
: 'Deletion of column \'' . $this->getName() . '\' from table \'' . $this->getTable() . '\'';
}
}
4 changes: 1 addition & 3 deletions lib/public/Migration/Attributes/DropIndex.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ class DropIndex extends IndexMigrationAttribute {
* @since 30.0.0
*/
public function definition(): string {
return empty($this->getTable()) ?
'Deletion of an index'
: 'Deletion of an index from table \'' . $this->getTable() . '\'';
return 'Deletion of an index from table \'' . $this->getTable() . '\'';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
class IndexMigrationAttribute extends MigrationAttribute implements JsonSerializable {
public function __construct(

Check failure on line 17 in lib/public/Migration/Attributes/IndexMigrationAttribute.php

View workflow job for this annotation

GitHub Actions / static-code-analysis-ocp

InvalidDocblock

lib/public/Migration/Attributes/IndexMigrationAttribute.php:17:2: InvalidDocblock: PHPDoc is required for methods in OCP. (see https://psalm.dev/008)
string $table = '',
string $table,
private ?IndexType $type = null,
string $description = '',
array $notes = [],
Expand Down
5 changes: 2 additions & 3 deletions lib/public/Migration/Attributes/MigrationAttribute.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
class MigrationAttribute implements JsonSerializable {
public function __construct(

Check failure on line 17 in lib/public/Migration/Attributes/MigrationAttribute.php

View workflow job for this annotation

GitHub Actions / static-code-analysis-ocp

InvalidDocblock

lib/public/Migration/Attributes/MigrationAttribute.php:17:2: InvalidDocblock: PHPDoc is required for methods in OCP. (see https://psalm.dev/008)
private string $table = '',
private string $table,
private string $description = '',
private array $notes = [],
) {
Expand Down Expand Up @@ -93,8 +93,7 @@ public function definition(): string {
* @since 30.0.0
*/
public function import(array $data): self {
return $this->setTable($data['table'] ?? '')
->setDescription($data['description'] ?? '')
return $this->setDescription($data['description'] ?? '')
->setNotes($data['notes'] ?? []);
}

Expand Down
5 changes: 2 additions & 3 deletions lib/public/Migration/Attributes/ModifyColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ class ModifyColumn extends ColumnMigrationAttribute {
*/
public function definition(): string {
$type = is_null($this->getType()) ? '' : ' to ' . $this->getType()->value;
$table = empty($this->getTable()) ? '' : ' from table \'' . $this->getTable() . '\'';
return empty($this->getName()) ?
'Modification of a column' . $table . $type
: 'Modification of column \'' . $this->getName() . '\'' . $table . $type;
'Modification of a column from table \'' . $this->getTable() . '\'' . $type
: 'Modification of column \'' . $this->getName() . '\' from table \'' . $this->getTable() . '\'' . $type;
}
}
185 changes: 182 additions & 3 deletions tests/lib/DB/MigrationsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,45 @@
use OC\DB\Connection;
use OC\DB\MigrationService;
use OC\DB\SchemaWrapper;
use OC\Migration\MetadataManager;
use OCP\App\IAppManager;
use OCP\IDBConnection;
use OCP\Migration\Attributes\AddColumn;
use OCP\Migration\Attributes\AddIndex;
use OCP\Migration\Attributes\ColumnType;
use OCP\Migration\Attributes\CreateTable;
use OCP\Migration\Attributes\DropColumn;
use OCP\Migration\Attributes\DropIndex;
use OCP\Migration\Attributes\DropTable;
use OCP\Migration\Attributes\IndexType;
use OCP\Migration\Attributes\ModifyColumn;
use OCP\Migration\IMigrationStep;
use OCP\Server;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;

/**
* Class MigrationsTest
*
* @package Test\DB
*/
class MigrationsTest extends \Test\TestCase {
/** @var MigrationService | \PHPUnit\Framework\MockObject\MockObject */
/** @var MigrationService | MockObject */
private $migrationService;
/** @var \PHPUnit\Framework\MockObject\MockObject | IDBConnection $db */
private $db;
/** @var MockObject | IDBConnection $db */
private LoggerInterface $logger;
private IAppManager $appManager;


protected function setUp(): void {
parent::setUp();

$this->db = $this->createMock(Connection::class);
$this->db->expects($this->any())->method('getPrefix')->willReturn('test_oc_');
$this->migrationService = new MigrationService('testing', $this->db);

$this->appManager = Server::get(IAppManager::class);
$this->logger = Server::get(LoggerInterface::class);
}

public function testGetters() {
Expand Down Expand Up @@ -755,4 +774,164 @@ public function testEnsureOracleConstraintsStringLength4000() {

self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]);
}


public function testExtractMigrationAttributes() {
$metadataManager = Server::get(MetadataManager::class);
$this->appManager->loadApp('testing');

$this->assertEquals($this->getMigrationMetadata(),
json_decode(json_encode($metadataManager->extractMigrationAttributes('testing')), true)
);

$this->appManager->disableApp('testing');
}

public function testDeserializeMigrationMetadata() {
$metadataManager = Server::get(MetadataManager::class);
$this->assertEquals(
[
'core' => [],
'apps' => [
'testing' => [
'30000Date20240102030405' => [
new DropTable('old_table'),
new CreateTable( 'new_table',
description: 'Table is used to store things, but also to get more things',
notes: ['this is a notice', 'and another one, if really needed']
),
new AddColumn('my_table'),
new AddColumn('my_table', 'another_field'),
new AddColumn('other_table', 'last_one', ColumnType::DATE),
new AddIndex('my_table'),
new AddIndex('my_table', IndexType::PRIMARY),
new DropColumn('other_table'),
new DropColumn( 'other_table', 'old_column',
description: 'field is not used anymore and replaced by \'last_one\''
),
new DropIndex('other_table'),
new ModifyColumn('other_table'),
new ModifyColumn('other_table', 'this_field'),
new ModifyColumn('other_table', 'this_field', ColumnType::BIGINT)
]
]
]
],
$metadataManager->getMigrationsAttributesFromReleaseMetadata(
[
'core' => [],
'apps' => ['testing' => $this->getMigrationMetadata()]
]
));
}

private function getMigrationMetadata(): array {
return [
'30000Date20240102030405' => [
[
'class' => 'OCP\\Migration\\Attributes\\DropTable',
'table' => 'old_table',
'description' => '',
'notes' => [],
'columns' => []
],
[
'class' => 'OCP\\Migration\\Attributes\\CreateTable',
'table' => 'new_table',
'description' => 'Table is used to store things, but also to get more things',
'notes' =>
[
'this is a notice',
'and another one, if really needed'
],
'columns' => []
],
[
'class' => 'OCP\\Migration\\Attributes\\AddColumn',
'table' => 'my_table',
'description' => '',
'notes' => [],
'name' => '',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\AddColumn',
'table' => 'my_table',
'description' => '',
'notes' => [],
'name' => 'another_field',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\AddColumn',
'table' => 'other_table',
'description' => '',
'notes' => [],
'name' => 'last_one',
'type' => 'date'
],
[
'class' => 'OCP\\Migration\\Attributes\\AddIndex',
'table' => 'my_table',
'description' => '',
'notes' => [],
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\AddIndex',
'table' => 'my_table',
'description' => '',
'notes' => [],
'type' => 'primary'
],
[
'class' => 'OCP\\Migration\\Attributes\\DropColumn',
'table' => 'other_table',
'description' => '',
'notes' => [],
'name' => '',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\DropColumn',
'table' => 'other_table',
'description' => 'field is not used anymore and replaced by \'last_one\'',
'notes' => [],
'name' => 'old_column',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\DropIndex',
'table' => 'other_table',
'description' => '',
'notes' => [],
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\ModifyColumn',
'table' => 'other_table',
'description' => '',
'notes' => [],
'name' => '',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\ModifyColumn',
'table' => 'other_table',
'description' => '',
'notes' => [],
'name' => 'this_field',
'type' => ''
],
[
'class' => 'OCP\\Migration\\Attributes\\ModifyColumn',
'table' => 'other_table',
'description' => '',
'notes' => [],
'name' => 'this_field',
'type' => 'bigint'
],
]
];
}
}
Loading

0 comments on commit caffae9

Please sign in to comment.