1
0
Fork 0
mirror of https://github.com/overleaf/overleaf.git synced 2025-04-22 17:58:13 +00:00

Merge pull request from overleaf/sk-import-server-pro-acceptance-tests

Migrate server-pro acceptance tests to modules

GitOrigin-RevId: 7caf5719d21bbd7fb30901f3e52225fe4cbc9832
This commit is contained in:
Shane Kilkelly 2021-07-27 09:45:17 +01:00 committed by Copybot
parent d28c1941c2
commit 10deaf5aec
9 changed files with 159 additions and 38 deletions
services/web
app/src/infrastructure
docker-compose.ci.ymldocker-compose.common.envdocker-compose.yml
modules/launchpad/test/acceptance
test
acceptance/config
unit/src/infrastructure

View file

@ -39,8 +39,8 @@ const Features = {
*/
externalAuthenticationSystemUsed() {
return (
Boolean(Settings.ldap) ||
Boolean(Settings.saml) ||
(Boolean(Settings.ldap) && Boolean(Settings.ldap.enable)) ||
(Boolean(Settings.saml) && Boolean(Settings.saml.enable)) ||
Boolean(_.get(Settings, ['overleaf', 'oauth']))
)
},

View file

@ -1,4 +1,4 @@
version: "2"
version: "2.3"
volumes:
data:
@ -19,24 +19,10 @@ services:
build: .
image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
working_dir: /app
env_file: docker-compose.common.env
environment:
BCRYPT_ROUNDS: 1
REDIS_HOST: redis
QUEUES_REDIS_HOST: redis
MONGO_URL: "mongodb://mongo/sharelatex"
SHARELATEX_ALLOW_PUBLIC_ACCESS: 'true'
PROJECT_HISTORY_ENABLED: 'true'
ENABLED_LINKED_FILE_TYPES: 'url,project_file,project_output_file,mendeley,zotero'
LINKED_URL_PROXY: 'http://localhost:6543'
LOCK_MANAGER_MAX_LOCK_WAIT_TIME: 30000
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
BASE_CONFIG:
SHARELATEX_CONFIG:
COOKIE_DOMAIN: .overleaf.test
PUBLIC_URL: 'http://www.overleaf.test:3000'
HTTP_TEST_HOST: www.overleaf.test
OT_JWT_AUTH_KEY: "very secret key"
extra_hosts:
- 'www.overleaf.test:127.0.0.1'
command: npm run test:acceptance:app
@ -44,6 +30,8 @@ services:
depends_on:
- redis
- mongo
- saml
- ldap
test_karma:
build:
@ -79,3 +67,15 @@ services:
mongo:
image: mongo:4.0.19
ldap:
restart: always
image: rroemhild/test-openldap:1.1
saml:
restart: always
image: gcr.io/overleaf-ops/saml-test
environment:
SAML_BASE_URL_PATH: 'http://saml/simplesaml/'
SAML_TEST_SP_ENTITY_ID: 'sharelatex-test-saml'
SAML_TEST_SP_LOCATION: 'http://www.overleaf.test:3000/saml/callback'

View file

@ -0,0 +1,36 @@
BCRYPT_ROUNDS=1
REDIS_HOST=redis
QUEUES_REDIS_HOST=redis
MONGO_URL=mongodb://mongo/sharelatex
SHARELATEX_ALLOW_PUBLIC_ACCESS=true
PROJECT_HISTORY_ENABLED=true
LINKED_URL_PROXY=http://localhost:6543
ENABLED_LINKED_FILE_TYPES=url,project_file,project_output_file,mendeley,zotero
NODE_ENV=test
NODE_OPTIONS=--unhandled-rejections=strict
LOCK_MANAGER_MAX_LOCK_WAIT_TIME=30000
COOKIE_DOMAIN=.overleaf.test
PUBLIC_URL=http://www.overleaf.test:3000
HTTP_TEST_HOST=www.overleaf.test
OT_JWT_AUTH_KEY=very secret key
# Server-Pro LDAP
SHARELATEX_LDAP_URL=ldap://ldap:389
SHARELATEX_LDAP_SEARCH_BASE=ou=people,dc=planetexpress,dc=com
SHARELATEX_LDAP_SEARCH_FILTER=(uid={{username}})
SHARELATEX_LDAP_BIND_DN=cn=admin,dc=planetexpress,dc=com
SHARELATEX_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
SHARELATEX_LDAP_EMAIL_ATT=mail
SHARELATEX_LDAP_NAME_ATT=cn
SHARELATEX_LDAP_LAST_NAME_ATT=sn
SHARELATEX_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
# Server-Pro SAML
SHARELATEX_SAML_ENTRYPOINT=http://saml/simplesaml/saml2/idp/SSOService.php
SHARELATEX_SAML_CALLBACK_URL=http://saml/saml/callback
SHARELATEX_SAML_ISSUER=sharelatex-test-saml
SHARELATEX_SAML_IDENTITY_SERVICE_NAME=SAML Test Server
SHARELATEX_SAML_EMAIL_FIELD=email
SHARELATEX_SAML_FIRST_NAME_FIELD=givenName
SHARELATEX_SAML_LAST_NAME_FIELD=sn
SHARELATEX_SAML_UPDATE_USER_DETAILS_ON_LOGIN=true
# simplesaml cert from https://github.com/overleaf/google-ops/tree/master/docker-images/saml-test/var-simplesamlphp/cert
SHARELATEX_SAML_CERT=MIIDXTCCAkWgAwIBAgIJAOvOeQ4xFTzsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNVBAYTAkdCMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTYxMTE1MTQxMjU5WhcNMjYxMTE1MTQxMjU5WjBFMQswCQYDVQQGEwJHQjETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCT6MBe5G9VoLU8MfztOEbUhnwLp17ak8eFUqxqeXkkqtWB0b/cmIBU3xoQoO3dIF8PBzfqehqfYVhrNt/TFgcmDfmJnPJRL1RJWMW3VmiP5odJ3LwlkKbZpkeT3wZ8HEJIR1+zbpxiBNkbd2GbdR1iumcsHzMYX1A2CBj+ZMV5VijC+K4P0e9c05VsDEUtLmfeAasJAiumQoVVgAe/BpiXjICGGewa6EPFI7mKkifIRKOGxdRESwZZjxP30bI31oDN0cgKqIgSJtJ9nfCn9jgBMBkQHu42WMuaWD4jrGd7+vYdX+oIfArs9aKgAH5kUGhGdew2R9SpBefrhbNxG8QIDAQABo1AwTjAdBgNVHQ4EFgQU+aSojSyyLChP/IpZcafvSdhj7KkwHwYDVR0jBBgwFoAU+aSojSyyLChP/IpZcafvSdhj7KkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEABl3+OOVLBWMKs6PjA8lPuloWDNzSr3v76oUcHqAb+cfbucjXrOVsS9RJ0X9yxvCQyfM9FfY43DbspnN3izYhdvbJD8kKLNf0LA5st+ZxLfy0ACyL2iyAwICaqndqxAjQYplFAHmpUiu1DiHckyBPekokDJd+ze95urHMOsaGS5RWPoKJVE0bkaAeZCmEu0NNpXRSBiuxXSTeSAJfv6kyE/rkdhzUKyUl/cGQFrsVYfAFQVA+W6CKOh74ErSEzSHQQYndl7nD33snD/YqdU1ROxV6aJzLKCg+sdj+wRXSP2u/UHnM4jW9TGJfhO42jzL6WVuEvr9q4l7zWzUQKKKhtQ==

View file

@ -25,33 +25,22 @@ services:
volumes:
- .:/app
working_dir: /app
env_file: docker-compose.common.env
environment:
BCRYPT_ROUNDS: 1
REDIS_HOST: redis
QUEUES_REDIS_HOST: redis
MONGO_URL: "mongodb://mongo/sharelatex"
SHARELATEX_ALLOW_PUBLIC_ACCESS: 'true'
PROJECT_HISTORY_ENABLED: 'true'
LINKED_URL_PROXY: 'http://localhost:6543'
ENABLED_LINKED_FILE_TYPES: 'url,project_file,project_output_file,mendeley,zotero'
BASE_CONFIG:
SHARELATEX_CONFIG:
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
LOCK_MANAGER_MAX_LOCK_WAIT_TIME: 30000
MONGO_SERVER_SELECTION_TIMEOUT: 600000
MONGO_SOCKET_TIMEOUT: 300000
# SHARELATEX_ALLOW_ANONYMOUS_READ_AND_WRITE_SHARING: 'true'
BASE_CONFIG:
SHARELATEX_CONFIG:
COOKIE_DOMAIN: .overleaf.test
PUBLIC_URL: 'http://www.overleaf.test:3000'
HTTP_TEST_HOST: www.overleaf.test
OT_JWT_AUTH_KEY: "very secret key"
extra_hosts:
- 'www.overleaf.test:127.0.0.1'
depends_on:
- redis
- mongo
- saml
- ldap
command: npm run --silent test:acceptance:app
test_karma:
@ -83,3 +72,15 @@ services:
mongo:
image: mongo:4.0.19
ldap:
restart: always
image: rroemhild/test-openldap:1.1
saml:
restart: always
image: gcr.io/overleaf-ops/saml-test
environment:
SAML_BASE_URL_PATH: 'http://saml/simplesaml/'
SAML_TEST_SP_ENTITY_ID: 'sharelatex-test-saml'
SAML_TEST_SP_LOCATION: 'http://www.overleaf.test:3000/saml/callback'

View file

@ -0,0 +1,8 @@
const base = require(process.env.BASE_CONFIG)
module.exports = base.mergeWith({
enableLegacyLogin: true,
test: {
counterInit: 210000,
},
})

View file

@ -0,0 +1 @@
require('../../../../../test/acceptance/src/helpers/InitApp')

View file

@ -0,0 +1,73 @@
const { expect } = require('chai')
const cheerio = require('cheerio')
const WEB_PATH = '../../../../..'
const UserHelper = require(`${WEB_PATH}/test/acceptance/src/helpers/UserHelper`)
describe('Launchpad', function () {
const adminEmail = 'admin@example.com'
const adminPassword = 'adreadfulsecret'
const user = new UserHelper()
it('should show the launchpad page', async function () {
const response = await user.request.get('/launchpad')
expect(response.statusCode).to.equal(200)
const $ = cheerio.load(response.body)
expect($('h2').first().text()).to.equal('Create the first Admin account')
expect($('form[name="email"]').first()).to.exist
expect($('form[name="password"]').first()).to.exist
})
it('should allow for creation of the first admin user', async function () {
// Load the launchpad page
const initialPageResponse = await user.request.get('/launchpad')
expect(initialPageResponse.statusCode).to.equal(200)
const $ = cheerio.load(initialPageResponse.body)
expect($('h2').first().text()).to.equal('Create the first Admin account')
expect($('form[name="email"]').first()).to.exist
expect($('form[name="password"]').first()).to.exist
// Submit the form
let csrfToken = await user.getCsrfToken()
const postResponse = await user.request.post({
url: '/launchpad/register_admin',
json: {
_csrf: csrfToken,
email: adminEmail,
password: adminPassword,
},
})
expect(postResponse.statusCode).to.equal(200)
expect(postResponse.body.redir).to.equal('')
expect(postResponse.body.email).to.equal(adminEmail)
expect(postResponse.body.id).to.exist
// Try to load the page again
const secondPageResponse = await user.request.get('/launchpad', {
simple: false,
})
expect(secondPageResponse.statusCode).to.equal(302)
expect(secondPageResponse.headers.location).to.equal('/login')
// Forbid submitting the form again
csrfToken = await user.getCsrfToken()
const badPostResponse = await user.request.post({
url: '/launchpad/register_admin',
json: {
_csrf: csrfToken,
email: adminEmail + '1',
password: adminPassword + '1',
},
simple: false,
})
expect(badPostResponse.statusCode).to.equal(403)
// Log in as this new admin user
const adminUser = await UserHelper.loginUser({
email: adminEmail,
password: adminPassword,
})
// Check we are actually admin
expect(await adminUser.isLoggedIn()).to.equal(true)
expect(adminUser.user.isAdmin).to.equal(true)
})
})

View file

@ -18,7 +18,9 @@ module.exports = {
security: {
sessionSecret: 'static-secret-for-tests',
},
adminDomains: ['example.com'],
adminDomains: process.env.ADMIN_DOMAINS
? JSON.parse(process.env.ADMIN_DOMAINS)
: ['example.com'],
statusPageUrl: 'status.example.com',

View file

@ -20,7 +20,7 @@ describe('Features', function () {
})
describe('with ldap setting', function () {
beforeEach(function () {
this.settings.ldap = true
this.settings.ldap = { enable: true }
})
it('should return true', function () {
expect(this.Features.externalAuthenticationSystemUsed()).to.be.true
@ -28,7 +28,7 @@ describe('Features', function () {
})
describe('with saml setting', function () {
beforeEach(function () {
this.settings.saml = true
this.settings.saml = { enable: true }
})
it('should return true', function () {
expect(this.Features.externalAuthenticationSystemUsed()).to.be.true