diff --git a/.codacy.yml b/.codacy.yml index 855b4f2..02e0cf2 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -4,5 +4,6 @@ exclude_paths: - changelog/** - docs/** - pkg/proto/** + - tests/acceptance/features/bootstrap/* ... diff --git a/.drone.star b/.drone.star index 27536aa..2eed7a2 100644 --- a/.drone.star +++ b/.drone.star @@ -1,7 +1,7 @@ def main(ctx): before = [ testing(ctx), - apiTests(ctx, 'master', '9db442250583d3b71e633cf77fbcf643ed67e994'), + apiTests(ctx, 'adjust-skip-tags-expected-failures', ''), ] stages = [ @@ -92,7 +92,25 @@ def apiTests(ctx, coreBranch = 'master', coreCommit = ''): ] }, { - 'name': 'acceptance-tests', + 'name': 'clone-test-repos', + 'image': 'owncloudci/php:7.2', + 'pull': 'always', + 'commands': [ + 'git clone -b master --depth=1 https://github.com/owncloud/testing.git /srv/app/tmp/testing', + 'git clone -b %s --single-branch --no-tags https://github.com/owncloud/core.git /srv/app/testrunner' % (coreBranch), + 'cd /srv/app/testrunner', + ] + ([ + 'git checkout %s' % (coreCommit) + ] if coreCommit != '' else []), + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + }, + { + 'name': 'local-acceptance-tests', 'image': 'owncloudci/php:7.2', 'pull': 'always', 'environment' : { @@ -102,15 +120,35 @@ def apiTests(ctx, coreBranch = 'master', coreCommit = ''): 'TEST_EXTERNAL_USER_BACKENDS':'true', 'TEST_OCIS':'true', 'OCIS_REVA_DATA_ROOT': '/srv/app/tmp/reva/', - 'SKELETON_DIR': '/srv/app/tmp/testing/data/apiSkeleton' + 'SKELETON_DIR': '/srv/app/tmp/testing/data/apiSkeleton', + 'PATH_TO_CORE': '/srv/app/testrunner' + }, + 'commands': [ + 'make test-acceptance-api' + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + }, + { + 'name': 'core-acceptance-tests', + 'image': 'owncloudci/php:7.2', + 'pull': 'always', + 'environment' : { + 'TEST_SERVER_URL': 'http://reva-server:9140', + 'BEHAT_FILTER_TAGS': '~@skipOnOcis&&~@skipOnOcis-OC-Storage', + 'REVA_LDAP_HOSTNAME':'ldap', + 'TEST_EXTERNAL_USER_BACKENDS':'true', + 'TEST_OCIS':'true', + 'OCIS_REVA_DATA_ROOT': '/srv/app/tmp/reva/', + 'SKELETON_DIR': '/srv/app/tmp/testing/data/apiSkeleton', + 'EXPECTED_FAILURES_FILE': '/drone/src/tests/acceptance/expected-failures.txt' }, 'commands': [ - 'git clone -b master --depth=1 https://github.com/owncloud/testing.git /srv/app/tmp/testing', - 'git clone -b %s --single-branch --no-tags https://github.com/owncloud/core.git /srv/app/testrunner' % (coreBranch), 'cd /srv/app/testrunner', - ] + ([ - 'git checkout %s' % (coreCommit) - ] if coreCommit != '' else []) + [ 'make test-acceptance-api' ], 'volumes': [ diff --git a/.gitignore b/.gitignore index 6067678..4899c12 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,10 @@ coverage.out /node_modules /assets + +# API acceptance tests +composer.lock +/vendor +vendor-bin/**/vendor +vendor-bin/**/composer.lock +tests/acceptance/output diff --git a/Makefile b/Makefile index 511c344..3f90d95 100644 --- a/Makefile +++ b/Makefile @@ -159,3 +159,21 @@ docs: config-docs-generate docs-copy docs-build .PHONY: watch watch: go run github.com/cespare/reflex -c reflex.conf + +BEHAT_BIN=vendor-bin/behat/vendor/bin/behat + +.PHONY: test-acceptance-api +test-acceptance-api: vendor-bin/behat/vendor + BEHAT_BIN=$(BEHAT_BIN) $(PATH_TO_CORE)/tests/acceptance/run.sh --remote --type api + +vendor/bamarni/composer-bin-plugin: composer.lock + composer install + +vendor-bin/behat/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/behat/composer.lock + composer bin behat install --no-progress + +vendor-bin/behat/composer.lock: vendor-bin/behat/composer.json + @echo behat composer.lock is not up to date. + +composer.lock: composer.json + @echo composer.lock is not up to date. diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..53c0a9c --- /dev/null +++ b/composer.json @@ -0,0 +1,18 @@ +{ + "name": "owncloud/ocis-reva", + "config" : { + "platform": { + "php": "7.2" + } + }, + "require": { + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "extra": { + "bamarni-bin": { + "bin-links": false + } + } +} diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml new file mode 100644 index 0000000..08694dc --- /dev/null +++ b/tests/acceptance/config/behat.yml @@ -0,0 +1,39 @@ +default: + autoload: + '': '%paths.base%/../features/bootstrap' + + suites: + apiSpecial1: + paths: + - '%paths.base%/../features/apiSpecial1' + context: &common_ldap_suite_context + parameters: + ldapAdminPassword: admin + ldapUsersOU: TestUsers + ldapGroupsOU: TestGroups + ldapInitialUserFilePath: /../../config/ldap-users.ldif + contexts: + - RevaContext: + - OccContext: + - FeatureContext: &common_feature_context_params + baseUrl: http://localhost:8080 + adminUsername: admin + adminPassword: admin + regularUserPassword: 123456 + ocPath: apps/testing/api/v1/occ + + apiSpecial2: + paths: + - '%paths.base%/../features/apiSpecial2' + context: *common_ldap_suite_context + contexts: + - RevaContext: + - OccContext: + - FeatureContext: *common_feature_context_params + - FavoritesContext: + - WebDavPropertiesContext: + + extensions: + jarnaiz\JUnitFormatter\JUnitFormatterExtension: + filename: report.xml + outputDir: '%paths.base%/../output/' diff --git a/tests/acceptance/expected-failures.txt b/tests/acceptance/expected-failures.txt new file mode 100644 index 0000000..a308c3f --- /dev/null +++ b/tests/acceptance/expected-failures.txt @@ -0,0 +1,219 @@ +# this file contains the scenarios from ownCloud10 core API tests that are currently expected to fail +# +# https://github.com/owncloud/ocis-reva/issues/27 wildcard Access-Control-Allow-Origin +# +apiAuth/cors.feature:24 +apiAuth/cors.feature:25 +apiAuth/cors.feature:26 +apiAuth/cors.feature:27 +apiAuth/cors.feature:28 +apiAuth/cors.feature:29 +apiAuth/cors.feature:30 +apiAuth/cors.feature:31 +apiAuth/cors.feature:32 +apiAuth/cors.feature:33 +apiAuth/cors.feature:34 +apiAuth/cors.feature:35 +apiAuth/cors.feature:36 +apiAuth/cors.feature:37 +apiAuth/cors.feature:38 +apiAuth/cors.feature:39 +apiAuth/cors.feature:59 +apiAuth/cors.feature:60 +apiAuth/cors.feature:78 +apiAuth/cors.feature:79 +apiAuth/cors.feature:80 +apiAuth/cors.feature:81 +apiAuth/cors.feature:82 +apiAuth/cors.feature:83 +apiAuth/cors.feature:102 +apiAuth/cors.feature:103 +apiAuth/cors.feature:104 +apiAuth/cors.feature:105 +apiAuth/cors.feature:106 +apiAuth/cors.feature:107 +apiAuth/cors.feature:108 +apiAuth/cors.feature:109 +apiAuth/cors.feature:110 +apiAuth/cors.feature:111 +apiAuth/cors.feature:112 +apiAuth/cors.feature:113 +apiAuth/cors.feature:114 +apiAuth/cors.feature:115 +apiAuth/cors.feature:116 +apiAuth/cors.feature:117 +apiAuth/cors.feature:118 +apiAuth/cors.feature:119 +apiAuth/cors.feature:137 +apiAuth/cors.feature:138 +apiAuth/cors.feature:139 +apiAuth/cors.feature:140 +apiAuth/cors.feature:141 +apiAuth/cors.feature:142 +apiAuth/cors.feature:167 +apiAuth/cors.feature:168 +apiAuth/cors.feature:169 +apiAuth/cors.feature:170 +apiAuth/cors.feature:171 +apiAuth/cors.feature:172 +apiAuth/cors.feature:173 +apiAuth/cors.feature:174 +apiAuth/cors.feature:175 +apiAuth/cors.feature:176 +apiAuth/cors.feature:177 +apiAuth/cors.feature:178 +apiAuth/cors.feature:179 +apiAuth/cors.feature:180 +apiAuth/cors.feature:181 +apiAuth/cors.feature:182 +apiAuth/cors.feature:209 +apiAuth/cors.feature:210 +apiAuth/cors.feature:211 +apiAuth/cors.feature:212 +apiAuth/cors.feature:213 +apiAuth/cors.feature:214 +# +# https://github.com/owncloud/ocis-reva/issues/30 HTTP 401 Unauthorized responses don't contain a body +# +apiAuthOcs/ocsDELETEAuth.feature:10 +apiAuthOcs/ocsDELETEAuth.feature:35 +apiAuthOcs/ocsGETAuth.feature:10 +apiAuthOcs/ocsGETAuth.feature:33 +apiAuthOcs/ocsGETAuth.feature:82 +apiAuthOcs/ocsGETAuth.feature:173 +apiAuthOcs/ocsGETAuth.feature:237 +apiAuthOcs/ocsGETAuth.feature:257 +apiAuthOcs/ocsGETAuth.feature:295 +apiAuthOcs/ocsPOSTAuth.feature:11 +apiAuthOcs/ocsPUTAuth.feature:12 +apiAuthOcs/ocsPUTAuth.feature:30 +# +# https://github.com/owncloud/ocis-reva/issues/60 app passwords are not possible +# https://github.com/owncloud/ocis-reva/issues/37 no way to enforce token auth +apiAuthWebDav/webDavDELETEAuth.feature:36 +apiAuthWebDav/webDavDELETEAuth.feature:78 +apiAuthWebDav/webDavDELETEAuth.feature:92 +apiAuthWebDav/webDavLOCKAuth.feature:38 +apiAuthWebDav/webDavLOCKAuth.feature:92 +apiAuthWebDav/webDavLOCKAuth.feature:106 +apiAuthWebDav/webDavMKCOLAuth.feature:37 +apiAuthWebDav/webDavMKCOLAuth.feature:82 +apiAuthWebDav/webDavMKCOLAuth.feature:96 +apiAuthWebDav/webDavMOVEAuth.feature:37 +apiAuthWebDav/webDavMOVEAuth.feature:88 +apiAuthWebDav/webDavMOVEAuth.feature:102 +apiAuthWebDav/webDavPOSTAuth.feature:38 +apiAuthWebDav/webDavPOSTAuth.feature:79 +apiAuthWebDav/webDavPOSTAuth.feature:93 +apiAuthWebDav/webDavPROPFINDAuth.feature:37 +apiAuthWebDav/webDavPROPFINDAuth.feature:88 +apiAuthWebDav/webDavPROPFINDAuth.feature:102 +apiAuthWebDav/webDavPROPPATCHAuth.feature:38 +apiAuthWebDav/webDavPROPPATCHAuth.feature:79 +apiAuthWebDav/webDavPROPPATCHAuth.feature:93 +apiAuthWebDav/webDavPUTAuth.feature:38 +apiAuthWebDav/webDavPUTAuth.feature:82 +apiAuthWebDav/webDavPUTAuth.feature:96 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +# +apiCapabilities/capabilities.feature:8 +apiCapabilities/capabilities.feature:15 +apiCapabilities/capabilities.feature:21 +apiCapabilities/capabilities.feature:27 +apiCapabilities/capabilities.feature:33 +apiCapabilities/capabilities.feature:38 +apiCapabilities/capabilities.feature:80 +apiCapabilities/capabilities.feature:93 +apiCapabilities/capabilities.feature:100 +apiCapabilities/capabilities.feature:106 +apiCapabilities/capabilities.feature:112 +apiCapabilities/capabilities.feature:119 +apiCapabilities/capabilities.feature:125 +apiCapabilities/capabilities.feature:134 +apiCapabilities/capabilities.feature:144 +apiCapabilities/capabilities.feature:155 +apiCapabilities/capabilities.feature:166 +apiCapabilities/capabilities.feature:176 +apiCapabilities/capabilities.feature:187 +apiCapabilities/capabilities.feature:199 +apiCapabilities/capabilities.feature:207 +apiCapabilities/capabilities.feature:215 +apiCapabilities/capabilities.feature:222 +apiCapabilities/capabilities.feature:245 +apiCapabilities/capabilities.feature:262 +apiCapabilities/capabilities.feature:283 +apiCapabilities/capabilities.feature:305 +apiCapabilities/capabilities.feature:327 +apiCapabilities/capabilities.feature:349 +apiCapabilities/capabilities.feature:374 +apiCapabilities/capabilities.feature:399 +apiCapabilities/capabilities.feature:424 +apiCapabilities/capabilities.feature:446 +apiCapabilities/capabilities.feature:468 +apiCapabilities/capabilities.feature:491 +apiCapabilities/capabilities.feature:516 +apiCapabilities/capabilities.feature:538 +apiCapabilities/capabilities.feature:560 +apiCapabilities/capabilities.feature:583 +apiCapabilities/capabilities.feature:607 +apiCapabilities/capabilities.feature:628 +apiCapabilities/capabilities.feature:650 +apiCapabilities/capabilities.feature:673 +apiCapabilities/capabilities.feature:699 +apiCapabilities/capabilities.feature:728 +apiCapabilities/capabilities.feature:757 +apiCapabilities/capabilitiesWithNormalUser.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/38 no comments endpoint +# +apiComments/comments.feature:9 +apiComments/comments.feature:24 +apiComments/comments.feature:38 +apiComments/comments.feature:52 +apiComments/createComments.feature:20 +apiComments/createComments.feature:21 +apiComments/createComments.feature:22 +apiComments/createComments.feature:24 +apiComments/createComments.feature:35 +apiComments/createComments.feature:46 +apiComments/createComments.feature:59 +apiComments/createComments.feature:70 +apiComments/createComments.feature:76 +apiComments/createComments.feature:87 +apiComments/deleteComments.feature:20 +apiComments/deleteComments.feature:21 +apiComments/deleteComments.feature:22 +apiComments/deleteComments.feature:24 +apiComments/deleteComments.feature:35 +apiComments/deleteComments.feature:48 +apiComments/deleteComments.feature:55 +apiComments/deleteComments.feature:66 +apiComments/deleteComments.feature:79 +apiComments/deleteComments.feature:87 +apiComments/deleteComments.feature:97 +apiComments/editComments.feature:22 +apiComments/editComments.feature:23 +apiComments/editComments.feature:24 +apiComments/editComments.feature:27 +apiComments/editComments.feature:38 +apiComments/editComments.feature:51 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +# +apiFavorites/favorites.feature:103 +apiFavorites/favorites.feature:104 +apiFavorites/favorites.feature:126 +apiFavorites/favorites.feature:127 +apiFavorites/favorites.feature:143 +apiFavorites/favorites.feature:144 +apiFavorites/favorites.feature:165 +apiFavorites/favorites.feature:166 +apiFavorites/favorites.feature:195 +apiFavorites/favorites.feature:196 +apiFavorites/favorites.feature:210 +apiFavorites/favorites.feature:211 +apiFavorites/favorites.feature:225 +apiFavorites/favorites.feature:226 +apiFavorites/favorites.feature:239 +apiFavorites/favorites.feature:240 diff --git a/tests/acceptance/features/apiSpecial1/ocsGETAuth.feature b/tests/acceptance/features/apiSpecial1/ocsGETAuth.feature new file mode 100644 index 0000000..b61faff --- /dev/null +++ b/tests/acceptance/features/apiSpecial1/ocsGETAuth.feature @@ -0,0 +1,114 @@ +@api @files_sharing-app-required +Feature: auth + + Background: + Given user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-29 + @issue-ocis-reva-30 + @smokeTest + #after fixing all issues delete this Scenario and use the core scenario + Scenario: using OCS anonymously + When a user requests these endpoints with "GET" and no authentication + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/apps/files_sharing/api/v1/shares | + | /ocs/v2.php/apps/files_sharing/api/v1/shares | + | /ocs/v1.php/cloud/apps | + | /ocs/v2.php/cloud/apps | + | /ocs/v1.php/cloud/groups | + | /ocs/v2.php/cloud/groups | + | /ocs/v1.php/cloud/users | + | /ocs/v2.php/cloud/users | + | /ocs/v1.php/config | + | /ocs/v2.php/config | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" + + @issue-ocis-reva-11 + @issue-ocis-reva-30 + @issue-ocis-reva-31 + @issue-ocis-reva-32 + @issue-ocis-reva-33 + @issue-ocis-reva-34 + @issue-ocis-reva-35 + #after fixing all issues delete this Scenario and use the core scenario + Scenario: using OCS with non-admin basic auth + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v1.php/cloud/groups | + | /ocs/v1.php/cloud/apps | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "998" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/config | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "100" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + # | /ocs/v1.php/apps/files_sharing/api/v1/shares | 100 | 200 | + # | /ocs/v2.php/apps/files_sharing/api/v1/shares | 100 | 200 | + + | /ocs/v2.php/cloud/apps | + | /ocs/v2.php/cloud/groups | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "404" + And the OCS status code of responses on all endpoints should be "998" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/cloud/users | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "403" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/cloud/users | + Then the HTTP status code of responses on all endpoints should be "403" + And the OCS status code of responses on all endpoints should be "403" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/config | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "200" + + @issue-ocis-reva-29 + @issue-ocis-reva-30 + @smokeTest + #after fixing all issues delete this Scenario and use the core scenario + Scenario: using OCS as normal user with wrong password + When user "Alice" requests these endpoints with "GET" using password "invalid" + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/apps/files_sharing/api/v1/shares | + | /ocs/v2.php/apps/files_sharing/api/v1/shares | + | /ocs/v1.php/cloud/apps | + | /ocs/v2.php/cloud/apps | + | /ocs/v1.php/cloud/groups | + | /ocs/v2.php/cloud/groups | + | /ocs/v1.php/cloud/users | + | /ocs/v2.php/cloud/users | + | /ocs/v1.php/config | + | /ocs/v2.php/config | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" diff --git a/tests/acceptance/features/apiSpecial2/favorites.feature b/tests/acceptance/features/apiSpecial2/favorites.feature new file mode 100644 index 0000000..daf471b --- /dev/null +++ b/tests/acceptance/features/apiSpecial2/favorites.feature @@ -0,0 +1,25 @@ +@api +Feature: favorite + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile1.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile2.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile3.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile4.txt" + And user "Alice" has created folder "/FOLDER" + And user "Alice" has created folder "/PARENT" + And user "Alice" has uploaded file with content "some data" to "/PARENT/parent.txt" + + @skipOnOcis-OC-Storage @issue-ocis-reva-276 + #after fixing the issues delete this Scenario and use the core scenario + Scenario Outline: Favorite a folder + Given using DAV path + When user "Alice" favorites element "/FOLDER" using the WebDAV API + Then the HTTP status code should be "500" + Examples: + | dav_version | + | old | + | new | diff --git a/tests/acceptance/features/bootstrap/RevaContext.php b/tests/acceptance/features/bootstrap/RevaContext.php new file mode 100644 index 0000000..6b6405c --- /dev/null +++ b/tests/acceptance/features/bootstrap/RevaContext.php @@ -0,0 +1,42 @@ +getEnvironment(); + // Get all the contexts you need in this context + $this->featureContext = $environment->getContext('FeatureContext'); + SetupHelper::init( + $this->featureContext->getAdminUsername(), + $this->featureContext->getAdminPassword(), + $this->featureContext->getBaseUrl(), + $this->featureContext->getOcPath() + ); + } +} diff --git a/tests/acceptance/features/bootstrap/bootstrap.php b/tests/acceptance/features/bootstrap/bootstrap.php new file mode 100644 index 0000000..8690302 --- /dev/null +++ b/tests/acceptance/features/bootstrap/bootstrap.php @@ -0,0 +1,14 @@ +addPsr4( + "", $pathToCore . "/tests/acceptance/features/bootstrap", true +); + +$classLoader->register(); diff --git a/vendor-bin/behat/composer.json b/vendor-bin/behat/composer.json new file mode 100644 index 0000000..5241c6a --- /dev/null +++ b/vendor-bin/behat/composer.json @@ -0,0 +1,22 @@ +{ + "config" : { + "platform": { + "php": "7.2" + } + }, + "require": { + "behat/behat": "^3.7", + "behat/mink": "1.7.1", + "behat/mink-extension": "^2.3", + "behat/mink-goutte-driver": "^1.2", + "behat/mink-selenium2-driver": "^1.4", + "jarnaiz/behat-junit-formatter": "^1.3", + "rdx/behat-variables": "^1.2", + "sensiolabs/behat-page-object-extension": "^2.3", + "symfony/translation": "^4.4", + "sabre/xml": "^2.2", + "guzzlehttp/guzzle": "^6.5", + "phpunit/phpunit": "^8.5", + "laminas/laminas-ldap": "^2.10" + } +}