From 035532512afe934ef9661e3e9d77cbd59fe4edb1 Mon Sep 17 00:00:00 2001 From: Felix Date: Fri, 24 Apr 2020 18:30:31 +0200 Subject: [PATCH] Implement integration test for federation --- .dockerignore | 1 + .gitignore | 1 + docker/federation-test/run-tests.sh | 23 ++++ docker/federation/docker-compose.yml | 3 +- docker/federation/run-federation-test.bash | 2 +- ui/src/api_tests/api.spec.ts | 132 +++++++++------------ 6 files changed, 86 insertions(+), 76 deletions(-) create mode 100755 docker/federation-test/run-tests.sh diff --git a/.dockerignore b/.dockerignore index 4f186bcde..255caf67f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,6 +3,7 @@ ui/node_modules server/target docker/dev/volumes docker/federation/volumes +docker/federation-test/volumes .git ansible diff --git a/.gitignore b/.gitignore index 5e9fd40d6..236a729eb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ ansible/passwords/ docker/lemmy_mine.hjson docker/dev/env_deploy.sh docker/federation/volumes +docker/federation-test/volumes docker/dev/volumes # local build files diff --git a/docker/federation-test/run-tests.sh b/docker/federation-test/run-tests.sh new file mode 100755 index 000000000..43e2f9093 --- /dev/null +++ b/docker/federation-test/run-tests.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +pushd ../../server/ +cargo build +popd + +sudo docker build ../../ --file ../federation/Dockerfile --tag lemmy-federation:latest + +sudo docker-compose --file ../federation/docker-compose.yml --project-directory . up -d + +# TODO: need to wait until the instances are initialised + +pushd ../../ui +yarn +echo "Waiting for Lemmy to start..." +while [[ "$(curl -s -o /dev/null -w '%{http_code}' 'localhost:8540/api/v1/site')" != "200" ]]; do sleep 5; done +yarn api-test || true +popd + +sudo docker-compose --file ../federation/docker-compose.yml --project-directory . down + +sudo rm -r volumes/ diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index 4f23cdcc2..496e7fa60 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -7,7 +7,8 @@ services: - "8540:8540" - "8550:8550" volumes: - - ./nginx.conf:/etc/nginx/nginx.conf + # Hack to make this work from both docker/federation/ and docker/federation-test/ + - ../federation/nginx.conf:/etc/nginx/nginx.conf depends_on: - lemmy_alpha - pictshare_alpha diff --git a/docker/federation/run-federation-test.bash b/docker/federation/run-federation-test.bash index 2c8b681ce..8486648b3 100755 --- a/docker/federation/run-federation-test.bash +++ b/docker/federation/run-federation-test.bash @@ -12,6 +12,6 @@ pushd ../../server/ || exit cargo build popd || exit -sudo docker build ../../ -f Dockerfile -t lemmy-federation:latest +sudo docker build ../../ --file Dockerfile -t lemmy-federation:latest sudo docker-compose up diff --git a/ui/src/api_tests/api.spec.ts b/ui/src/api_tests/api.spec.ts index 5db9ee647..07e12ecfe 100644 --- a/ui/src/api_tests/api.spec.ts +++ b/ui/src/api_tests/api.spec.ts @@ -3,83 +3,67 @@ import fetch from 'node-fetch'; import { LoginForm, LoginResponse, - GetPostsForm, - GetPostsResponse, - CommentForm, - CommentResponse, - ListingType, - SortType, + PostForm, + PostResponse, + SearchResponse, } from '../interfaces'; -let baseUrl = 'https://test.lemmy.ml'; -let apiUrl = `${baseUrl}/api/v1`; -let auth: string; +let lemmyAlphaUrl = 'http://localhost:8540'; +let lemmyBetaUrl = 'http://localhost:8550'; +let lemmyAlphaApiUrl = `${lemmyAlphaUrl}/api/v1`; +let lemmyBetaApiUrl = `${lemmyBetaUrl}/api/v1`; +let lemmyAlphaAuth: string; -beforeAll(async () => { - console.log('Logging in as test user.'); - let form: LoginForm = { - username_or_email: 'tester', - password: 'tester', - }; +// Workaround for tests being run before beforeAll() is finished +// https://github.com/facebook/jest/issues/9527#issuecomment-592406108 +describe('main', () => { + beforeAll(async () => { + console.log('Logging in as lemmy_alpha'); + let form: LoginForm = { + username_or_email: 'lemmy_alpha', + password: 'lemmy', + }; - let res: LoginResponse = await fetch(`${apiUrl}/user/login`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: wrapper(form), - }).then(d => d.json()); + let res: LoginResponse = await fetch(`${lemmyAlphaApiUrl}/user/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: wrapper(form), + }).then(d => d.json()); - auth = res.jwt; + lemmyAlphaAuth = res.jwt; + }); + + test('Create test post on alpha and fetch it on beta', async () => { + let name = 'A jest test post'; + let postForm: PostForm = { + name, + auth: lemmyAlphaAuth, + community_id: 2, + creator_id: 2, + nsfw: false, + }; + + let createResponse: PostResponse = await fetch(`${lemmyAlphaApiUrl}/post`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: wrapper(postForm), + }).then(d => d.json()); + expect(createResponse.post.name).toBe(name); + + let searchUrl = `${lemmyBetaApiUrl}/search?q=${createResponse.post.ap_id}&type_=All&sort=TopAll`; + let searchResponse: SearchResponse = await fetch(searchUrl, { + method: 'GET', + }).then(d => d.json()); + + // TODO: check more fields + expect(searchResponse.posts[0].name).toBe(name); + }); + + function wrapper(form: any): string { + return JSON.stringify(form); + } }); - -test('Get test user posts', async () => { - let form: GetPostsForm = { - type_: ListingType[ListingType.All], - sort: SortType[SortType.TopAll], - auth, - }; - - let res: GetPostsResponse = await fetch( - `${apiUrl}/post/list?type_=${form.type_}&sort=${form.sort}&auth=${auth}` - ).then(d => d.json()); - - // console.debug(res); - - expect(res.posts[0].id).toBe(2); -}); - -test('Create test comment', async () => { - let content = 'A jest test comment'; - let form: CommentForm = { - post_id: 2, - content, - auth, - }; - - let res: CommentResponse = await fetch(`${apiUrl}/comment`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: wrapper(form), - }).then(d => d.json()); - - expect(res.comment.content).toBe(content); -}); - -test('adds 1 + 2 to equal 3', () => { - let sum = (a: number, b: number) => a + b; - expect(sum(1, 2)).toBe(3); -}); - -test(`Get ${baseUrl} nodeinfo href`, async () => { - let url = `${baseUrl}/.well-known/nodeinfo`; - let href = `${baseUrl}/nodeinfo/2.0.json`; - let res = await fetch(url).then(d => d.json()); - expect(res.links.href).toBe(href); -}); - -function wrapper(form: any): string { - return JSON.stringify(form); -}