Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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
Add integration tests for autocomplete/get (similar to sharees API)
Signed-off-by: Joas Schilling <[email protected]>
  • Loading branch information
nickvergessen committed Mar 10, 2021
commit a310a2adc7d82fc12ef13d654753e8a599e6d8a7
175 changes: 175 additions & 0 deletions build/integration/collaboration_features/autocomplete.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
Feature: autocomplete
Background:
Given using api version "2"
And group "commongroup" exists
And user "admin" belongs to group "commongroup"
And user "autocomplete" exists
And user "autocomplete2" exists
And user "autocomplete2" belongs to group "commongroup"

Scenario: getting autocomplete
Given As an "admin"
When get autocomplete for "auto"
| id | source |
| autocomplete | users |
| autocomplete2 | users |


Scenario: getting autocomplete without enumeration
Given As an "admin"
When parameter "shareapi_allow_share_dialog_user_enumeration" of app "core" is set to "no"
Then get autocomplete for "auto"
| id | source |
Then get autocomplete for "autocomplete"
| id | source |
| autocomplete | users |


Scenario: getting autocomplete with limited enumeration by group
Given As an "admin"
When parameter "shareapi_restrict_user_enumeration_to_group" of app "core" is set to "yes"
Then get autocomplete for "auto"
| id | source |
| autocomplete2 | users |
Then get autocomplete for "autocomplete"
| id | source |
| autocomplete | users |
| autocomplete2 | users |
Then get autocomplete for "autocomplete2"
| id | source |
| autocomplete2 | users |


Scenario: getting autocomplete with limited enumeration by phone
Given As an "admin"
When parameter "shareapi_restrict_user_enumeration_to_phone" of app "core" is set to "yes"
Then get autocomplete for "auto"
| id | source |

# autocomplete stores their phone number
Given As an "autocomplete"
And sending "PUT" to "/cloud/users/autocomplete" with
| key | phone |
| value | +49 711 / 25 24 28-90 |
And the HTTP status code should be "200"
And the OCS status code should be "200"

Given As an "admin"
Then get autocomplete for "auto"
| id | source |

# admin populates they have the phone number
When search users by phone for region "DE" with
| random-string1 | 0711 / 252 428-90 |
Then get autocomplete for "auto"
| id | source |
| autocomplete | users |


Scenario: getting autocomplete with limited enumeration by group or phone
Given As an "admin"
When parameter "shareapi_restrict_user_enumeration_to_group" of app "core" is set to "yes"
And parameter "shareapi_restrict_user_enumeration_to_phone" of app "core" is set to "yes"

# autocomplete stores their phone number
Given As an "autocomplete"
And sending "PUT" to "/cloud/users/autocomplete" with
| key | phone |
| value | +49 711 / 25 24 28-90 |
And the HTTP status code should be "200"
And the OCS status code should be "200"
# admin populates they have the phone number
Given As an "admin"
When search users by phone for region "DE" with
| random-string1 | 0711 / 252 428-90 |

Then get autocomplete for "auto"
| id | source |
| autocomplete | users |
| autocomplete2 | users |


Scenario: getting autocomplete with limited enumeration but sharing is group restricted
Given As an "admin"
When parameter "shareapi_restrict_user_enumeration_to_group" of app "core" is set to "yes"
And parameter "shareapi_restrict_user_enumeration_to_phone" of app "core" is set to "yes"

# autocomplete stores their phone number
Given As an "autocomplete"
And sending "PUT" to "/cloud/users/autocomplete" with
| key | phone |
| value | +49 711 / 25 24 28-90 |
And the HTTP status code should be "200"
And the OCS status code should be "200"
# admin populates they have the phone number
Given As an "admin"
When search users by phone for region "DE" with
| random-string1 | 0711 / 252 428-90 |

Then get autocomplete for "auto"
| id | source |
| autocomplete | users |
| autocomplete2 | users |
When parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
Then get autocomplete for "auto"
| id | source |
| autocomplete2 | users |


Scenario: getting autocomplete with limited enumeration by phone but user changes it
Given As an "admin"
When parameter "shareapi_restrict_user_enumeration_to_phone" of app "core" is set to "yes"
Then get autocomplete for "auto"
| id | source |

# autocomplete stores their phone number
Given As an "autocomplete"
And sending "PUT" to "/cloud/users/autocomplete" with
| key | phone |
| value | +49 711 / 25 24 28-90 |
And the HTTP status code should be "200"
And the OCS status code should be "200"

Given As an "admin"
Then get autocomplete for "auto"
| id | source |

# admin populates they have the phone number
When search users by phone for region "DE" with
| random-string1 | 0711 / 252 428-90 |
Then get autocomplete for "auto"
| id | source |
| autocomplete | users |

# autocomplete changes their phone number
Given As an "autocomplete"
And sending "PUT" to "/cloud/users/autocomplete" with
| key | phone |
| value | +49 711 / 25 24 28-91 |
And the HTTP status code should be "200"
And the OCS status code should be "200"

Given As an "admin"
Then get autocomplete for "auto"
| id | source |

# admin populates they have the new phone number
When search users by phone for region "DE" with
| random-string1 | 0711 / 252 428-91 |
Then get autocomplete for "auto"
| id | source |
| autocomplete | users |


Scenario: getting autocomplete without enumeration and sharing is group restricted
Given As an "admin"
When parameter "shareapi_allow_share_dialog_user_enumeration" of app "core" is set to "no"
And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"

Then get autocomplete for "auto"
| id | source |
Then get autocomplete for "autocomplete"
| id | source |
Then get autocomplete for "autocomplete2"
| id | source |
| autocomplete2 | users |
10 changes: 10 additions & 0 deletions build/integration/config/behat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,16 @@ default:
- admin
- admin
regular_user_password: 123456
collaboration:
paths:
- "%paths.base%/../collaboration_features"
contexts:
- CollaborationContext:
baseUrl: http://localhost:8080/ocs/
admin:
- admin
- admin
regular_user_password: 123456
sharees:
paths:
- "%paths.base%/../sharees_features"
Expand Down
34 changes: 34 additions & 0 deletions build/integration/features/bootstrap/BasicStructure.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,40 @@ public function sendingToWith($verb, $url, $body) {
}
}

/**
* @param string $verb
* @param string $url
* @param TableNode|array|null $body
* @param array $headers
*/
protected function sendRequestForJSON(string $verb, string $url, $body = null, array $headers = []): void {
$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
$client = new Client();
$options = [];
if ($this->currentUser === 'admin') {
$options['auth'] = ['admin', 'admin'];
} elseif (strpos($this->currentUser, 'guest') !== 0) {
$options['auth'] = [$this->currentUser, self::TEST_PASSWORD];
}
if ($body instanceof TableNode) {
$fd = $body->getRowsHash();
$options['form_params'] = $fd;
} elseif (is_array($body)) {
$options['form_params'] = $body;
}

$options['headers'] = array_merge($headers, [
'OCS-ApiRequest' => 'true',
'Accept' => 'application/json',
]);

try {
$this->response = $client->{$verb}($fullUrl, $options);
} catch (ClientException $ex) {
$this->response = $ex->getResponse();
}
}

/**
* @When /^sending "([^"]*)" with exact url to "([^"]*)"$/
* @param string $verb
Expand Down
71 changes: 71 additions & 0 deletions build/integration/features/bootstrap/CollaborationContext.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

declare(strict_types=1);
/**
* @copyright Copyright (c) 2021, Joas Schilling <[email protected]>
*
* @author Joas Schilling <[email protected]>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/

use Behat\Behat\Context\Context;
use Behat\Gherkin\Node\TableNode;
use PHPUnit\Framework\Assert;

require __DIR__ . '/../../vendor/autoload.php';

class CollaborationContext implements Context {
use Provisioning;
use AppConfiguration;

/**
* @Then /^get autocomplete for "([^"]*)"$/
* @param TableNode|null $formData
*/
public function getAutocomplete(string $search, TableNode $formData): void {
$query = $search === 'null' ? null : $search;

$this->sendRequestForJSON('GET', '/core/autocomplete/get?itemType=files&itemId=123&search=' . $query, [
'itemType' => 'files',
'itemId' => '123',
'search' => $query,
]);
$this->theHTTPStatusCodeShouldBe(200);

$data = json_decode($this->response->getBody()->getContents(), true);
$suggestions = $data['ocs']['data'];

Assert::assertCount(count($formData->getHash()), $suggestions, 'Suggestion count does not match');
Assert::assertEquals($formData->getHash(), array_map(static function ($suggestion, $expected) {
$data = [];
if (isset($expected['id'])) {
$data['id'] = $suggestion['id'];
}
if (isset($expected['source'])) {
$data['source'] = $suggestion['source'];
}
return $data;
}, $suggestions, $formData->getHash()));
}

protected function resetAppConfigs(): void {
$this->deleteServerConfig('core', 'shareapi_allow_share_dialog_user_enumeration');
$this->deleteServerConfig('core', 'shareapi_restrict_user_enumeration_to_group');
$this->deleteServerConfig('core', 'shareapi_restrict_user_enumeration_to_phone');
$this->deleteServerConfig('core', 'shareapi_only_share_with_group_members');
}
}