Skip to content

Commit

Permalink
tests: Add integration tests for form extract/filling
Browse files Browse the repository at this point in the history
Signed-off-by: Julius Knorr <[email protected]>
  • Loading branch information
juliushaertl committed Sep 16, 2024
1 parent 1440f17 commit 900270d
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 5 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
php-versions: ['8.1']
databases: ['sqlite']
server-versions: ['stable30']
scenarios: ['wopi', 'direct', 'federation']
scenarios: ['wopi', 'direct', 'federation', 'api']

name: integration-${{ matrix.code-image }}-${{ matrix.scenarios }}-${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

Expand Down Expand Up @@ -127,7 +127,7 @@ jobs:
php-versions: ['8.1']
databases: ['mysql']
server-versions: ['stable30']
scenarios: ['wopi', 'direct', 'federation']
scenarios: ['wopi', 'direct', 'federation', 'api']

name: integration-${{ matrix.scenarios }}-${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

Expand Down Expand Up @@ -206,7 +206,7 @@ jobs:
php-versions: ['8.1']
databases: ['pgsql']
server-versions: ['stable30']
scenarios: ['wopi', 'direct', 'federation']
scenarios: ['wopi', 'direct', 'federation', 'api']

name: integration-${{ matrix.scenarios }}-${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

Expand Down Expand Up @@ -287,7 +287,7 @@ jobs:
php-versions: ['8.1']
databases: ['oci']
server-versions: ['stable30']
scenarios: ['wopi', 'direct', 'federation']
scenarios: ['wopi', 'direct', 'federation', 'api']

name: integration-${{ matrix.scenarios }}-${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

Expand Down
2 changes: 1 addition & 1 deletion REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ SPDX-FileCopyrightText = "2016 Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"

[[annotations]]
path = ["js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "emptyTemplates/**", "cypress/fixtures/**", "tests/features/**.feature", "tests/psalm-baseline.xml"]
path = ["js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "emptyTemplates/**", "cypress/fixtures/**", "tests/data/**", "tests/features/**.feature", "tests/psalm-baseline.xml"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2016 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
Expand Down
1 change: 1 addition & 0 deletions tests/config/behat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ default:
- WopiContext
- DirectContext
- FederationContext
- ApiContext


extensions:
Expand Down
Binary file added tests/data/form.odt
Binary file not shown.
43 changes: 43 additions & 0 deletions tests/features/api.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
Feature: API

Background:
Given user "user1" exists

Scenario: Extract field values
Given as user "user1"
And User "user1" uploads file "./data/form.odt" to "/form.odt"
Then User "user1" requests the form field data of "/form.odt"
And the response contains the field "Name of the Organizer/Organization"
And the response contains the field "Road closures - Length of road closures (in meters)"

Scenario: Extract field values and fill in field
Given as user "user1"
And User "user1" uploads file "./data/form.odt" to "/form.odt"
Then User "user1" requests the form field data of "/form.odt"
And the response contains the field "Name of the Organizer/Organization"
And the response contains the field "Road closures - Length of road closures (in meters)"
Then User "user1" fills in fields of "/form.odt" with values as "odt" to "/filled.odt"
| ContentControls.ByIndex.19 | 100 |
Then User "user1" requests the form field data of "/filled.odt"
And the response contains the field "Road closures - Length of road closures (in meters)" with "100"
And the resulting file is a "application/vnd.oasis.opendocument.text"

Scenario: Extract field values and fill in field as pdf
Given as user "user1"
And User "user1" uploads file "./data/form.odt" to "/form.odt"
Then User "user1" requests the form field data of "/form.odt"
And the response contains the field "Name of the Organizer/Organization"
And the response contains the field "Road closures - Length of road closures (in meters)"
Then User "user1" fills in fields of "/form.odt" with values as "pdf" to "/filled.pdf"
| ContentControls.ByIndex.19 | 100 |
And the resulting file is a "application/pdf"

Scenario: Extract field values and fill in field as pdf
Given as user "user1"
And User "user1" uploads file "./data/form.odt" to "/form.odt"
Then User "user1" requests the form field data of "/form.odt"
And the response contains the field "Name of the Organizer/Organization"
And the response contains the field "Road closures - Length of road closures (in meters)"
Then User "user1" fills in fields of "/form.odt" with values as "pdf"
| ContentControls.ByIndex.19 | 100 |
And the resulting file is a "application/pdf"
142 changes: 142 additions & 0 deletions tests/features/bootstrap/ApiContext.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
<?php

declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
use Behat\Behat\Context\Context;
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Gherkin\Node\TableNode;
use JuliusHaertl\NextcloudBehat\Context\FilesContext;
use JuliusHaertl\NextcloudBehat\Context\ServerContext;
use PHPUnit\Framework\Assert;

class ApiContext implements Context {
private ServerContext $serverContext;
private FilesContext $filesContext;

private array $extractResult;

/** @BeforeScenario */
public function gatherContexts(BeforeScenarioScope $scope) {
$environment = $scope->getEnvironment();
$this->serverContext = $environment->getContext(ServerContext::class);
$this->filesContext = $environment->getContext(FilesContext::class);
}

/**
* @Then /^User "([^"]*)" requests the form field data of "([^"]*)"$/
*/
public function userRequestsTheFormFieldData($user, $filePath) {
$davClient = $this->filesContext->getSabreClient($user);
$davPath = $this->filesContext->makeSabrePath($user, $filePath);
$result = $davClient->propFind($davPath, ['{http://owncloud.org/ns}fileid']);
$fileId = $result['{http://owncloud.org/ns}fileid'];
$this->serverContext->sendOCSRequest('GET', 'apps/richdocuments/api/v1/template/fields/extract/' . $fileId);

$body = (string)$this->serverContext->getResponse()->getBody();
;
$this->extractResult = json_decode($body, true);

$this->serverContext->assertHttpStatusCode(200);
}

/**
* @Given /^the response contains the field "([^"]*)"$/
*/
public function theResponseContainsTheField($arg1) {
$found = false;
foreach ($this->extractResult['ocs']['data'] as $index => $field) {
if ($field['alias'] === $arg1) {
$found = true;
}
}
Assert::assertTrue($found, 'Field was not found');
}

/**
* @Then /^User "([^"]*)" fills in fields of "([^"]*)" with values as "([^"]*)" to "([^"]*)"$/
*/
public function userFillsInFieldsOfWithValuesAsTo($user, $source, ?string $convert = null, ?string $target = null, ?TableNode $table = null) {
$davClient = $this->filesContext->getSabreClient($user);
$davPath = $this->filesContext->makeSabrePath($user, $source);
$result = $davClient->propFind($davPath, ['{http://owncloud.org/ns}fileid']);
$fileId = $result['{http://owncloud.org/ns}fileid'];

$formData = [];
foreach ($table->getRows() as $row) {
$formData[$row[0]] = [
'content' => $row[1],
];
}

$this->serverContext->sendOCSRequest('POST', 'apps/richdocuments/api/v1/template/fields/fill/' . $fileId . '?'
. ($convert ? '&convert=' . $convert : '')
. ($target ? '&destination=' . $target : ''), ['fields' => $formData]);

$this->serverContext->assertHttpStatusCode(200);

if ($target === null) {
file_put_contents('data/output.pdf', $this->serverContext->getResponse()->getBody());
} else {
$this->serverContext->sendRawRequest('GET', '/remote.php/dav/files/' . $user . '/' . $target);
file_put_contents('data/output.pdf', $this->serverContext->getResponse()->getBody());
}
}

/**
* @Given /^the response contains the field "([^"]*)" with "([^"]*)"$/
*/
public function theResponseContainsTheFieldWith($arg1, $arg2) {
$found = false;
foreach ($this->extractResult['ocs']['data'] as $index => $field) {
if ($field['alias'] === $arg1) {
Assert::assertEquals($arg2, $field['content']);
$found = true;
}
}
Assert::assertTrue($found, 'Field was not found');
}

/**
* @Then /^User "([^"]*)" fills in fields of "([^"]*)" with values as "([^"]*)"$/
*/
public function userFillsInFieldsOfWithValuesAs($arg1, $arg2, $arg3, TableNode $table) {
$this->userFillsInFieldsOfWithValuesAsTo($arg1, $arg2, $arg3, null, $table);
}

/**
* @Then /^User "([^"]*)" downloads the file and compares it with the baseline$/
*/
public function userDownloadsTheFile($arg1) {
$this->serverContext->setCurrentUser($arg1);
$this->serverContext->sendRawRequest('GET', '/remote.php/dav/files/' . $arg1 . '/filled.pdf');
file_put_contents('data/output.pdf', $this->serverContext->getResponse()->getBody());

Assert::assertEquals(
sha1_file('data/filled.pdf'),
sha1_file('data/output.pdf'),
);
}

/**
* @Given /^the resulting file is a "([^"]*)"$/
*/
public function theResultingFileIsA($mimetype) {
$filetype = mime_content_type('data/output.pdf');
Assert::assertEquals($mimetype, $filetype);
}

/**
* @Then /^compares the returned file with the baseline$/
*/
public function comparesTheReturnedFileWithTheBaseline() {
file_put_contents('data/output.pdf', $this->serverContext->getResponse()->getBody());

Assert::assertEquals(
sha1_file('data/filled.pdf'),
sha1_file('data/output.pdf'),
);
}
}

0 comments on commit 900270d

Please sign in to comment.