Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
d9543b9
Add rough import / export logic and debug input fields
artemiomorales Jan 12, 2023
53f2ea7
Move export logic to PHP
artemiomorales Jan 17, 2023
c4bdd8f
Migrate import logic to PHP
artemiomorales Jan 20, 2023
4e7813e
Add support for exporting/importing database; remove export of 'wp-in…
artemiomorales Jan 23, 2023
502271d
Remove extra spaces around PHP declarations and extraneous closing tags
artemiomorales Jan 23, 2023
3064736
Move DOCROOT const to config file
artemiomorales Jan 23, 2023
1dcdd0e
Add error handling to custom PHP run() code; rename variables
artemiomorales Jan 23, 2023
03a0a96
Install WordPress Importer by default in WP bundle
artemiomorales Jan 31, 2023
00457a5
Rebuild WordPress versions
artemiomorales Jan 31, 2023
cd720c1
Fix full site editing
artemiomorales Feb 8, 2023
9c997bb
Add UI for migration logic
artemiomorales Feb 10, 2023
fe837c0
Reset build/ folder to HEAD
artemiomorales Feb 11, 2023
e48b217
Rebuild WP bundles to include WordPress Importer
artemiomorales Feb 11, 2023
b505cf5
Add descriptive text for modal
artemiomorales Feb 11, 2023
e9c1400
Add WordPress version to export filename
artemiomorales Feb 11, 2023
6e62b40
Fix bug when using PHP 7.0-7.3
artemiomorales Feb 14, 2023
f92cb88
Move generateZipFile() code to separate PHP file; begin adding tests
artemiomorales Feb 24, 2023
6f9a3b6
Begin moving import code to separate file; add tests
artemiomorales Feb 24, 2023
5333bbd
Move import overwrite logic to separate file; add tests; fix a bug
artemiomorales Feb 24, 2023
0badcd2
Add known limitations regarding media, options/users, and plugins to …
artemiomorales Feb 24, 2023
429f07b
Replace rmSync calls with rmdirSync to remove Typscript warnings
artemiomorales Feb 24, 2023
a969224
Fix code formatting and spacing issues
artemiomorales Feb 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Move generateZipFile() code to separate PHP file; begin adding tests
In order to test the behavior of the migration feature's PHP code,
I moved that code to separate files so that it can be run by Jest.
This required modifying the generateZipFile() function a bit to accept
parameters.
  • Loading branch information
artemiomorales committed Feb 24, 2023
commit f92cb880570e626b8626078fcfee28735daac570
4 changes: 3 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ module.exports = {
// globalTeardown: undefined,

// A set of global variables that need to be available in all test environments
// globals: {},
globals: {
PHP_JS_HASH: '',
},

// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
// maxWorkers: "50%",
Expand Down
151 changes: 151 additions & 0 deletions src/wordpress-playground/__tests__/migration-tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
import * as phpLoaderModule from '../../../build/php-7.4.node.js';
import { startPHP } from '../../php-wasm/php-node';
import { existsSync, rmSync, readFileSync } from 'fs';

const { TextDecoder } = require('util');

// Mock files
const testDirPath = __dirname + '/__test39024';
const fileSystemPath = testDirPath + '/filesystem';
const wpImporterOutputPath = fileSystemPath + '/databaseExport.xml';
const wpPath = fileSystemPath + '/wordpress';
const wpAdminPath = wpPath + '/wp-admin';
const wpContentPath = wpPath + '/wp-content';
const wpIncludesPath = wpPath + '/wp-includes';
const wpSqlDbPath = wpContentPath + '/database';
const exportName = `wordpress-playground-export.zip`;
const exportPath = `${testDirPath}/${exportName}`;

// Code to test
const migrationFilePath = __dirname + '/../migration.php';

describe('generateZipFile()', () => {
let php;
let migration;

beforeEach(async () => {
php = await startPHP(phpLoaderModule, 'NODE');
if (existsSync(testDirPath)) {
rmSync(testDirPath, { recursive: true });
}
migration = readFileSync(migrationFilePath);
php.mkdirTree(testDirPath);
php.mkdirTree(fileSystemPath);
php.mkdirTree(wpPath);

php.writeFile(
wpImporterOutputPath,
'Mock WordPress Importer migration file'
);

// WP Root
php.writeFile(`${wpPath}/test-wp-root.php`, 'Mock WP root file');

// WP Admin
php.mkdirTree(wpAdminPath);
php.writeFile(`${wpAdminPath}/test-admin.php`, 'Mock WP admin file');

// WP Content
php.mkdirTree(wpContentPath);
php.writeFile(
`${wpContentPath}/test-content.php`,
'Mock WP content file'
);
php.mkdirTree(wpSqlDbPath);
php.writeFile(`${wpSqlDbPath}/test-database.php`, 'Mock SQL content');

// WP Includes
php.mkdirTree(wpIncludesPath);
php.writeFile(
`${wpIncludesPath}/test-includes.php`,
'Mock WP includes'
);

const exportWriteRequest = php.run({
code:
migration +
` generateZipFile("${exportPath}", "${wpImporterOutputPath}", "${wpPath}");`,
});

if (exportWriteRequest.exitCode !== 0) {
throw exportWriteRequest.errors;
}
});

afterAll(() => {
if (existsSync(testDirPath)) {
rmSync(testDirPath, { recursive: true });
}
});

it('should creata a ZIP file of specified WP Importer output file and WordPress files', () => {
const runTest = php.run({
code: `
<?php
$zip = new ZipArchive;
$res = $zip->open('${exportPath}');
if ($res === TRUE) {
if(
$zip->getFromName('${wpImporterOutputPath}') &&
$zip->getFromName('${wpPath}/test-wp-root.php') &&
$zip->getFromName('${wpContentPath}/test-content.php')
) {
echo 'success';
} else {
echo 'failure';
}
}
`,
});

const runTestOutput = new TextDecoder().decode(runTest.body).trim();

expect(runTestOutput).toEqual('success');
});

it('should omit wp-content/database directory', () => {
const runTest = php.run({
code: `
<?php
$zip = new ZipArchive;
$res = $zip->open('${exportPath}');
if ($res === TRUE) {
if(
!$zip->getFromName('${wpSqlDbPath}/test-database.php')
) {
echo 'success';
} else {
echo 'failure';
}
}
`,
});

const runTestOutput = new TextDecoder().decode(runTest.body).trim();

expect(runTestOutput).toEqual('success');
});

it('should omit wp-includes directory', () => {
const runTest = php.run({
code: `
<?php
$zip = new ZipArchive;
$res = $zip->open('${exportPath}');
if ($res === TRUE) {
if(
!$zip->getFromName('${wpIncludesPath}/test-includes.php')
) {
echo 'success';
} else {
echo 'failure';
}
}
`,
});

const runTestOutput = new TextDecoder().decode(runTest.body).trim();

expect(runTestOutput).toEqual('success');
});
});
48 changes: 6 additions & 42 deletions src/wordpress-playground/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { ProgressObserver, ProgressType } from './progress-observer';
import { PromiseQueue } from './promise-queue';
import { saveAs } from 'file-saver';
import { DOCROOT } from './config';
import migration from './migration.php';

const query = new URL(document.location.href).searchParams as any;

Expand Down Expand Up @@ -346,51 +347,14 @@ async function generateZip() {
const databaseExportContent = new TextDecoder().decode(
databaseExportResponse.body
);
await workerThread.writeFile('/databaseExport.xml', databaseExportContent);
const databasePath = '/databaseExport.xml';
await workerThread.writeFile(databasePath, databaseExportContent);
const exportName = `wordpress-playground--wp${wpVersion}--php${phpVersion}.zip`;
const exportPath = `/${exportName}`;
const exportWriteRequest = await workerThread.run({
code: `<?php
$zip = new ZipArchive;
$res = $zip->open('${exportPath}', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFile('/databaseExport.xml');
$directories = array();
$directories[] = '${DOCROOT}/';

while(sizeof($directories)) {
$dir = array_pop($directories);

if ($handle = opendir($dir)) {

while (false !== ($entry = readdir($handle))) {

if ($entry == '.' ||
$entry == '..') {
continue;
}

$entry = $dir . $entry;

if (is_dir($entry) &&
strpos($entry, 'wp-content/database') == false &&
strpos($entry, 'wp-includes') == false) {

$directory_path = $entry . '/';
array_push($directories, $directory_path);

} elseif (is_file($entry)) {

$zip->addFile($entry);
}
}
closedir($handle);
}
}
$zip->close();
chmod('${exportPath}', 0777);
}
`,
code:
migration +
` generateZipFile("${exportPath}", "${databasePath}", "${DOCROOT}");`,
});
if (exportWriteRequest.exitCode !== 0) {
throw exportWriteRequest.errors;
Expand Down
43 changes: 43 additions & 0 deletions src/wordpress-playground/migration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

function generateZipFile($exportPath, $databasePath, $docRoot) {
$zip = new ZipArchive;
$res = $zip->open($exportPath, ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFile($databasePath);
$directories = array();
$directories[] = $docRoot . '/';

while(sizeof($directories)) {
$dir = array_pop($directories);

if ($handle = opendir($dir)) {

while (false !== ($entry = readdir($handle))) {

if ($entry == '.' ||
$entry == '..') {
continue;
}

$entry = $dir . $entry;

if (is_dir($entry) &&
strpos($entry, 'wp-content/database') == false &&
strpos($entry, 'wp-includes') == false) {

$directory_path = $entry . '/';
array_push($directories, $directory_path);

} elseif (is_file($entry)) {

$zip->addFile($entry);
}
}
closedir($handle);
}
}
$zip->close();
chmod($exportPath, 0777);
}
}