From 2f091b7d93369b081cb007269e8bd4678a18305c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=ADITQ?= Date: Sat, 16 Mar 2024 13:22:20 +0300 Subject: [PATCH] Updated countries list, uploaded private tests, removed github CI/CD --- .github/workflows/test.yaml | 72 - tests/init-database.sh | 7 +- tests/public-tests.json | 889 ------ tests/tests.json | 5519 +++++++++++++++++++++++++++++++++++ 4 files changed, 5521 insertions(+), 966 deletions(-) delete mode 100644 .github/workflows/test.yaml delete mode 100644 tests/public-tests.json create mode 100644 tests/tests.json diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index 84c9065..0000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: Run tests - -on: deployment - -permissions: - contents: read - packages: write - -jobs: - build: - name: Build - runs-on: cu-backend - timeout-minutes: 10 - if: github.actor != 'github-classroom[bot]' - container: - image: gcr.io/kaniko-project/executor:debug - steps: - - name: Login to ghcr.io - run: > - echo "{\"auths\": {\"ghcr.io\": {\"auth\": \"$(echo -n "$AUTH" | base64 -w 0)\"}}}" - > /kaniko/.docker/config.json - env: - AUTH: "${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}" - - - name: Build solution image - run: > - /kaniko/executor - --context="${{ github.repositoryUrl }}#refs/heads/main#${{ github.sha }}" - --context-sub-path=solution - --destination="$(echo -n "$REPO:run-${{ github.run_id }}" | tr '[:upper:]' '[:lower:]')" - --destination="$(echo -n "$REPO:latest" | tr '[:upper:]' '[:lower:]')" - --label org.opencontainers.image.source=https://github.com/${{ github.repository }} - env: - GIT_USERNAME: kaniko - GIT_PASSWORD: "${{ secrets.GITHUB_TOKEN }}" - REPO: "ghcr.io/${{ github.repository }}" - - tests: - name: Tests - runs-on: ubuntu-22.04 - needs: build - timeout-minutes: 10 - if: github.actor != 'github-classroom[bot]' - steps: - - uses: Central-University-IT/setup-test-backend@v1 - - - uses: docker/login-action@v3.0.0 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - run: > - IMAGE_SOLUTION="$(echo "ghcr.io/${{ github.repository }}:run-${{ github.run_id }}" | tr '[:upper:]' '[:lower:]')" - IMAGE_POSTGRES="$(echo "ghcr.io/${{ github.repository_owner }}/postgres:16.1-alpine3.19" | tr '[:upper:]' '[:lower:]')" - /usr/local/bin/checker - continue-on-error: true - - - uses: actions/upload-artifact@v4.0.0 - with: - name: result - path: ./result.json - if-no-files-found: error - compression-level: 0 - - - uses: bots-house/ghcr-delete-image-action@v1.1.0 - continue-on-error: true - with: - owner: ${{ github.repository_owner }} - name: ${{ github.event.repository.name }} - token: ${{ secrets.GITHUB_TOKEN }} - tag: run-${{ github.run_id }} diff --git a/tests/init-database.sh b/tests/init-database.sh index 06c9da1..7c3b295 100644 --- a/tests/init-database.sh +++ b/tests/init-database.sh @@ -21,7 +21,6 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E ('Andorra','AD','AND','Europe'), ('Angola','AO','AGO','Africa'), ('Anguilla','AI','AIA','Americas'), - ('Antarctica','AQ','ATA',''), ('Antigua and Barbuda','AG','ATG','Americas'), ('Argentina','AR','ARG','Americas'), ('Armenia','AM','ARM','Asia'), @@ -67,7 +66,6 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E ('Congo, Democratic Republic of the','CD','COD','Africa'), ('Cook Islands','CK','COK','Oceania'), ('Costa Rica','CR','CRI','Americas'), - ('Côte d Ivoire','CI','CIV','Africa'), ('Croatia','HR','HRV','Europe'), ('Cuba','CU','CUB','Americas'), ('Curaçao','CW','CUW','Americas'), @@ -131,11 +129,9 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E ('Kazakhstan','KZ','KAZ','Asia'), ('Kenya','KE','KEN','Africa'), ('Kiribati','KI','KIR','Oceania'), - ('Korea (Democratic People s Republic of)','KP','PRK','Asia'), ('Korea, Republic of','KR','KOR','Asia'), ('Kuwait','KW','KWT','Asia'), ('Kyrgyzstan','KG','KGZ','Asia'), - ('Lao People s Democratic Republic','LA','LAO','Asia'), ('Latvia','LV','LVA','Europe'), ('Lebanon','LB','LBN','Asia'), ('Lesotho','LS','LSO','Africa'), @@ -261,5 +257,6 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E ('Western Sahara','EH','ESH','Africa'), ('Yemen','YE','YEM','Asia'), ('Zambia','ZM','ZMB','Africa'), - ('Zimbabwe','ZW','ZWE','Africa'); + ('Zimbabwe','ZW','ZWE','Africa'), + ('Byteland PROD','YY','YYY','Europe'); EOSQL \ No newline at end of file diff --git a/tests/public-tests.json b/tests/public-tests.json deleted file mode 100644 index 3870506..0000000 --- a/tests/public-tests.json +++ /dev/null @@ -1,889 +0,0 @@ -{ - "info": { - "_postman_id": "a5dbb75a-d7a8-4e8c-8660-9925345a3a86", - "name": "PROD round 2: public tests [1]", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "01/ping", - "item": [ - { - "name": "Ping", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "", - "pm.test(\"PING server\", function () {", - " pm.sendRequest(pm.variables.get(\"base_url\") + \"/ping\", function (err, response) {", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - " });", - "});", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "02/countries", - "item": [ - { - "name": "List countries", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"array\",", - " \"items\": {", - " \"type\": \"object\",", - " \"description\": \"Информация о стране из стандарта ISO 3166\",", - " \"properties\": {", - " \"name\": {", - " \"type\": \"string\",", - " \"description\": \"Полное название страны\",", - " \"maxLength\": 100", - " },", - " \"alpha2\": {", - " \"type\": \"string\",", - " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", - " \"maxLength\": 2,", - " \"pattern\": \"[a-zA-Z]{2}\"", - " },", - " \"alpha3\": {", - " \"type\": \"string\",", - " \"description\": \"Трехбуквенный код страны\",", - " \"maxLength\": 3,", - " \"pattern\": \"[a-zA-Z]{3}\"", - " },", - " \"region\": {", - " \"type\": \"string\",", - " \"description\": \"Географический регион, к которому относится страна\",", - " \"enum\": [", - " \"Europe\",", - " \"Africa\",", - " \"Americas\",", - " \"Oceania\",", - " \"Asia\"", - " ]", - " }", - " },", - " \"required\": [", - " \"name\",", - " \"alpha2\",", - " \"alpha3\"", - " ]", - " },", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "var countries = [", - " {", - " \"name\": \"Algeria\",", - " \"alpha2\": \"DZ\",", - " \"alpha3\": \"DZA\",", - " \"region\": \"Africa\"", - " },", - " {", - " \"name\": \"Russian Federation\",", - " \"alpha2\": \"RU\",", - " \"alpha3\": \"RUS\",", - " \"region\": \"Europe\"", - " },", - "];", - "", - "countries.forEach(function (country) {", - " pm.test(`List countries from region \"${country.region}\"`, function () {", - " var url = pm.variables.get(\"base_url\") + `/countries?region=${country.region}`;", - "", - " pm.sendRequest(url, function (err, response) {", - " pm.test(`Validate response for region ${country.region}`, () => {", - " var resp = response.json();", - " ", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", - "", - " console.log(\"got\", resp);", - " pm.expect(resp).to.deep.include(country, `Invalid countries list`);", - " });", - " });", - " });", - "});", - "", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/countries", - "host": [ - "{{base_url}}" - ], - "path": [ - "countries" - ] - } - }, - "response": [] - }, - { - "name": "Get country", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var countrySchema = {", - " \"type\": \"object\",", - " \"description\": \"Информация о стране из стандарта ISO 3166\",", - " \"properties\": {", - " \"name\": {", - " \"type\": \"string\",", - " \"description\": \"Полное название страны\",", - " \"maxLength\": 100", - " },", - " \"alpha2\": {", - " \"type\": \"string\",", - " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", - " \"maxLength\": 2,", - " \"pattern\": \"[a-zA-Z]{2}\"", - " },", - " \"alpha3\": {", - " \"type\": \"string\",", - " \"description\": \"Трехбуквенный код страны\",", - " \"maxLength\": 3,", - " \"pattern\": \"[a-zA-Z]{3}\"", - " },", - " \"region\": {", - " \"type\": \"string\",", - " \"description\": \"Географический регион, к которому относится страна\",", - " \"enum\": [", - " \"Europe\",", - " \"Africa\",", - " \"Americas\",", - " \"Oceania\",", - " \"Asia\"", - " ]", - " }", - " },", - " \"required\": [", - " \"name\",", - " \"alpha2\",", - " \"alpha3\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "var countries = [", - " {", - " \"name\": \"Algeria\",", - " \"alpha2\": \"DZ\",", - " \"alpha3\": \"DZA\",", - " \"region\": \"Africa\"", - " },", - " {", - " \"name\": \"Russian Federation\",", - " \"alpha2\": \"RU\",", - " \"alpha3\": \"RUS\",", - " \"region\": \"Europe\"", - " },", - " {", - " \"name\": \"Kazakhstan\",", - " \"alpha2\": \"KZ\",", - " \"alpha3\": \"KAZ\",", - " \"region\": \"Asia\"", - " }", - "];", - "", - "countries.forEach(function (country) {", - " pm.test(`Get country \"${country.name}\" [existing]`, function () {", - " var url = pm.variables.get(\"base_url\") + \"/countries/\" + country.alpha2;", - "", - " pm.sendRequest(url, function (err, response) {", - " pm.test(\"Validate response\", () => {", - " var resp = response.json();", - "", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, countrySchema), \"Invalid JSON schema\").to.be.true;", - "", - " console.log(\"got\", resp, \"expected\", country);", - " pm.expect(resp).to.deep.eq(country, `Got invalid object`);", - " });", - " });", - " });", - "});", - "", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/countries/RU", - "host": [ - "{{base_url}}" - ], - "path": [ - "countries", - "RU" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "03/auth/registration", - "item": [ - { - "name": "Register a user", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"object\",", - " \"properties\": {", - " \"profile\": {", - " \"type\": \"object\",", - " \"description\": \"Информация о профиле пользователя\",", - " \"properties\": {", - " \"login\": {", - " \"type\": \"string\",", - " \"description\": \"Логин пользователя\",", - " \"maxLength\": 30,", - " \"pattern\": \"[a-zA-Z0-9-]+\"", - " },", - " \"email\": {", - " \"type\": \"string\",", - " \"description\": \"E-mail пользователя\",", - " \"maxLength\": 50", - " },", - " \"countryCode\": {", - " \"type\": \"string\",", - " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", - " \"maxLength\": 2,", - " \"pattern\": \"[a-zA-Z]{2}\"", - " },", - " \"isPublic\": {", - " \"type\": \"boolean\",", - " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", - " },", - " \"phone\": {", - " \"type\": \"string\",", - " \"description\": \"Номер телефона пользователя в формате +123456789\",", - " \"pattern\": \"\\\\+[\\\\d]+\"", - " },", - " \"image\": {", - " \"type\": \"string\",", - " \"description\": \"Ссылка на фото для аватара пользователя\",", - " \"maxLength\": 200", - " }", - " },", - " \"required\": [", - " \"login\",", - " \"email\",", - " \"countryCode\",", - " \"isPublic\"", - " ]", - " }", - " },", - " \"required\": [", - " \"profile\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "pm.test(\"Register a user\", function () {", - " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", - " const options = {", - " url: url,", - " method: 'POST',", - " header: {", - " 'Content-Type': 'application/json',", - " },", - " body: {", - " mode: 'raw',", - " raw: JSON.stringify({", - " 'login': 'yellowMonkey2',", - " 'email': 'yellowstone1980@you.ru',", - " 'password': '$aba4821FWfew01#.fewA$',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " })", - " }", - " };", - "", - " const profile = {", - " 'profile': {", - " 'login': 'yellowMonkey2',", - " 'email': 'yellowstone1980@you.ru',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " }", - " }", - "", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate response\", () => {", - " var resp = response.json();", - " ", - " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", - "", - " console.log(\"got\", resp, \"expected\", profile);", - " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", - " });", - " });", - "});", - "", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "04/auth/sign-in", - "item": [ - { - "name": "Register a user", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"object\",", - " \"properties\": {", - " \"profile\": {", - " \"type\": \"object\",", - " \"description\": \"Информация о профиле пользователя\",", - " \"properties\": {", - " \"login\": {", - " \"type\": \"string\",", - " \"description\": \"Логин пользователя\",", - " \"maxLength\": 30,", - " \"pattern\": \"[a-zA-Z0-9-]+\"", - " },", - " \"email\": {", - " \"type\": \"string\",", - " \"description\": \"E-mail пользователя\",", - " \"maxLength\": 50", - " },", - " \"countryCode\": {", - " \"type\": \"string\",", - " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", - " \"maxLength\": 2,", - " \"pattern\": \"[a-zA-Z]{2}\"", - " },", - " \"isPublic\": {", - " \"type\": \"boolean\",", - " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", - " },", - " \"phone\": {", - " \"type\": \"string\",", - " \"description\": \"Номер телефона пользователя в формате +123456789\",", - " \"pattern\": \"\\\\+[\\\\d]+\"", - " },", - " \"image\": {", - " \"type\": \"string\",", - " \"description\": \"Ссылка на фото для аватара пользователя\",", - " \"maxLength\": 200", - " }", - " },", - " \"required\": [", - " \"login\",", - " \"email\",", - " \"countryCode\",", - " \"isPublic\"", - " ]", - " }", - " },", - " \"required\": [", - " \"profile\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "pm.test(\"Register a user\", function () {", - " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", - " const options = {", - " url: url,", - " method: 'POST',", - " header: {", - " 'Content-Type': 'application/json',", - " },", - " body: {", - " mode: 'raw',", - " raw: JSON.stringify({", - " 'login': 'yellowMonkey2',", - " 'email': 'yellowstone1980@you.ru',", - " 'password': '$aba4821FWfew01#.fewA$',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " })", - " }", - " };", - "", - " const profile = {", - " 'profile': {", - " 'login': 'yellowMonkey2',", - " 'email': 'yellowstone1980@you.ru',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " }", - " }", - "", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate response\", () => {", - " var resp = response.json();", - " ", - " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", - "", - " console.log(\"got\", resp, \"expected\", profile);", - " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", - " });", - " });", - "});", - "", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - }, - { - "name": "Sign in", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"object\",", - " \"properties\": {", - " \"token\": {", - " \"type\": \"string\",", - " \"description\": \"Сгенерированный токен пользователя\",", - " \"minLength\": 20,", - " }", - " },", - " \"required\": [", - " \"token\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "pm.test(\"Sign in\", function () {", - " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", - " const options = {", - " url: url,", - " method: 'POST',", - " header: {", - " 'Content-Type': 'application/json',", - " },", - " body: {", - " mode: 'raw',", - " raw: JSON.stringify({", - " 'login': 'yellowMonkey2',", - " 'password': '$aba4821FWfew01#.fewA$',", - " })", - " }", - " };", - "", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate sign-in response\", () => {", - " var resp = response.json();", - "", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", - "", - " console.log('Token', resp.token);", - " });", - " });", - "});", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - } - ] - }, - { - "name": "05/me", - "item": [ - { - "name": "Register a user", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"object\",", - " \"properties\": {", - " \"profile\": {", - " \"type\": \"object\",", - " \"description\": \"Информация о профиле пользователя\",", - " \"properties\": {", - " \"login\": {", - " \"type\": \"string\",", - " \"description\": \"Логин пользователя\",", - " \"maxLength\": 30,", - " \"pattern\": \"[a-zA-Z0-9-]+\"", - " },", - " \"email\": {", - " \"type\": \"string\",", - " \"description\": \"E-mail пользователя\",", - " \"maxLength\": 50", - " },", - " \"countryCode\": {", - " \"type\": \"string\",", - " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", - " \"maxLength\": 2,", - " \"pattern\": \"[a-zA-Z]{2}\"", - " },", - " \"isPublic\": {", - " \"type\": \"boolean\",", - " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", - " },", - " \"phone\": {", - " \"type\": \"string\",", - " \"description\": \"Номер телефона пользователя в формате +123456789\",", - " \"pattern\": \"\\\\+[\\\\d]+\"", - " },", - " \"image\": {", - " \"type\": \"string\",", - " \"description\": \"Ссылка на фото для аватара пользователя\",", - " \"maxLength\": 200", - " }", - " },", - " \"required\": [", - " \"login\",", - " \"email\",", - " \"countryCode\",", - " \"isPublic\"", - " ]", - " }", - " },", - " \"required\": [", - " \"profile\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "pm.test(\"Register a user\", function () {", - " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", - " const options = {", - " url: url,", - " method: 'POST',", - " header: {", - " 'Content-Type': 'application/json',", - " },", - " body: {", - " mode: 'raw',", - " raw: JSON.stringify({", - " 'login': 'yellowMonkey10000',", - " 'email': 'yellowstone1980@you.ru',", - " 'password': '$aba4821FWfew01#.fewA$',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " })", - " }", - " };", - "", - " const profile = {", - " 'profile': {", - " 'login': 'yellowMonkey10000',", - " 'email': 'yellowstone1980@you.ru',", - " 'countryCode': 'RU',", - " 'isPublic': true,", - " 'phone': '+74951239922',", - " }", - " }", - "", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate response\", () => {", - " var resp = response.json();", - " ", - " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", - " });", - " });", - "});", - "", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - }, - { - "name": "Sign in", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "var schema = {", - " \"type\": \"object\",", - " \"properties\": {", - " \"token\": {", - " \"type\": \"string\",", - " \"description\": \"Сгенерированный токен пользователя\",", - " \"minLength\": 20,", - " }", - " },", - " \"required\": [", - " \"token\"", - " ],", - " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", - "};", - "", - "pm.test(\"Sign in\", function () {", - " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", - " var options = {", - " url: url,", - " method: 'POST',", - " header: {", - " 'Content-Type': 'application/json',", - " },", - " body: {", - " mode: 'raw',", - " raw: JSON.stringify({", - " 'login': 'yellowMonkey10000',", - " 'password': '$aba4821FWfew01#.fewA$',", - " })", - " }", - " };", - " ", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate sign-in response\", () => {", - " var resp = response.json();", - "", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", - "", - " pm.environment.set(\"05_profile_token\", resp.token);", - " console.log(\"Token has been saved\")", - " });", - " });", - "});", - "", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - }, - { - "name": "Get my profile", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Get profile\", function () {", - " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", - " const token = pm.environment.get(\"05_profile_token\");", - " const options = {", - " url: url,", - " method: 'GET',", - " header: {", - " 'Content-Type': 'application/json',", - " 'Authorization': `Bearer ${token}`,", - " },", - " };", - "", - " pm.sendRequest(options, function (err, response) {", - " pm.test(\"Validate profile\", () => {", - " var resp = response.json();", - "", - " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", - "", - " console.log(\"Got profile\", resp);", - " pm.expect(resp.login).to.be.eq(\"yellowMonkey10000\", \"Invalid login\");", - " });", - " });", - "});", - "", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [], - "url": { - "raw": "{{base_url}}/ping", - "host": [ - "{{base_url}}" - ], - "path": [ - "ping" - ] - } - }, - "response": [] - } - ] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "base_url", - "value": "http://localhost:57424/api", - "type": "default" - } - ] -} \ No newline at end of file diff --git a/tests/tests.json b/tests/tests.json new file mode 100644 index 0000000..7a18f1a --- /dev/null +++ b/tests/tests.json @@ -0,0 +1,5519 @@ +{ + "info": { + "_postman_id": "5f01a459-2226-46ba-b69b-7b15e31810dc", + "name": "PROD round 2: secret tests", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "01/ping", + "item": [ + { + "name": "Ping", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "", + "pm.test(\"PING server\", function () {", + " pm.sendRequest(pm.variables.get(\"base_url\") + \"/ping\", function (err, response) {", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "02/countries", + "item": [ + { + "name": "List all countries", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"array\",", + " \"items\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о стране из стандарта ISO 3166\",", + " \"properties\": {", + " \"name\": {", + " \"type\": \"string\",", + " \"description\": \"Полное название страны\",", + " \"maxLength\": 100", + " },", + " \"alpha2\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"alpha3\": {", + " \"type\": \"string\",", + " \"description\": \"Трехбуквенный код страны\",", + " \"maxLength\": 3,", + " \"pattern\": \"[a-zA-Z]{3}\"", + " },", + " \"region\": {", + " \"type\": \"string\",", + " \"description\": \"Географический регион, к которому относится страна\",", + " \"enum\": [", + " \"Europe\",", + " \"Africa\",", + " \"Americas\",", + " \"Oceania\",", + " \"Asia\"", + " ]", + " }", + " },", + " \"required\": [", + " \"name\",", + " \"alpha2\",", + " \"alpha3\"", + " ]", + " },", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "const countries = [{\"name\":\"Afghanistan\",\"alpha2\":\"AF\",\"alpha3\":\"AFG\",\"region\":\"Asia\"},{\"name\":\"Åland Islands\",\"alpha2\":\"AX\",\"alpha3\":\"ALA\",\"region\":\"Europe\"},{\"name\":\"Albania\",\"alpha2\":\"AL\",\"alpha3\":\"ALB\",\"region\":\"Europe\"},{\"name\":\"Algeria\",\"alpha2\":\"DZ\",\"alpha3\":\"DZA\",\"region\":\"Africa\"},{\"name\":\"American Samoa\",\"alpha2\":\"AS\",\"alpha3\":\"ASM\",\"region\":\"Oceania\"},{\"name\":\"Andorra\",\"alpha2\":\"AD\",\"alpha3\":\"AND\",\"region\":\"Europe\"},{\"name\":\"Angola\",\"alpha2\":\"AO\",\"alpha3\":\"AGO\",\"region\":\"Africa\"},{\"name\":\"Anguilla\",\"alpha2\":\"AI\",\"alpha3\":\"AIA\",\"region\":\"Americas\"},{\"name\":\"Antigua and Barbuda\",\"alpha2\":\"AG\",\"alpha3\":\"ATG\",\"region\":\"Americas\"},{\"name\":\"Argentina\",\"alpha2\":\"AR\",\"alpha3\":\"ARG\",\"region\":\"Americas\"},{\"name\":\"Armenia\",\"alpha2\":\"AM\",\"alpha3\":\"ARM\",\"region\":\"Asia\"},{\"name\":\"Aruba\",\"alpha2\":\"AW\",\"alpha3\":\"ABW\",\"region\":\"Americas\"},{\"name\":\"Australia\",\"alpha2\":\"AU\",\"alpha3\":\"AUS\",\"region\":\"Oceania\"},{\"name\":\"Austria\",\"alpha2\":\"AT\",\"alpha3\":\"AUT\",\"region\":\"Europe\"},{\"name\":\"Azerbaijan\",\"alpha2\":\"AZ\",\"alpha3\":\"AZE\",\"region\":\"Asia\"},{\"name\":\"Bahamas\",\"alpha2\":\"BS\",\"alpha3\":\"BHS\",\"region\":\"Americas\"},{\"name\":\"Bahrain\",\"alpha2\":\"BH\",\"alpha3\":\"BHR\",\"region\":\"Asia\"},{\"name\":\"Bangladesh\",\"alpha2\":\"BD\",\"alpha3\":\"BGD\",\"region\":\"Asia\"},{\"name\":\"Barbados\",\"alpha2\":\"BB\",\"alpha3\":\"BRB\",\"region\":\"Americas\"},{\"name\":\"Belarus\",\"alpha2\":\"BY\",\"alpha3\":\"BLR\",\"region\":\"Europe\"},{\"name\":\"Belgium\",\"alpha2\":\"BE\",\"alpha3\":\"BEL\",\"region\":\"Europe\"},{\"name\":\"Belize\",\"alpha2\":\"BZ\",\"alpha3\":\"BLZ\",\"region\":\"Americas\"},{\"name\":\"Benin\",\"alpha2\":\"BJ\",\"alpha3\":\"BEN\",\"region\":\"Africa\"},{\"name\":\"Bermuda\",\"alpha2\":\"BM\",\"alpha3\":\"BMU\",\"region\":\"Americas\"},{\"name\":\"Bhutan\",\"alpha2\":\"BT\",\"alpha3\":\"BTN\",\"region\":\"Asia\"},{\"name\":\"Bolivia (Plurinational State of)\",\"alpha2\":\"BO\",\"alpha3\":\"BOL\",\"region\":\"Americas\"},{\"name\":\"Bonaire, Sint Eustatius and Saba\",\"alpha2\":\"BQ\",\"alpha3\":\"BES\",\"region\":\"Americas\"},{\"name\":\"Bosnia and Herzegovina\",\"alpha2\":\"BA\",\"alpha3\":\"BIH\",\"region\":\"Europe\"},{\"name\":\"Botswana\",\"alpha2\":\"BW\",\"alpha3\":\"BWA\",\"region\":\"Africa\"},{\"name\":\"Bouvet Island\",\"alpha2\":\"BV\",\"alpha3\":\"BVT\",\"region\":\"Americas\"},{\"name\":\"Brazil\",\"alpha2\":\"BR\",\"alpha3\":\"BRA\",\"region\":\"Americas\"},{\"name\":\"British Indian Ocean Territory\",\"alpha2\":\"IO\",\"alpha3\":\"IOT\",\"region\":\"Africa\"},{\"name\":\"Brunei Darussalam\",\"alpha2\":\"BN\",\"alpha3\":\"BRN\",\"region\":\"Asia\"},{\"name\":\"Bulgaria\",\"alpha2\":\"BG\",\"alpha3\":\"BGR\",\"region\":\"Europe\"},{\"name\":\"Burkina Faso\",\"alpha2\":\"BF\",\"alpha3\":\"BFA\",\"region\":\"Africa\"},{\"name\":\"Burundi\",\"alpha2\":\"BI\",\"alpha3\":\"BDI\",\"region\":\"Africa\"},{\"name\":\"Cabo Verde\",\"alpha2\":\"CV\",\"alpha3\":\"CPV\",\"region\":\"Africa\"},{\"name\":\"Cambodia\",\"alpha2\":\"KH\",\"alpha3\":\"KHM\",\"region\":\"Asia\"},{\"name\":\"Cameroon\",\"alpha2\":\"CM\",\"alpha3\":\"CMR\",\"region\":\"Africa\"},{\"name\":\"Canada\",\"alpha2\":\"CA\",\"alpha3\":\"CAN\",\"region\":\"Americas\"},{\"name\":\"Cayman Islands\",\"alpha2\":\"KY\",\"alpha3\":\"CYM\",\"region\":\"Americas\"},{\"name\":\"Central African Republic\",\"alpha2\":\"CF\",\"alpha3\":\"CAF\",\"region\":\"Africa\"},{\"name\":\"Chad\",\"alpha2\":\"TD\",\"alpha3\":\"TCD\",\"region\":\"Africa\"},{\"name\":\"Chile\",\"alpha2\":\"CL\",\"alpha3\":\"CHL\",\"region\":\"Americas\"},{\"name\":\"China\",\"alpha2\":\"CN\",\"alpha3\":\"CHN\",\"region\":\"Asia\"},{\"name\":\"Christmas Island\",\"alpha2\":\"CX\",\"alpha3\":\"CXR\",\"region\":\"Oceania\"},{\"name\":\"Cocos (Keeling) Islands\",\"alpha2\":\"CC\",\"alpha3\":\"CCK\",\"region\":\"Oceania\"},{\"name\":\"Colombia\",\"alpha2\":\"CO\",\"alpha3\":\"COL\",\"region\":\"Americas\"},{\"name\":\"Comoros\",\"alpha2\":\"KM\",\"alpha3\":\"COM\",\"region\":\"Africa\"},{\"name\":\"Congo\",\"alpha2\":\"CG\",\"alpha3\":\"COG\",\"region\":\"Africa\"},{\"name\":\"Congo, Democratic Republic of the\",\"alpha2\":\"CD\",\"alpha3\":\"COD\",\"region\":\"Africa\"},{\"name\":\"Cook Islands\",\"alpha2\":\"CK\",\"alpha3\":\"COK\",\"region\":\"Oceania\"},{\"name\":\"Costa Rica\",\"alpha2\":\"CR\",\"alpha3\":\"CRI\",\"region\":\"Americas\"},{\"name\":\"Croatia\",\"alpha2\":\"HR\",\"alpha3\":\"HRV\",\"region\":\"Europe\"},{\"name\":\"Cuba\",\"alpha2\":\"CU\",\"alpha3\":\"CUB\",\"region\":\"Americas\"},{\"name\":\"Curaçao\",\"alpha2\":\"CW\",\"alpha3\":\"CUW\",\"region\":\"Americas\"},{\"name\":\"Cyprus\",\"alpha2\":\"CY\",\"alpha3\":\"CYP\",\"region\":\"Asia\"},{\"name\":\"Czechia\",\"alpha2\":\"CZ\",\"alpha3\":\"CZE\",\"region\":\"Europe\"},{\"name\":\"Denmark\",\"alpha2\":\"DK\",\"alpha3\":\"DNK\",\"region\":\"Europe\"},{\"name\":\"Djibouti\",\"alpha2\":\"DJ\",\"alpha3\":\"DJI\",\"region\":\"Africa\"},{\"name\":\"Dominica\",\"alpha2\":\"DM\",\"alpha3\":\"DMA\",\"region\":\"Americas\"},{\"name\":\"Dominican Republic\",\"alpha2\":\"DO\",\"alpha3\":\"DOM\",\"region\":\"Americas\"},{\"name\":\"Ecuador\",\"alpha2\":\"EC\",\"alpha3\":\"ECU\",\"region\":\"Americas\"},{\"name\":\"Egypt\",\"alpha2\":\"EG\",\"alpha3\":\"EGY\",\"region\":\"Africa\"},{\"name\":\"El Salvador\",\"alpha2\":\"SV\",\"alpha3\":\"SLV\",\"region\":\"Americas\"},{\"name\":\"Equatorial Guinea\",\"alpha2\":\"GQ\",\"alpha3\":\"GNQ\",\"region\":\"Africa\"},{\"name\":\"Eritrea\",\"alpha2\":\"ER\",\"alpha3\":\"ERI\",\"region\":\"Africa\"},{\"name\":\"Estonia\",\"alpha2\":\"EE\",\"alpha3\":\"EST\",\"region\":\"Europe\"},{\"name\":\"Eswatini\",\"alpha2\":\"SZ\",\"alpha3\":\"SWZ\",\"region\":\"Africa\"},{\"name\":\"Ethiopia\",\"alpha2\":\"ET\",\"alpha3\":\"ETH\",\"region\":\"Africa\"},{\"name\":\"Falkland Islands (Malvinas)\",\"alpha2\":\"FK\",\"alpha3\":\"FLK\",\"region\":\"Americas\"},{\"name\":\"Faroe Islands\",\"alpha2\":\"FO\",\"alpha3\":\"FRO\",\"region\":\"Europe\"},{\"name\":\"Fiji\",\"alpha2\":\"FJ\",\"alpha3\":\"FJI\",\"region\":\"Oceania\"},{\"name\":\"Finland\",\"alpha2\":\"FI\",\"alpha3\":\"FIN\",\"region\":\"Europe\"},{\"name\":\"France\",\"alpha2\":\"FR\",\"alpha3\":\"FRA\",\"region\":\"Europe\"},{\"name\":\"French Guiana\",\"alpha2\":\"GF\",\"alpha3\":\"GUF\",\"region\":\"Americas\"},{\"name\":\"French Polynesia\",\"alpha2\":\"PF\",\"alpha3\":\"PYF\",\"region\":\"Oceania\"},{\"name\":\"French Southern Territories\",\"alpha2\":\"TF\",\"alpha3\":\"ATF\",\"region\":\"Africa\"},{\"name\":\"Gabon\",\"alpha2\":\"GA\",\"alpha3\":\"GAB\",\"region\":\"Africa\"},{\"name\":\"Gambia\",\"alpha2\":\"GM\",\"alpha3\":\"GMB\",\"region\":\"Africa\"},{\"name\":\"Georgia\",\"alpha2\":\"GE\",\"alpha3\":\"GEO\",\"region\":\"Asia\"},{\"name\":\"Germany\",\"alpha2\":\"DE\",\"alpha3\":\"DEU\",\"region\":\"Europe\"},{\"name\":\"Ghana\",\"alpha2\":\"GH\",\"alpha3\":\"GHA\",\"region\":\"Africa\"},{\"name\":\"Gibraltar\",\"alpha2\":\"GI\",\"alpha3\":\"GIB\",\"region\":\"Europe\"},{\"name\":\"Greece\",\"alpha2\":\"GR\",\"alpha3\":\"GRC\",\"region\":\"Europe\"},{\"name\":\"Greenland\",\"alpha2\":\"GL\",\"alpha3\":\"GRL\",\"region\":\"Americas\"},{\"name\":\"Grenada\",\"alpha2\":\"GD\",\"alpha3\":\"GRD\",\"region\":\"Americas\"},{\"name\":\"Guadeloupe\",\"alpha2\":\"GP\",\"alpha3\":\"GLP\",\"region\":\"Americas\"},{\"name\":\"Guam\",\"alpha2\":\"GU\",\"alpha3\":\"GUM\",\"region\":\"Oceania\"},{\"name\":\"Guatemala\",\"alpha2\":\"GT\",\"alpha3\":\"GTM\",\"region\":\"Americas\"},{\"name\":\"Guernsey\",\"alpha2\":\"GG\",\"alpha3\":\"GGY\",\"region\":\"Europe\"},{\"name\":\"Guinea\",\"alpha2\":\"GN\",\"alpha3\":\"GIN\",\"region\":\"Africa\"},{\"name\":\"Guinea-Bissau\",\"alpha2\":\"GW\",\"alpha3\":\"GNB\",\"region\":\"Africa\"},{\"name\":\"Guyana\",\"alpha2\":\"GY\",\"alpha3\":\"GUY\",\"region\":\"Americas\"},{\"name\":\"Haiti\",\"alpha2\":\"HT\",\"alpha3\":\"HTI\",\"region\":\"Americas\"},{\"name\":\"Heard Island and McDonald Islands\",\"alpha2\":\"HM\",\"alpha3\":\"HMD\",\"region\":\"Oceania\"},{\"name\":\"Holy See\",\"alpha2\":\"VA\",\"alpha3\":\"VAT\",\"region\":\"Europe\"},{\"name\":\"Honduras\",\"alpha2\":\"HN\",\"alpha3\":\"HND\",\"region\":\"Americas\"},{\"name\":\"Hong Kong\",\"alpha2\":\"HK\",\"alpha3\":\"HKG\",\"region\":\"Asia\"},{\"name\":\"Hungary\",\"alpha2\":\"HU\",\"alpha3\":\"HUN\",\"region\":\"Europe\"},{\"name\":\"Iceland\",\"alpha2\":\"IS\",\"alpha3\":\"ISL\",\"region\":\"Europe\"},{\"name\":\"India\",\"alpha2\":\"IN\",\"alpha3\":\"IND\",\"region\":\"Asia\"},{\"name\":\"Indonesia\",\"alpha2\":\"ID\",\"alpha3\":\"IDN\",\"region\":\"Asia\"},{\"name\":\"Iran (Islamic Republic of)\",\"alpha2\":\"IR\",\"alpha3\":\"IRN\",\"region\":\"Asia\"},{\"name\":\"Iraq\",\"alpha2\":\"IQ\",\"alpha3\":\"IRQ\",\"region\":\"Asia\"},{\"name\":\"Ireland\",\"alpha2\":\"IE\",\"alpha3\":\"IRL\",\"region\":\"Europe\"},{\"name\":\"Isle of Man\",\"alpha2\":\"IM\",\"alpha3\":\"IMN\",\"region\":\"Europe\"},{\"name\":\"Israel\",\"alpha2\":\"IL\",\"alpha3\":\"ISR\",\"region\":\"Asia\"},{\"name\":\"Italy\",\"alpha2\":\"IT\",\"alpha3\":\"ITA\",\"region\":\"Europe\"},{\"name\":\"Jamaica\",\"alpha2\":\"JM\",\"alpha3\":\"JAM\",\"region\":\"Americas\"},{\"name\":\"Japan\",\"alpha2\":\"JP\",\"alpha3\":\"JPN\",\"region\":\"Asia\"},{\"name\":\"Jersey\",\"alpha2\":\"JE\",\"alpha3\":\"JEY\",\"region\":\"Europe\"},{\"name\":\"Jordan\",\"alpha2\":\"JO\",\"alpha3\":\"JOR\",\"region\":\"Asia\"},{\"name\":\"Kazakhstan\",\"alpha2\":\"KZ\",\"alpha3\":\"KAZ\",\"region\":\"Asia\"},{\"name\":\"Kenya\",\"alpha2\":\"KE\",\"alpha3\":\"KEN\",\"region\":\"Africa\"},{\"name\":\"Kiribati\",\"alpha2\":\"KI\",\"alpha3\":\"KIR\",\"region\":\"Oceania\"},{\"name\":\"Korea, Republic of\",\"alpha2\":\"KR\",\"alpha3\":\"KOR\",\"region\":\"Asia\"},{\"name\":\"Kuwait\",\"alpha2\":\"KW\",\"alpha3\":\"KWT\",\"region\":\"Asia\"},{\"name\":\"Kyrgyzstan\",\"alpha2\":\"KG\",\"alpha3\":\"KGZ\",\"region\":\"Asia\"},{\"name\":\"Latvia\",\"alpha2\":\"LV\",\"alpha3\":\"LVA\",\"region\":\"Europe\"},{\"name\":\"Lebanon\",\"alpha2\":\"LB\",\"alpha3\":\"LBN\",\"region\":\"Asia\"},{\"name\":\"Lesotho\",\"alpha2\":\"LS\",\"alpha3\":\"LSO\",\"region\":\"Africa\"},{\"name\":\"Liberia\",\"alpha2\":\"LR\",\"alpha3\":\"LBR\",\"region\":\"Africa\"},{\"name\":\"Libya\",\"alpha2\":\"LY\",\"alpha3\":\"LBY\",\"region\":\"Africa\"},{\"name\":\"Liechtenstein\",\"alpha2\":\"LI\",\"alpha3\":\"LIE\",\"region\":\"Europe\"},{\"name\":\"Lithuania\",\"alpha2\":\"LT\",\"alpha3\":\"LTU\",\"region\":\"Europe\"},{\"name\":\"Luxembourg\",\"alpha2\":\"LU\",\"alpha3\":\"LUX\",\"region\":\"Europe\"},{\"name\":\"Macao\",\"alpha2\":\"MO\",\"alpha3\":\"MAC\",\"region\":\"Asia\"},{\"name\":\"Madagascar\",\"alpha2\":\"MG\",\"alpha3\":\"MDG\",\"region\":\"Africa\"},{\"name\":\"Malawi\",\"alpha2\":\"MW\",\"alpha3\":\"MWI\",\"region\":\"Africa\"},{\"name\":\"Malaysia\",\"alpha2\":\"MY\",\"alpha3\":\"MYS\",\"region\":\"Asia\"},{\"name\":\"Maldives\",\"alpha2\":\"MV\",\"alpha3\":\"MDV\",\"region\":\"Asia\"},{\"name\":\"Mali\",\"alpha2\":\"ML\",\"alpha3\":\"MLI\",\"region\":\"Africa\"},{\"name\":\"Malta\",\"alpha2\":\"MT\",\"alpha3\":\"MLT\",\"region\":\"Europe\"},{\"name\":\"Marshall Islands\",\"alpha2\":\"MH\",\"alpha3\":\"MHL\",\"region\":\"Oceania\"},{\"name\":\"Martinique\",\"alpha2\":\"MQ\",\"alpha3\":\"MTQ\",\"region\":\"Americas\"},{\"name\":\"Mauritania\",\"alpha2\":\"MR\",\"alpha3\":\"MRT\",\"region\":\"Africa\"},{\"name\":\"Mauritius\",\"alpha2\":\"MU\",\"alpha3\":\"MUS\",\"region\":\"Africa\"},{\"name\":\"Mayotte\",\"alpha2\":\"YT\",\"alpha3\":\"MYT\",\"region\":\"Africa\"},{\"name\":\"Mexico\",\"alpha2\":\"MX\",\"alpha3\":\"MEX\",\"region\":\"Americas\"},{\"name\":\"Micronesia (Federated States of)\",\"alpha2\":\"FM\",\"alpha3\":\"FSM\",\"region\":\"Oceania\"},{\"name\":\"Moldova, Republic of\",\"alpha2\":\"MD\",\"alpha3\":\"MDA\",\"region\":\"Europe\"},{\"name\":\"Monaco\",\"alpha2\":\"MC\",\"alpha3\":\"MCO\",\"region\":\"Europe\"},{\"name\":\"Mongolia\",\"alpha2\":\"MN\",\"alpha3\":\"MNG\",\"region\":\"Asia\"},{\"name\":\"Montenegro\",\"alpha2\":\"ME\",\"alpha3\":\"MNE\",\"region\":\"Europe\"},{\"name\":\"Montserrat\",\"alpha2\":\"MS\",\"alpha3\":\"MSR\",\"region\":\"Americas\"},{\"name\":\"Morocco\",\"alpha2\":\"MA\",\"alpha3\":\"MAR\",\"region\":\"Africa\"},{\"name\":\"Mozambique\",\"alpha2\":\"MZ\",\"alpha3\":\"MOZ\",\"region\":\"Africa\"},{\"name\":\"Myanmar\",\"alpha2\":\"MM\",\"alpha3\":\"MMR\",\"region\":\"Asia\"},{\"name\":\"Namibia\",\"alpha2\":\"NA\",\"alpha3\":\"NAM\",\"region\":\"Africa\"},{\"name\":\"Nauru\",\"alpha2\":\"NR\",\"alpha3\":\"NRU\",\"region\":\"Oceania\"},{\"name\":\"Nepal\",\"alpha2\":\"NP\",\"alpha3\":\"NPL\",\"region\":\"Asia\"},{\"name\":\"Netherlands\",\"alpha2\":\"NL\",\"alpha3\":\"NLD\",\"region\":\"Europe\"},{\"name\":\"New Caledonia\",\"alpha2\":\"NC\",\"alpha3\":\"NCL\",\"region\":\"Oceania\"},{\"name\":\"New Zealand\",\"alpha2\":\"NZ\",\"alpha3\":\"NZL\",\"region\":\"Oceania\"},{\"name\":\"Nicaragua\",\"alpha2\":\"NI\",\"alpha3\":\"NIC\",\"region\":\"Americas\"},{\"name\":\"Niger\",\"alpha2\":\"NE\",\"alpha3\":\"NER\",\"region\":\"Africa\"},{\"name\":\"Nigeria\",\"alpha2\":\"NG\",\"alpha3\":\"NGA\",\"region\":\"Africa\"},{\"name\":\"Niue\",\"alpha2\":\"NU\",\"alpha3\":\"NIU\",\"region\":\"Oceania\"},{\"name\":\"Norfolk Island\",\"alpha2\":\"NF\",\"alpha3\":\"NFK\",\"region\":\"Oceania\"},{\"name\":\"North Macedonia\",\"alpha2\":\"MK\",\"alpha3\":\"MKD\",\"region\":\"Europe\"},{\"name\":\"Northern Mariana Islands\",\"alpha2\":\"MP\",\"alpha3\":\"MNP\",\"region\":\"Oceania\"},{\"name\":\"Norway\",\"alpha2\":\"NO\",\"alpha3\":\"NOR\",\"region\":\"Europe\"},{\"name\":\"Oman\",\"alpha2\":\"OM\",\"alpha3\":\"OMN\",\"region\":\"Asia\"},{\"name\":\"Pakistan\",\"alpha2\":\"PK\",\"alpha3\":\"PAK\",\"region\":\"Asia\"},{\"name\":\"Palau\",\"alpha2\":\"PW\",\"alpha3\":\"PLW\",\"region\":\"Oceania\"},{\"name\":\"Palestine, State of\",\"alpha2\":\"PS\",\"alpha3\":\"PSE\",\"region\":\"Asia\"},{\"name\":\"Panama\",\"alpha2\":\"PA\",\"alpha3\":\"PAN\",\"region\":\"Americas\"},{\"name\":\"Papua New Guinea\",\"alpha2\":\"PG\",\"alpha3\":\"PNG\",\"region\":\"Oceania\"},{\"name\":\"Paraguay\",\"alpha2\":\"PY\",\"alpha3\":\"PRY\",\"region\":\"Americas\"},{\"name\":\"Peru\",\"alpha2\":\"PE\",\"alpha3\":\"PER\",\"region\":\"Americas\"},{\"name\":\"Philippines\",\"alpha2\":\"PH\",\"alpha3\":\"PHL\",\"region\":\"Asia\"},{\"name\":\"Pitcairn\",\"alpha2\":\"PN\",\"alpha3\":\"PCN\",\"region\":\"Oceania\"},{\"name\":\"Poland\",\"alpha2\":\"PL\",\"alpha3\":\"POL\",\"region\":\"Europe\"},{\"name\":\"Portugal\",\"alpha2\":\"PT\",\"alpha3\":\"PRT\",\"region\":\"Europe\"},{\"name\":\"Puerto Rico\",\"alpha2\":\"PR\",\"alpha3\":\"PRI\",\"region\":\"Americas\"},{\"name\":\"Qatar\",\"alpha2\":\"QA\",\"alpha3\":\"QAT\",\"region\":\"Asia\"},{\"name\":\"Réunion\",\"alpha2\":\"RE\",\"alpha3\":\"REU\",\"region\":\"Africa\"},{\"name\":\"Romania\",\"alpha2\":\"RO\",\"alpha3\":\"ROU\",\"region\":\"Europe\"},{\"name\":\"Russian Federation\",\"alpha2\":\"RU\",\"alpha3\":\"RUS\",\"region\":\"Europe\"},{\"name\":\"Rwanda\",\"alpha2\":\"RW\",\"alpha3\":\"RWA\",\"region\":\"Africa\"},{\"name\":\"Saint Barthélemy\",\"alpha2\":\"BL\",\"alpha3\":\"BLM\",\"region\":\"Americas\"},{\"name\":\"Saint Helena, Ascension and Tristan da Cunha\",\"alpha2\":\"SH\",\"alpha3\":\"SHN\",\"region\":\"Africa\"},{\"name\":\"Saint Kitts and Nevis\",\"alpha2\":\"KN\",\"alpha3\":\"KNA\",\"region\":\"Americas\"},{\"name\":\"Saint Lucia\",\"alpha2\":\"LC\",\"alpha3\":\"LCA\",\"region\":\"Americas\"},{\"name\":\"Saint Martin (French part)\",\"alpha2\":\"MF\",\"alpha3\":\"MAF\",\"region\":\"Americas\"},{\"name\":\"Saint Pierre and Miquelon\",\"alpha2\":\"PM\",\"alpha3\":\"SPM\",\"region\":\"Americas\"},{\"name\":\"Saint Vincent and the Grenadines\",\"alpha2\":\"VC\",\"alpha3\":\"VCT\",\"region\":\"Americas\"},{\"name\":\"Samoa\",\"alpha2\":\"WS\",\"alpha3\":\"WSM\",\"region\":\"Oceania\"},{\"name\":\"San Marino\",\"alpha2\":\"SM\",\"alpha3\":\"SMR\",\"region\":\"Europe\"},{\"name\":\"Sao Tome and Principe\",\"alpha2\":\"ST\",\"alpha3\":\"STP\",\"region\":\"Africa\"},{\"name\":\"Saudi Arabia\",\"alpha2\":\"SA\",\"alpha3\":\"SAU\",\"region\":\"Asia\"},{\"name\":\"Senegal\",\"alpha2\":\"SN\",\"alpha3\":\"SEN\",\"region\":\"Africa\"},{\"name\":\"Serbia\",\"alpha2\":\"RS\",\"alpha3\":\"SRB\",\"region\":\"Europe\"},{\"name\":\"Seychelles\",\"alpha2\":\"SC\",\"alpha3\":\"SYC\",\"region\":\"Africa\"},{\"name\":\"Sierra Leone\",\"alpha2\":\"SL\",\"alpha3\":\"SLE\",\"region\":\"Africa\"},{\"name\":\"Singapore\",\"alpha2\":\"SG\",\"alpha3\":\"SGP\",\"region\":\"Asia\"},{\"name\":\"Sint Maarten (Dutch part)\",\"alpha2\":\"SX\",\"alpha3\":\"SXM\",\"region\":\"Americas\"},{\"name\":\"Slovakia\",\"alpha2\":\"SK\",\"alpha3\":\"SVK\",\"region\":\"Europe\"},{\"name\":\"Slovenia\",\"alpha2\":\"SI\",\"alpha3\":\"SVN\",\"region\":\"Europe\"},{\"name\":\"Solomon Islands\",\"alpha2\":\"SB\",\"alpha3\":\"SLB\",\"region\":\"Oceania\"},{\"name\":\"Somalia\",\"alpha2\":\"SO\",\"alpha3\":\"SOM\",\"region\":\"Africa\"},{\"name\":\"South Africa\",\"alpha2\":\"ZA\",\"alpha3\":\"ZAF\",\"region\":\"Africa\"},{\"name\":\"South Georgia and the South Sandwich Islands\",\"alpha2\":\"GS\",\"alpha3\":\"SGS\",\"region\":\"Americas\"},{\"name\":\"South Sudan\",\"alpha2\":\"SS\",\"alpha3\":\"SSD\",\"region\":\"Africa\"},{\"name\":\"Spain\",\"alpha2\":\"ES\",\"alpha3\":\"ESP\",\"region\":\"Europe\"},{\"name\":\"Sri Lanka\",\"alpha2\":\"LK\",\"alpha3\":\"LKA\",\"region\":\"Asia\"},{\"name\":\"Sudan\",\"alpha2\":\"SD\",\"alpha3\":\"SDN\",\"region\":\"Africa\"},{\"name\":\"Suriname\",\"alpha2\":\"SR\",\"alpha3\":\"SUR\",\"region\":\"Americas\"},{\"name\":\"Svalbard and Jan Mayen\",\"alpha2\":\"SJ\",\"alpha3\":\"SJM\",\"region\":\"Europe\"},{\"name\":\"Sweden\",\"alpha2\":\"SE\",\"alpha3\":\"SWE\",\"region\":\"Europe\"},{\"name\":\"Switzerland\",\"alpha2\":\"CH\",\"alpha3\":\"CHE\",\"region\":\"Europe\"},{\"name\":\"Syrian Arab Republic\",\"alpha2\":\"SY\",\"alpha3\":\"SYR\",\"region\":\"Asia\"},{\"name\":\"Taiwan, Province of China\",\"alpha2\":\"TW\",\"alpha3\":\"TWN\",\"region\":\"Asia\"},{\"name\":\"Tajikistan\",\"alpha2\":\"TJ\",\"alpha3\":\"TJK\",\"region\":\"Asia\"},{\"name\":\"Tanzania, United Republic of\",\"alpha2\":\"TZ\",\"alpha3\":\"TZA\",\"region\":\"Africa\"},{\"name\":\"Thailand\",\"alpha2\":\"TH\",\"alpha3\":\"THA\",\"region\":\"Asia\"},{\"name\":\"Timor-Leste\",\"alpha2\":\"TL\",\"alpha3\":\"TLS\",\"region\":\"Asia\"},{\"name\":\"Togo\",\"alpha2\":\"TG\",\"alpha3\":\"TGO\",\"region\":\"Africa\"},{\"name\":\"Tokelau\",\"alpha2\":\"TK\",\"alpha3\":\"TKL\",\"region\":\"Oceania\"},{\"name\":\"Tonga\",\"alpha2\":\"TO\",\"alpha3\":\"TON\",\"region\":\"Oceania\"},{\"name\":\"Trinidad and Tobago\",\"alpha2\":\"TT\",\"alpha3\":\"TTO\",\"region\":\"Americas\"},{\"name\":\"Tunisia\",\"alpha2\":\"TN\",\"alpha3\":\"TUN\",\"region\":\"Africa\"},{\"name\":\"Turkey\",\"alpha2\":\"TR\",\"alpha3\":\"TUR\",\"region\":\"Asia\"},{\"name\":\"Turkmenistan\",\"alpha2\":\"TM\",\"alpha3\":\"TKM\",\"region\":\"Asia\"},{\"name\":\"Turks and Caicos Islands\",\"alpha2\":\"TC\",\"alpha3\":\"TCA\",\"region\":\"Americas\"},{\"name\":\"Tuvalu\",\"alpha2\":\"TV\",\"alpha3\":\"TUV\",\"region\":\"Oceania\"},{\"name\":\"Uganda\",\"alpha2\":\"UG\",\"alpha3\":\"UGA\",\"region\":\"Africa\"},{\"name\":\"Ukraine\",\"alpha2\":\"UA\",\"alpha3\":\"UKR\",\"region\":\"Europe\"},{\"name\":\"United Arab Emirates\",\"alpha2\":\"AE\",\"alpha3\":\"ARE\",\"region\":\"Asia\"},{\"name\":\"United Kingdom of Great Britain and Northern Ireland\",\"alpha2\":\"GB\",\"alpha3\":\"GBR\",\"region\":\"Europe\"},{\"name\":\"United States of America\",\"alpha2\":\"US\",\"alpha3\":\"USA\",\"region\":\"Americas\"},{\"name\":\"United States Minor Outlying Islands\",\"alpha2\":\"UM\",\"alpha3\":\"UMI\",\"region\":\"Oceania\"},{\"name\":\"Uruguay\",\"alpha2\":\"UY\",\"alpha3\":\"URY\",\"region\":\"Americas\"},{\"name\":\"Uzbekistan\",\"alpha2\":\"UZ\",\"alpha3\":\"UZB\",\"region\":\"Asia\"},{\"name\":\"Vanuatu\",\"alpha2\":\"VU\",\"alpha3\":\"VUT\",\"region\":\"Oceania\"},{\"name\":\"Venezuela (Bolivarian Republic of)\",\"alpha2\":\"VE\",\"alpha3\":\"VEN\",\"region\":\"Americas\"},{\"name\":\"Viet Nam\",\"alpha2\":\"VN\",\"alpha3\":\"VNM\",\"region\":\"Asia\"},{\"name\":\"Virgin Islands (British)\",\"alpha2\":\"VG\",\"alpha3\":\"VGB\",\"region\":\"Americas\"},{\"name\":\"Virgin Islands (U.S.)\",\"alpha2\":\"VI\",\"alpha3\":\"VIR\",\"region\":\"Americas\"},{\"name\":\"Wallis and Futuna\",\"alpha2\":\"WF\",\"alpha3\":\"WLF\",\"region\":\"Oceania\"},{\"name\":\"Western Sahara\",\"alpha2\":\"EH\",\"alpha3\":\"ESH\",\"region\":\"Africa\"},{\"name\":\"Yemen\",\"alpha2\":\"YE\",\"alpha3\":\"YEM\",\"region\":\"Asia\"},{\"name\":\"Zambia\",\"alpha2\":\"ZM\",\"alpha3\":\"ZMB\",\"region\":\"Africa\"},{\"name\":\"Zimbabwe\",\"alpha2\":\"ZW\",\"alpha3\":\"ZWE\",\"region\":\"Africa\"},{\"name\":\"Byteland PROD\",\"alpha2\":\"YY\",\"alpha3\":\"YYY\",\"region\":\"Europe\"}];", + "", + "pm.test(`List all countries`, function () {", + " var url = pm.variables.get(\"base_url\") + `/countries`;", + "", + " pm.sendRequest(url, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " const expected = countries.sort(function(a, b) {", + " var x = a.alpha2; var y = b.alpha2;", + " return ((x < y) ? -1 : ((x > y) ? 1 : 0));", + " });", + "", + " console.log(\"got\", resp);", + " pm.expect(resp).to.have.lengthOf(expected.length, `Invalid response array length`);", + "", + " pm.test('Validate if the returned list is sorted by alpha2 code (openapi.yml line #56)', () => {", + " for (var i = 0; i < expected.length; i++) {", + " pm.expect(resp[i].alpha2).to.be.eq(expected[i].alpha2, `Invalid alpha2 code of country #${i}`);", + " pm.expect(resp[i].alpha3).to.be.eq(expected[i].alpha3, `Invalid alpha3 code of country #${i}`);", + " pm.expect(resp[i].name).to.be.eq(expected[i].name, `Invalid name of country #${i}`);", + " }", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/countries", + "host": [ + "{{base_url}}" + ], + "path": [ + "countries" + ] + } + }, + "response": [] + }, + { + "name": "List countries by regions", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"array\",", + " \"items\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о стране из стандарта ISO 3166\",", + " \"properties\": {", + " \"name\": {", + " \"type\": \"string\",", + " \"description\": \"Полное название страны\",", + " \"maxLength\": 100", + " },", + " \"alpha2\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"alpha3\": {", + " \"type\": \"string\",", + " \"description\": \"Трехбуквенный код страны\",", + " \"maxLength\": 3,", + " \"pattern\": \"[a-zA-Z]{3}\"", + " },", + " \"region\": {", + " \"type\": \"string\",", + " \"description\": \"Географический регион, к которому относится страна\",", + " \"enum\": [", + " \"Europe\",", + " \"Africa\",", + " \"Americas\",", + " \"Oceania\",", + " \"Asia\"", + " ]", + " }", + " },", + " \"required\": [", + " \"name\",", + " \"alpha2\",", + " \"alpha3\"", + " ]", + " },", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "const countries = [{\"name\":\"Afghanistan\",\"alpha2\":\"AF\",\"alpha3\":\"AFG\",\"region\":\"Asia\"},{\"name\":\"Åland Islands\",\"alpha2\":\"AX\",\"alpha3\":\"ALA\",\"region\":\"Europe\"},{\"name\":\"Albania\",\"alpha2\":\"AL\",\"alpha3\":\"ALB\",\"region\":\"Europe\"},{\"name\":\"Algeria\",\"alpha2\":\"DZ\",\"alpha3\":\"DZA\",\"region\":\"Africa\"},{\"name\":\"American Samoa\",\"alpha2\":\"AS\",\"alpha3\":\"ASM\",\"region\":\"Oceania\"},{\"name\":\"Andorra\",\"alpha2\":\"AD\",\"alpha3\":\"AND\",\"region\":\"Europe\"},{\"name\":\"Angola\",\"alpha2\":\"AO\",\"alpha3\":\"AGO\",\"region\":\"Africa\"},{\"name\":\"Anguilla\",\"alpha2\":\"AI\",\"alpha3\":\"AIA\",\"region\":\"Americas\"},{\"name\":\"Antigua and Barbuda\",\"alpha2\":\"AG\",\"alpha3\":\"ATG\",\"region\":\"Americas\"},{\"name\":\"Argentina\",\"alpha2\":\"AR\",\"alpha3\":\"ARG\",\"region\":\"Americas\"},{\"name\":\"Armenia\",\"alpha2\":\"AM\",\"alpha3\":\"ARM\",\"region\":\"Asia\"},{\"name\":\"Aruba\",\"alpha2\":\"AW\",\"alpha3\":\"ABW\",\"region\":\"Americas\"},{\"name\":\"Australia\",\"alpha2\":\"AU\",\"alpha3\":\"AUS\",\"region\":\"Oceania\"},{\"name\":\"Austria\",\"alpha2\":\"AT\",\"alpha3\":\"AUT\",\"region\":\"Europe\"},{\"name\":\"Azerbaijan\",\"alpha2\":\"AZ\",\"alpha3\":\"AZE\",\"region\":\"Asia\"},{\"name\":\"Bahamas\",\"alpha2\":\"BS\",\"alpha3\":\"BHS\",\"region\":\"Americas\"},{\"name\":\"Bahrain\",\"alpha2\":\"BH\",\"alpha3\":\"BHR\",\"region\":\"Asia\"},{\"name\":\"Bangladesh\",\"alpha2\":\"BD\",\"alpha3\":\"BGD\",\"region\":\"Asia\"},{\"name\":\"Barbados\",\"alpha2\":\"BB\",\"alpha3\":\"BRB\",\"region\":\"Americas\"},{\"name\":\"Belarus\",\"alpha2\":\"BY\",\"alpha3\":\"BLR\",\"region\":\"Europe\"},{\"name\":\"Belgium\",\"alpha2\":\"BE\",\"alpha3\":\"BEL\",\"region\":\"Europe\"},{\"name\":\"Belize\",\"alpha2\":\"BZ\",\"alpha3\":\"BLZ\",\"region\":\"Americas\"},{\"name\":\"Benin\",\"alpha2\":\"BJ\",\"alpha3\":\"BEN\",\"region\":\"Africa\"},{\"name\":\"Bermuda\",\"alpha2\":\"BM\",\"alpha3\":\"BMU\",\"region\":\"Americas\"},{\"name\":\"Bhutan\",\"alpha2\":\"BT\",\"alpha3\":\"BTN\",\"region\":\"Asia\"},{\"name\":\"Bolivia (Plurinational State of)\",\"alpha2\":\"BO\",\"alpha3\":\"BOL\",\"region\":\"Americas\"},{\"name\":\"Bonaire, Sint Eustatius and Saba\",\"alpha2\":\"BQ\",\"alpha3\":\"BES\",\"region\":\"Americas\"},{\"name\":\"Bosnia and Herzegovina\",\"alpha2\":\"BA\",\"alpha3\":\"BIH\",\"region\":\"Europe\"},{\"name\":\"Botswana\",\"alpha2\":\"BW\",\"alpha3\":\"BWA\",\"region\":\"Africa\"},{\"name\":\"Bouvet Island\",\"alpha2\":\"BV\",\"alpha3\":\"BVT\",\"region\":\"Americas\"},{\"name\":\"Brazil\",\"alpha2\":\"BR\",\"alpha3\":\"BRA\",\"region\":\"Americas\"},{\"name\":\"British Indian Ocean Territory\",\"alpha2\":\"IO\",\"alpha3\":\"IOT\",\"region\":\"Africa\"},{\"name\":\"Brunei Darussalam\",\"alpha2\":\"BN\",\"alpha3\":\"BRN\",\"region\":\"Asia\"},{\"name\":\"Bulgaria\",\"alpha2\":\"BG\",\"alpha3\":\"BGR\",\"region\":\"Europe\"},{\"name\":\"Burkina Faso\",\"alpha2\":\"BF\",\"alpha3\":\"BFA\",\"region\":\"Africa\"},{\"name\":\"Burundi\",\"alpha2\":\"BI\",\"alpha3\":\"BDI\",\"region\":\"Africa\"},{\"name\":\"Cabo Verde\",\"alpha2\":\"CV\",\"alpha3\":\"CPV\",\"region\":\"Africa\"},{\"name\":\"Cambodia\",\"alpha2\":\"KH\",\"alpha3\":\"KHM\",\"region\":\"Asia\"},{\"name\":\"Cameroon\",\"alpha2\":\"CM\",\"alpha3\":\"CMR\",\"region\":\"Africa\"},{\"name\":\"Canada\",\"alpha2\":\"CA\",\"alpha3\":\"CAN\",\"region\":\"Americas\"},{\"name\":\"Cayman Islands\",\"alpha2\":\"KY\",\"alpha3\":\"CYM\",\"region\":\"Americas\"},{\"name\":\"Central African Republic\",\"alpha2\":\"CF\",\"alpha3\":\"CAF\",\"region\":\"Africa\"},{\"name\":\"Chad\",\"alpha2\":\"TD\",\"alpha3\":\"TCD\",\"region\":\"Africa\"},{\"name\":\"Chile\",\"alpha2\":\"CL\",\"alpha3\":\"CHL\",\"region\":\"Americas\"},{\"name\":\"China\",\"alpha2\":\"CN\",\"alpha3\":\"CHN\",\"region\":\"Asia\"},{\"name\":\"Christmas Island\",\"alpha2\":\"CX\",\"alpha3\":\"CXR\",\"region\":\"Oceania\"},{\"name\":\"Cocos (Keeling) Islands\",\"alpha2\":\"CC\",\"alpha3\":\"CCK\",\"region\":\"Oceania\"},{\"name\":\"Colombia\",\"alpha2\":\"CO\",\"alpha3\":\"COL\",\"region\":\"Americas\"},{\"name\":\"Comoros\",\"alpha2\":\"KM\",\"alpha3\":\"COM\",\"region\":\"Africa\"},{\"name\":\"Congo\",\"alpha2\":\"CG\",\"alpha3\":\"COG\",\"region\":\"Africa\"},{\"name\":\"Congo, Democratic Republic of the\",\"alpha2\":\"CD\",\"alpha3\":\"COD\",\"region\":\"Africa\"},{\"name\":\"Cook Islands\",\"alpha2\":\"CK\",\"alpha3\":\"COK\",\"region\":\"Oceania\"},{\"name\":\"Costa Rica\",\"alpha2\":\"CR\",\"alpha3\":\"CRI\",\"region\":\"Americas\"},{\"name\":\"Croatia\",\"alpha2\":\"HR\",\"alpha3\":\"HRV\",\"region\":\"Europe\"},{\"name\":\"Cuba\",\"alpha2\":\"CU\",\"alpha3\":\"CUB\",\"region\":\"Americas\"},{\"name\":\"Curaçao\",\"alpha2\":\"CW\",\"alpha3\":\"CUW\",\"region\":\"Americas\"},{\"name\":\"Cyprus\",\"alpha2\":\"CY\",\"alpha3\":\"CYP\",\"region\":\"Asia\"},{\"name\":\"Czechia\",\"alpha2\":\"CZ\",\"alpha3\":\"CZE\",\"region\":\"Europe\"},{\"name\":\"Denmark\",\"alpha2\":\"DK\",\"alpha3\":\"DNK\",\"region\":\"Europe\"},{\"name\":\"Djibouti\",\"alpha2\":\"DJ\",\"alpha3\":\"DJI\",\"region\":\"Africa\"},{\"name\":\"Dominica\",\"alpha2\":\"DM\",\"alpha3\":\"DMA\",\"region\":\"Americas\"},{\"name\":\"Dominican Republic\",\"alpha2\":\"DO\",\"alpha3\":\"DOM\",\"region\":\"Americas\"},{\"name\":\"Ecuador\",\"alpha2\":\"EC\",\"alpha3\":\"ECU\",\"region\":\"Americas\"},{\"name\":\"Egypt\",\"alpha2\":\"EG\",\"alpha3\":\"EGY\",\"region\":\"Africa\"},{\"name\":\"El Salvador\",\"alpha2\":\"SV\",\"alpha3\":\"SLV\",\"region\":\"Americas\"},{\"name\":\"Equatorial Guinea\",\"alpha2\":\"GQ\",\"alpha3\":\"GNQ\",\"region\":\"Africa\"},{\"name\":\"Eritrea\",\"alpha2\":\"ER\",\"alpha3\":\"ERI\",\"region\":\"Africa\"},{\"name\":\"Estonia\",\"alpha2\":\"EE\",\"alpha3\":\"EST\",\"region\":\"Europe\"},{\"name\":\"Eswatini\",\"alpha2\":\"SZ\",\"alpha3\":\"SWZ\",\"region\":\"Africa\"},{\"name\":\"Ethiopia\",\"alpha2\":\"ET\",\"alpha3\":\"ETH\",\"region\":\"Africa\"},{\"name\":\"Falkland Islands (Malvinas)\",\"alpha2\":\"FK\",\"alpha3\":\"FLK\",\"region\":\"Americas\"},{\"name\":\"Faroe Islands\",\"alpha2\":\"FO\",\"alpha3\":\"FRO\",\"region\":\"Europe\"},{\"name\":\"Fiji\",\"alpha2\":\"FJ\",\"alpha3\":\"FJI\",\"region\":\"Oceania\"},{\"name\":\"Finland\",\"alpha2\":\"FI\",\"alpha3\":\"FIN\",\"region\":\"Europe\"},{\"name\":\"France\",\"alpha2\":\"FR\",\"alpha3\":\"FRA\",\"region\":\"Europe\"},{\"name\":\"French Guiana\",\"alpha2\":\"GF\",\"alpha3\":\"GUF\",\"region\":\"Americas\"},{\"name\":\"French Polynesia\",\"alpha2\":\"PF\",\"alpha3\":\"PYF\",\"region\":\"Oceania\"},{\"name\":\"French Southern Territories\",\"alpha2\":\"TF\",\"alpha3\":\"ATF\",\"region\":\"Africa\"},{\"name\":\"Gabon\",\"alpha2\":\"GA\",\"alpha3\":\"GAB\",\"region\":\"Africa\"},{\"name\":\"Gambia\",\"alpha2\":\"GM\",\"alpha3\":\"GMB\",\"region\":\"Africa\"},{\"name\":\"Georgia\",\"alpha2\":\"GE\",\"alpha3\":\"GEO\",\"region\":\"Asia\"},{\"name\":\"Germany\",\"alpha2\":\"DE\",\"alpha3\":\"DEU\",\"region\":\"Europe\"},{\"name\":\"Ghana\",\"alpha2\":\"GH\",\"alpha3\":\"GHA\",\"region\":\"Africa\"},{\"name\":\"Gibraltar\",\"alpha2\":\"GI\",\"alpha3\":\"GIB\",\"region\":\"Europe\"},{\"name\":\"Greece\",\"alpha2\":\"GR\",\"alpha3\":\"GRC\",\"region\":\"Europe\"},{\"name\":\"Greenland\",\"alpha2\":\"GL\",\"alpha3\":\"GRL\",\"region\":\"Americas\"},{\"name\":\"Grenada\",\"alpha2\":\"GD\",\"alpha3\":\"GRD\",\"region\":\"Americas\"},{\"name\":\"Guadeloupe\",\"alpha2\":\"GP\",\"alpha3\":\"GLP\",\"region\":\"Americas\"},{\"name\":\"Guam\",\"alpha2\":\"GU\",\"alpha3\":\"GUM\",\"region\":\"Oceania\"},{\"name\":\"Guatemala\",\"alpha2\":\"GT\",\"alpha3\":\"GTM\",\"region\":\"Americas\"},{\"name\":\"Guernsey\",\"alpha2\":\"GG\",\"alpha3\":\"GGY\",\"region\":\"Europe\"},{\"name\":\"Guinea\",\"alpha2\":\"GN\",\"alpha3\":\"GIN\",\"region\":\"Africa\"},{\"name\":\"Guinea-Bissau\",\"alpha2\":\"GW\",\"alpha3\":\"GNB\",\"region\":\"Africa\"},{\"name\":\"Guyana\",\"alpha2\":\"GY\",\"alpha3\":\"GUY\",\"region\":\"Americas\"},{\"name\":\"Haiti\",\"alpha2\":\"HT\",\"alpha3\":\"HTI\",\"region\":\"Americas\"},{\"name\":\"Heard Island and McDonald Islands\",\"alpha2\":\"HM\",\"alpha3\":\"HMD\",\"region\":\"Oceania\"},{\"name\":\"Holy See\",\"alpha2\":\"VA\",\"alpha3\":\"VAT\",\"region\":\"Europe\"},{\"name\":\"Honduras\",\"alpha2\":\"HN\",\"alpha3\":\"HND\",\"region\":\"Americas\"},{\"name\":\"Hong Kong\",\"alpha2\":\"HK\",\"alpha3\":\"HKG\",\"region\":\"Asia\"},{\"name\":\"Hungary\",\"alpha2\":\"HU\",\"alpha3\":\"HUN\",\"region\":\"Europe\"},{\"name\":\"Iceland\",\"alpha2\":\"IS\",\"alpha3\":\"ISL\",\"region\":\"Europe\"},{\"name\":\"India\",\"alpha2\":\"IN\",\"alpha3\":\"IND\",\"region\":\"Asia\"},{\"name\":\"Indonesia\",\"alpha2\":\"ID\",\"alpha3\":\"IDN\",\"region\":\"Asia\"},{\"name\":\"Iran (Islamic Republic of)\",\"alpha2\":\"IR\",\"alpha3\":\"IRN\",\"region\":\"Asia\"},{\"name\":\"Iraq\",\"alpha2\":\"IQ\",\"alpha3\":\"IRQ\",\"region\":\"Asia\"},{\"name\":\"Ireland\",\"alpha2\":\"IE\",\"alpha3\":\"IRL\",\"region\":\"Europe\"},{\"name\":\"Isle of Man\",\"alpha2\":\"IM\",\"alpha3\":\"IMN\",\"region\":\"Europe\"},{\"name\":\"Israel\",\"alpha2\":\"IL\",\"alpha3\":\"ISR\",\"region\":\"Asia\"},{\"name\":\"Italy\",\"alpha2\":\"IT\",\"alpha3\":\"ITA\",\"region\":\"Europe\"},{\"name\":\"Jamaica\",\"alpha2\":\"JM\",\"alpha3\":\"JAM\",\"region\":\"Americas\"},{\"name\":\"Japan\",\"alpha2\":\"JP\",\"alpha3\":\"JPN\",\"region\":\"Asia\"},{\"name\":\"Jersey\",\"alpha2\":\"JE\",\"alpha3\":\"JEY\",\"region\":\"Europe\"},{\"name\":\"Jordan\",\"alpha2\":\"JO\",\"alpha3\":\"JOR\",\"region\":\"Asia\"},{\"name\":\"Kazakhstan\",\"alpha2\":\"KZ\",\"alpha3\":\"KAZ\",\"region\":\"Asia\"},{\"name\":\"Kenya\",\"alpha2\":\"KE\",\"alpha3\":\"KEN\",\"region\":\"Africa\"},{\"name\":\"Kiribati\",\"alpha2\":\"KI\",\"alpha3\":\"KIR\",\"region\":\"Oceania\"},{\"name\":\"Korea, Republic of\",\"alpha2\":\"KR\",\"alpha3\":\"KOR\",\"region\":\"Asia\"},{\"name\":\"Kuwait\",\"alpha2\":\"KW\",\"alpha3\":\"KWT\",\"region\":\"Asia\"},{\"name\":\"Kyrgyzstan\",\"alpha2\":\"KG\",\"alpha3\":\"KGZ\",\"region\":\"Asia\"},{\"name\":\"Latvia\",\"alpha2\":\"LV\",\"alpha3\":\"LVA\",\"region\":\"Europe\"},{\"name\":\"Lebanon\",\"alpha2\":\"LB\",\"alpha3\":\"LBN\",\"region\":\"Asia\"},{\"name\":\"Lesotho\",\"alpha2\":\"LS\",\"alpha3\":\"LSO\",\"region\":\"Africa\"},{\"name\":\"Liberia\",\"alpha2\":\"LR\",\"alpha3\":\"LBR\",\"region\":\"Africa\"},{\"name\":\"Libya\",\"alpha2\":\"LY\",\"alpha3\":\"LBY\",\"region\":\"Africa\"},{\"name\":\"Liechtenstein\",\"alpha2\":\"LI\",\"alpha3\":\"LIE\",\"region\":\"Europe\"},{\"name\":\"Lithuania\",\"alpha2\":\"LT\",\"alpha3\":\"LTU\",\"region\":\"Europe\"},{\"name\":\"Luxembourg\",\"alpha2\":\"LU\",\"alpha3\":\"LUX\",\"region\":\"Europe\"},{\"name\":\"Macao\",\"alpha2\":\"MO\",\"alpha3\":\"MAC\",\"region\":\"Asia\"},{\"name\":\"Madagascar\",\"alpha2\":\"MG\",\"alpha3\":\"MDG\",\"region\":\"Africa\"},{\"name\":\"Malawi\",\"alpha2\":\"MW\",\"alpha3\":\"MWI\",\"region\":\"Africa\"},{\"name\":\"Malaysia\",\"alpha2\":\"MY\",\"alpha3\":\"MYS\",\"region\":\"Asia\"},{\"name\":\"Maldives\",\"alpha2\":\"MV\",\"alpha3\":\"MDV\",\"region\":\"Asia\"},{\"name\":\"Mali\",\"alpha2\":\"ML\",\"alpha3\":\"MLI\",\"region\":\"Africa\"},{\"name\":\"Malta\",\"alpha2\":\"MT\",\"alpha3\":\"MLT\",\"region\":\"Europe\"},{\"name\":\"Marshall Islands\",\"alpha2\":\"MH\",\"alpha3\":\"MHL\",\"region\":\"Oceania\"},{\"name\":\"Martinique\",\"alpha2\":\"MQ\",\"alpha3\":\"MTQ\",\"region\":\"Americas\"},{\"name\":\"Mauritania\",\"alpha2\":\"MR\",\"alpha3\":\"MRT\",\"region\":\"Africa\"},{\"name\":\"Mauritius\",\"alpha2\":\"MU\",\"alpha3\":\"MUS\",\"region\":\"Africa\"},{\"name\":\"Mayotte\",\"alpha2\":\"YT\",\"alpha3\":\"MYT\",\"region\":\"Africa\"},{\"name\":\"Mexico\",\"alpha2\":\"MX\",\"alpha3\":\"MEX\",\"region\":\"Americas\"},{\"name\":\"Micronesia (Federated States of)\",\"alpha2\":\"FM\",\"alpha3\":\"FSM\",\"region\":\"Oceania\"},{\"name\":\"Moldova, Republic of\",\"alpha2\":\"MD\",\"alpha3\":\"MDA\",\"region\":\"Europe\"},{\"name\":\"Monaco\",\"alpha2\":\"MC\",\"alpha3\":\"MCO\",\"region\":\"Europe\"},{\"name\":\"Mongolia\",\"alpha2\":\"MN\",\"alpha3\":\"MNG\",\"region\":\"Asia\"},{\"name\":\"Montenegro\",\"alpha2\":\"ME\",\"alpha3\":\"MNE\",\"region\":\"Europe\"},{\"name\":\"Montserrat\",\"alpha2\":\"MS\",\"alpha3\":\"MSR\",\"region\":\"Americas\"},{\"name\":\"Morocco\",\"alpha2\":\"MA\",\"alpha3\":\"MAR\",\"region\":\"Africa\"},{\"name\":\"Mozambique\",\"alpha2\":\"MZ\",\"alpha3\":\"MOZ\",\"region\":\"Africa\"},{\"name\":\"Myanmar\",\"alpha2\":\"MM\",\"alpha3\":\"MMR\",\"region\":\"Asia\"},{\"name\":\"Namibia\",\"alpha2\":\"NA\",\"alpha3\":\"NAM\",\"region\":\"Africa\"},{\"name\":\"Nauru\",\"alpha2\":\"NR\",\"alpha3\":\"NRU\",\"region\":\"Oceania\"},{\"name\":\"Nepal\",\"alpha2\":\"NP\",\"alpha3\":\"NPL\",\"region\":\"Asia\"},{\"name\":\"Netherlands\",\"alpha2\":\"NL\",\"alpha3\":\"NLD\",\"region\":\"Europe\"},{\"name\":\"New Caledonia\",\"alpha2\":\"NC\",\"alpha3\":\"NCL\",\"region\":\"Oceania\"},{\"name\":\"New Zealand\",\"alpha2\":\"NZ\",\"alpha3\":\"NZL\",\"region\":\"Oceania\"},{\"name\":\"Nicaragua\",\"alpha2\":\"NI\",\"alpha3\":\"NIC\",\"region\":\"Americas\"},{\"name\":\"Niger\",\"alpha2\":\"NE\",\"alpha3\":\"NER\",\"region\":\"Africa\"},{\"name\":\"Nigeria\",\"alpha2\":\"NG\",\"alpha3\":\"NGA\",\"region\":\"Africa\"},{\"name\":\"Niue\",\"alpha2\":\"NU\",\"alpha3\":\"NIU\",\"region\":\"Oceania\"},{\"name\":\"Norfolk Island\",\"alpha2\":\"NF\",\"alpha3\":\"NFK\",\"region\":\"Oceania\"},{\"name\":\"North Macedonia\",\"alpha2\":\"MK\",\"alpha3\":\"MKD\",\"region\":\"Europe\"},{\"name\":\"Northern Mariana Islands\",\"alpha2\":\"MP\",\"alpha3\":\"MNP\",\"region\":\"Oceania\"},{\"name\":\"Norway\",\"alpha2\":\"NO\",\"alpha3\":\"NOR\",\"region\":\"Europe\"},{\"name\":\"Oman\",\"alpha2\":\"OM\",\"alpha3\":\"OMN\",\"region\":\"Asia\"},{\"name\":\"Pakistan\",\"alpha2\":\"PK\",\"alpha3\":\"PAK\",\"region\":\"Asia\"},{\"name\":\"Palau\",\"alpha2\":\"PW\",\"alpha3\":\"PLW\",\"region\":\"Oceania\"},{\"name\":\"Palestine, State of\",\"alpha2\":\"PS\",\"alpha3\":\"PSE\",\"region\":\"Asia\"},{\"name\":\"Panama\",\"alpha2\":\"PA\",\"alpha3\":\"PAN\",\"region\":\"Americas\"},{\"name\":\"Papua New Guinea\",\"alpha2\":\"PG\",\"alpha3\":\"PNG\",\"region\":\"Oceania\"},{\"name\":\"Paraguay\",\"alpha2\":\"PY\",\"alpha3\":\"PRY\",\"region\":\"Americas\"},{\"name\":\"Peru\",\"alpha2\":\"PE\",\"alpha3\":\"PER\",\"region\":\"Americas\"},{\"name\":\"Philippines\",\"alpha2\":\"PH\",\"alpha3\":\"PHL\",\"region\":\"Asia\"},{\"name\":\"Pitcairn\",\"alpha2\":\"PN\",\"alpha3\":\"PCN\",\"region\":\"Oceania\"},{\"name\":\"Poland\",\"alpha2\":\"PL\",\"alpha3\":\"POL\",\"region\":\"Europe\"},{\"name\":\"Portugal\",\"alpha2\":\"PT\",\"alpha3\":\"PRT\",\"region\":\"Europe\"},{\"name\":\"Puerto Rico\",\"alpha2\":\"PR\",\"alpha3\":\"PRI\",\"region\":\"Americas\"},{\"name\":\"Qatar\",\"alpha2\":\"QA\",\"alpha3\":\"QAT\",\"region\":\"Asia\"},{\"name\":\"Réunion\",\"alpha2\":\"RE\",\"alpha3\":\"REU\",\"region\":\"Africa\"},{\"name\":\"Romania\",\"alpha2\":\"RO\",\"alpha3\":\"ROU\",\"region\":\"Europe\"},{\"name\":\"Russian Federation\",\"alpha2\":\"RU\",\"alpha3\":\"RUS\",\"region\":\"Europe\"},{\"name\":\"Rwanda\",\"alpha2\":\"RW\",\"alpha3\":\"RWA\",\"region\":\"Africa\"},{\"name\":\"Saint Barthélemy\",\"alpha2\":\"BL\",\"alpha3\":\"BLM\",\"region\":\"Americas\"},{\"name\":\"Saint Helena, Ascension and Tristan da Cunha\",\"alpha2\":\"SH\",\"alpha3\":\"SHN\",\"region\":\"Africa\"},{\"name\":\"Saint Kitts and Nevis\",\"alpha2\":\"KN\",\"alpha3\":\"KNA\",\"region\":\"Americas\"},{\"name\":\"Saint Lucia\",\"alpha2\":\"LC\",\"alpha3\":\"LCA\",\"region\":\"Americas\"},{\"name\":\"Saint Martin (French part)\",\"alpha2\":\"MF\",\"alpha3\":\"MAF\",\"region\":\"Americas\"},{\"name\":\"Saint Pierre and Miquelon\",\"alpha2\":\"PM\",\"alpha3\":\"SPM\",\"region\":\"Americas\"},{\"name\":\"Saint Vincent and the Grenadines\",\"alpha2\":\"VC\",\"alpha3\":\"VCT\",\"region\":\"Americas\"},{\"name\":\"Samoa\",\"alpha2\":\"WS\",\"alpha3\":\"WSM\",\"region\":\"Oceania\"},{\"name\":\"San Marino\",\"alpha2\":\"SM\",\"alpha3\":\"SMR\",\"region\":\"Europe\"},{\"name\":\"Sao Tome and Principe\",\"alpha2\":\"ST\",\"alpha3\":\"STP\",\"region\":\"Africa\"},{\"name\":\"Saudi Arabia\",\"alpha2\":\"SA\",\"alpha3\":\"SAU\",\"region\":\"Asia\"},{\"name\":\"Senegal\",\"alpha2\":\"SN\",\"alpha3\":\"SEN\",\"region\":\"Africa\"},{\"name\":\"Serbia\",\"alpha2\":\"RS\",\"alpha3\":\"SRB\",\"region\":\"Europe\"},{\"name\":\"Seychelles\",\"alpha2\":\"SC\",\"alpha3\":\"SYC\",\"region\":\"Africa\"},{\"name\":\"Sierra Leone\",\"alpha2\":\"SL\",\"alpha3\":\"SLE\",\"region\":\"Africa\"},{\"name\":\"Singapore\",\"alpha2\":\"SG\",\"alpha3\":\"SGP\",\"region\":\"Asia\"},{\"name\":\"Sint Maarten (Dutch part)\",\"alpha2\":\"SX\",\"alpha3\":\"SXM\",\"region\":\"Americas\"},{\"name\":\"Slovakia\",\"alpha2\":\"SK\",\"alpha3\":\"SVK\",\"region\":\"Europe\"},{\"name\":\"Slovenia\",\"alpha2\":\"SI\",\"alpha3\":\"SVN\",\"region\":\"Europe\"},{\"name\":\"Solomon Islands\",\"alpha2\":\"SB\",\"alpha3\":\"SLB\",\"region\":\"Oceania\"},{\"name\":\"Somalia\",\"alpha2\":\"SO\",\"alpha3\":\"SOM\",\"region\":\"Africa\"},{\"name\":\"South Africa\",\"alpha2\":\"ZA\",\"alpha3\":\"ZAF\",\"region\":\"Africa\"},{\"name\":\"South Georgia and the South Sandwich Islands\",\"alpha2\":\"GS\",\"alpha3\":\"SGS\",\"region\":\"Americas\"},{\"name\":\"South Sudan\",\"alpha2\":\"SS\",\"alpha3\":\"SSD\",\"region\":\"Africa\"},{\"name\":\"Spain\",\"alpha2\":\"ES\",\"alpha3\":\"ESP\",\"region\":\"Europe\"},{\"name\":\"Sri Lanka\",\"alpha2\":\"LK\",\"alpha3\":\"LKA\",\"region\":\"Asia\"},{\"name\":\"Sudan\",\"alpha2\":\"SD\",\"alpha3\":\"SDN\",\"region\":\"Africa\"},{\"name\":\"Suriname\",\"alpha2\":\"SR\",\"alpha3\":\"SUR\",\"region\":\"Americas\"},{\"name\":\"Svalbard and Jan Mayen\",\"alpha2\":\"SJ\",\"alpha3\":\"SJM\",\"region\":\"Europe\"},{\"name\":\"Sweden\",\"alpha2\":\"SE\",\"alpha3\":\"SWE\",\"region\":\"Europe\"},{\"name\":\"Switzerland\",\"alpha2\":\"CH\",\"alpha3\":\"CHE\",\"region\":\"Europe\"},{\"name\":\"Syrian Arab Republic\",\"alpha2\":\"SY\",\"alpha3\":\"SYR\",\"region\":\"Asia\"},{\"name\":\"Taiwan, Province of China\",\"alpha2\":\"TW\",\"alpha3\":\"TWN\",\"region\":\"Asia\"},{\"name\":\"Tajikistan\",\"alpha2\":\"TJ\",\"alpha3\":\"TJK\",\"region\":\"Asia\"},{\"name\":\"Tanzania, United Republic of\",\"alpha2\":\"TZ\",\"alpha3\":\"TZA\",\"region\":\"Africa\"},{\"name\":\"Thailand\",\"alpha2\":\"TH\",\"alpha3\":\"THA\",\"region\":\"Asia\"},{\"name\":\"Timor-Leste\",\"alpha2\":\"TL\",\"alpha3\":\"TLS\",\"region\":\"Asia\"},{\"name\":\"Togo\",\"alpha2\":\"TG\",\"alpha3\":\"TGO\",\"region\":\"Africa\"},{\"name\":\"Tokelau\",\"alpha2\":\"TK\",\"alpha3\":\"TKL\",\"region\":\"Oceania\"},{\"name\":\"Tonga\",\"alpha2\":\"TO\",\"alpha3\":\"TON\",\"region\":\"Oceania\"},{\"name\":\"Trinidad and Tobago\",\"alpha2\":\"TT\",\"alpha3\":\"TTO\",\"region\":\"Americas\"},{\"name\":\"Tunisia\",\"alpha2\":\"TN\",\"alpha3\":\"TUN\",\"region\":\"Africa\"},{\"name\":\"Turkey\",\"alpha2\":\"TR\",\"alpha3\":\"TUR\",\"region\":\"Asia\"},{\"name\":\"Turkmenistan\",\"alpha2\":\"TM\",\"alpha3\":\"TKM\",\"region\":\"Asia\"},{\"name\":\"Turks and Caicos Islands\",\"alpha2\":\"TC\",\"alpha3\":\"TCA\",\"region\":\"Americas\"},{\"name\":\"Tuvalu\",\"alpha2\":\"TV\",\"alpha3\":\"TUV\",\"region\":\"Oceania\"},{\"name\":\"Uganda\",\"alpha2\":\"UG\",\"alpha3\":\"UGA\",\"region\":\"Africa\"},{\"name\":\"Ukraine\",\"alpha2\":\"UA\",\"alpha3\":\"UKR\",\"region\":\"Europe\"},{\"name\":\"United Arab Emirates\",\"alpha2\":\"AE\",\"alpha3\":\"ARE\",\"region\":\"Asia\"},{\"name\":\"United Kingdom of Great Britain and Northern Ireland\",\"alpha2\":\"GB\",\"alpha3\":\"GBR\",\"region\":\"Europe\"},{\"name\":\"United States of America\",\"alpha2\":\"US\",\"alpha3\":\"USA\",\"region\":\"Americas\"},{\"name\":\"United States Minor Outlying Islands\",\"alpha2\":\"UM\",\"alpha3\":\"UMI\",\"region\":\"Oceania\"},{\"name\":\"Uruguay\",\"alpha2\":\"UY\",\"alpha3\":\"URY\",\"region\":\"Americas\"},{\"name\":\"Uzbekistan\",\"alpha2\":\"UZ\",\"alpha3\":\"UZB\",\"region\":\"Asia\"},{\"name\":\"Vanuatu\",\"alpha2\":\"VU\",\"alpha3\":\"VUT\",\"region\":\"Oceania\"},{\"name\":\"Venezuela (Bolivarian Republic of)\",\"alpha2\":\"VE\",\"alpha3\":\"VEN\",\"region\":\"Americas\"},{\"name\":\"Viet Nam\",\"alpha2\":\"VN\",\"alpha3\":\"VNM\",\"region\":\"Asia\"},{\"name\":\"Virgin Islands (British)\",\"alpha2\":\"VG\",\"alpha3\":\"VGB\",\"region\":\"Americas\"},{\"name\":\"Virgin Islands (U.S.)\",\"alpha2\":\"VI\",\"alpha3\":\"VIR\",\"region\":\"Americas\"},{\"name\":\"Wallis and Futuna\",\"alpha2\":\"WF\",\"alpha3\":\"WLF\",\"region\":\"Oceania\"},{\"name\":\"Western Sahara\",\"alpha2\":\"EH\",\"alpha3\":\"ESH\",\"region\":\"Africa\"},{\"name\":\"Yemen\",\"alpha2\":\"YE\",\"alpha3\":\"YEM\",\"region\":\"Asia\"},{\"name\":\"Zambia\",\"alpha2\":\"ZM\",\"alpha3\":\"ZMB\",\"region\":\"Africa\"},{\"name\":\"Zimbabwe\",\"alpha2\":\"ZW\",\"alpha3\":\"ZWE\",\"region\":\"Africa\"},{\"name\":\"Byteland PROD\",\"alpha2\":\"YY\",\"alpha3\":\"YYY\",\"region\":\"Europe\"}];", + "", + "", + "const regionsToCheck = [", + " ['Africa'],", + " ['Americas'],", + " ['Asia'],", + " ['Europe'],", + " ['Oceania'],", + " ['Europe', 'Africa'],", + " ['Europe', 'Asia'],", + " ['Europe', 'Asia', 'Americas'],", + "];", + "", + "const querystring = require('querystring');", + "", + "regionsToCheck.forEach(function (regions) {", + " pm.test(`List countries from regions ${regions}`, function () {", + " const data = {", + " 'region': regions,", + " };", + " const params = querystring.stringify(data);", + " const url = pm.variables.get(\"base_url\") + `/countries?${params}`;", + "", + " pm.sendRequest(url, function (err, response) {", + " pm.test(`Validate response URL /countries?${params}`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " for (var i = 0; i < countries.length; i++) {", + " if (!regions.includes(countries[i].region)) {", + " continue;", + " }", + "", + " pm.expect(resp).to.deep.include(countries[i], `Response has to include country ${countries[i].alpha2} from ${countries[i].region}`);", + " }", + " });", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get country by alpha2", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var countrySchema = {", + " \"type\": \"object\",", + " \"description\": \"Информация о стране из стандарта ISO 3166\",", + " \"properties\": {", + " \"name\": {", + " \"type\": \"string\",", + " \"description\": \"Полное название страны\",", + " \"maxLength\": 100", + " },", + " \"alpha2\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"alpha3\": {", + " \"type\": \"string\",", + " \"description\": \"Трехбуквенный код страны\",", + " \"maxLength\": 3,", + " \"pattern\": \"[a-zA-Z]{3}\"", + " },", + " \"region\": {", + " \"type\": \"string\",", + " \"description\": \"Географический регион, к которому относится страна\",", + " \"enum\": [", + " \"Europe\",", + " \"Africa\",", + " \"Americas\",", + " \"Oceania\",", + " \"Asia\"", + " ]", + " }", + " },", + " \"required\": [", + " \"name\",", + " \"alpha2\",", + " \"alpha3\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "const countries = [{\"name\":\"Afghanistan\",\"alpha2\":\"AF\",\"alpha3\":\"AFG\",\"region\":\"Asia\"},{\"name\":\"Åland Islands\",\"alpha2\":\"AX\",\"alpha3\":\"ALA\",\"region\":\"Europe\"},{\"name\":\"Albania\",\"alpha2\":\"AL\",\"alpha3\":\"ALB\",\"region\":\"Europe\"},{\"name\":\"Algeria\",\"alpha2\":\"DZ\",\"alpha3\":\"DZA\",\"region\":\"Africa\"},{\"name\":\"American Samoa\",\"alpha2\":\"AS\",\"alpha3\":\"ASM\",\"region\":\"Oceania\"},{\"name\":\"Andorra\",\"alpha2\":\"AD\",\"alpha3\":\"AND\",\"region\":\"Europe\"},{\"name\":\"Angola\",\"alpha2\":\"AO\",\"alpha3\":\"AGO\",\"region\":\"Africa\"},{\"name\":\"Anguilla\",\"alpha2\":\"AI\",\"alpha3\":\"AIA\",\"region\":\"Americas\"},{\"name\":\"Antigua and Barbuda\",\"alpha2\":\"AG\",\"alpha3\":\"ATG\",\"region\":\"Americas\"},{\"name\":\"Argentina\",\"alpha2\":\"AR\",\"alpha3\":\"ARG\",\"region\":\"Americas\"},{\"name\":\"Armenia\",\"alpha2\":\"AM\",\"alpha3\":\"ARM\",\"region\":\"Asia\"},{\"name\":\"Aruba\",\"alpha2\":\"AW\",\"alpha3\":\"ABW\",\"region\":\"Americas\"},{\"name\":\"Australia\",\"alpha2\":\"AU\",\"alpha3\":\"AUS\",\"region\":\"Oceania\"},{\"name\":\"Austria\",\"alpha2\":\"AT\",\"alpha3\":\"AUT\",\"region\":\"Europe\"},{\"name\":\"Azerbaijan\",\"alpha2\":\"AZ\",\"alpha3\":\"AZE\",\"region\":\"Asia\"},{\"name\":\"Bahamas\",\"alpha2\":\"BS\",\"alpha3\":\"BHS\",\"region\":\"Americas\"},{\"name\":\"Bahrain\",\"alpha2\":\"BH\",\"alpha3\":\"BHR\",\"region\":\"Asia\"},{\"name\":\"Bangladesh\",\"alpha2\":\"BD\",\"alpha3\":\"BGD\",\"region\":\"Asia\"},{\"name\":\"Barbados\",\"alpha2\":\"BB\",\"alpha3\":\"BRB\",\"region\":\"Americas\"},{\"name\":\"Belarus\",\"alpha2\":\"BY\",\"alpha3\":\"BLR\",\"region\":\"Europe\"},{\"name\":\"Belgium\",\"alpha2\":\"BE\",\"alpha3\":\"BEL\",\"region\":\"Europe\"},{\"name\":\"Belize\",\"alpha2\":\"BZ\",\"alpha3\":\"BLZ\",\"region\":\"Americas\"},{\"name\":\"Benin\",\"alpha2\":\"BJ\",\"alpha3\":\"BEN\",\"region\":\"Africa\"},{\"name\":\"Bermuda\",\"alpha2\":\"BM\",\"alpha3\":\"BMU\",\"region\":\"Americas\"},{\"name\":\"Bhutan\",\"alpha2\":\"BT\",\"alpha3\":\"BTN\",\"region\":\"Asia\"},{\"name\":\"Bolivia (Plurinational State of)\",\"alpha2\":\"BO\",\"alpha3\":\"BOL\",\"region\":\"Americas\"},{\"name\":\"Bonaire, Sint Eustatius and Saba\",\"alpha2\":\"BQ\",\"alpha3\":\"BES\",\"region\":\"Americas\"},{\"name\":\"Bosnia and Herzegovina\",\"alpha2\":\"BA\",\"alpha3\":\"BIH\",\"region\":\"Europe\"},{\"name\":\"Botswana\",\"alpha2\":\"BW\",\"alpha3\":\"BWA\",\"region\":\"Africa\"},{\"name\":\"Bouvet Island\",\"alpha2\":\"BV\",\"alpha3\":\"BVT\",\"region\":\"Americas\"},{\"name\":\"Brazil\",\"alpha2\":\"BR\",\"alpha3\":\"BRA\",\"region\":\"Americas\"},{\"name\":\"British Indian Ocean Territory\",\"alpha2\":\"IO\",\"alpha3\":\"IOT\",\"region\":\"Africa\"},{\"name\":\"Brunei Darussalam\",\"alpha2\":\"BN\",\"alpha3\":\"BRN\",\"region\":\"Asia\"},{\"name\":\"Bulgaria\",\"alpha2\":\"BG\",\"alpha3\":\"BGR\",\"region\":\"Europe\"},{\"name\":\"Burkina Faso\",\"alpha2\":\"BF\",\"alpha3\":\"BFA\",\"region\":\"Africa\"},{\"name\":\"Burundi\",\"alpha2\":\"BI\",\"alpha3\":\"BDI\",\"region\":\"Africa\"},{\"name\":\"Cabo Verde\",\"alpha2\":\"CV\",\"alpha3\":\"CPV\",\"region\":\"Africa\"},{\"name\":\"Cambodia\",\"alpha2\":\"KH\",\"alpha3\":\"KHM\",\"region\":\"Asia\"},{\"name\":\"Cameroon\",\"alpha2\":\"CM\",\"alpha3\":\"CMR\",\"region\":\"Africa\"},{\"name\":\"Canada\",\"alpha2\":\"CA\",\"alpha3\":\"CAN\",\"region\":\"Americas\"},{\"name\":\"Cayman Islands\",\"alpha2\":\"KY\",\"alpha3\":\"CYM\",\"region\":\"Americas\"},{\"name\":\"Central African Republic\",\"alpha2\":\"CF\",\"alpha3\":\"CAF\",\"region\":\"Africa\"},{\"name\":\"Chad\",\"alpha2\":\"TD\",\"alpha3\":\"TCD\",\"region\":\"Africa\"},{\"name\":\"Chile\",\"alpha2\":\"CL\",\"alpha3\":\"CHL\",\"region\":\"Americas\"},{\"name\":\"China\",\"alpha2\":\"CN\",\"alpha3\":\"CHN\",\"region\":\"Asia\"},{\"name\":\"Christmas Island\",\"alpha2\":\"CX\",\"alpha3\":\"CXR\",\"region\":\"Oceania\"},{\"name\":\"Cocos (Keeling) Islands\",\"alpha2\":\"CC\",\"alpha3\":\"CCK\",\"region\":\"Oceania\"},{\"name\":\"Colombia\",\"alpha2\":\"CO\",\"alpha3\":\"COL\",\"region\":\"Americas\"},{\"name\":\"Comoros\",\"alpha2\":\"KM\",\"alpha3\":\"COM\",\"region\":\"Africa\"},{\"name\":\"Congo\",\"alpha2\":\"CG\",\"alpha3\":\"COG\",\"region\":\"Africa\"},{\"name\":\"Congo, Democratic Republic of the\",\"alpha2\":\"CD\",\"alpha3\":\"COD\",\"region\":\"Africa\"},{\"name\":\"Cook Islands\",\"alpha2\":\"CK\",\"alpha3\":\"COK\",\"region\":\"Oceania\"},{\"name\":\"Costa Rica\",\"alpha2\":\"CR\",\"alpha3\":\"CRI\",\"region\":\"Americas\"},{\"name\":\"Croatia\",\"alpha2\":\"HR\",\"alpha3\":\"HRV\",\"region\":\"Europe\"},{\"name\":\"Cuba\",\"alpha2\":\"CU\",\"alpha3\":\"CUB\",\"region\":\"Americas\"},{\"name\":\"Curaçao\",\"alpha2\":\"CW\",\"alpha3\":\"CUW\",\"region\":\"Americas\"},{\"name\":\"Cyprus\",\"alpha2\":\"CY\",\"alpha3\":\"CYP\",\"region\":\"Asia\"},{\"name\":\"Czechia\",\"alpha2\":\"CZ\",\"alpha3\":\"CZE\",\"region\":\"Europe\"},{\"name\":\"Denmark\",\"alpha2\":\"DK\",\"alpha3\":\"DNK\",\"region\":\"Europe\"},{\"name\":\"Djibouti\",\"alpha2\":\"DJ\",\"alpha3\":\"DJI\",\"region\":\"Africa\"},{\"name\":\"Dominica\",\"alpha2\":\"DM\",\"alpha3\":\"DMA\",\"region\":\"Americas\"},{\"name\":\"Dominican Republic\",\"alpha2\":\"DO\",\"alpha3\":\"DOM\",\"region\":\"Americas\"},{\"name\":\"Ecuador\",\"alpha2\":\"EC\",\"alpha3\":\"ECU\",\"region\":\"Americas\"},{\"name\":\"Egypt\",\"alpha2\":\"EG\",\"alpha3\":\"EGY\",\"region\":\"Africa\"},{\"name\":\"El Salvador\",\"alpha2\":\"SV\",\"alpha3\":\"SLV\",\"region\":\"Americas\"},{\"name\":\"Equatorial Guinea\",\"alpha2\":\"GQ\",\"alpha3\":\"GNQ\",\"region\":\"Africa\"},{\"name\":\"Eritrea\",\"alpha2\":\"ER\",\"alpha3\":\"ERI\",\"region\":\"Africa\"},{\"name\":\"Estonia\",\"alpha2\":\"EE\",\"alpha3\":\"EST\",\"region\":\"Europe\"},{\"name\":\"Eswatini\",\"alpha2\":\"SZ\",\"alpha3\":\"SWZ\",\"region\":\"Africa\"},{\"name\":\"Ethiopia\",\"alpha2\":\"ET\",\"alpha3\":\"ETH\",\"region\":\"Africa\"},{\"name\":\"Falkland Islands (Malvinas)\",\"alpha2\":\"FK\",\"alpha3\":\"FLK\",\"region\":\"Americas\"},{\"name\":\"Faroe Islands\",\"alpha2\":\"FO\",\"alpha3\":\"FRO\",\"region\":\"Europe\"},{\"name\":\"Fiji\",\"alpha2\":\"FJ\",\"alpha3\":\"FJI\",\"region\":\"Oceania\"},{\"name\":\"Finland\",\"alpha2\":\"FI\",\"alpha3\":\"FIN\",\"region\":\"Europe\"},{\"name\":\"France\",\"alpha2\":\"FR\",\"alpha3\":\"FRA\",\"region\":\"Europe\"},{\"name\":\"French Guiana\",\"alpha2\":\"GF\",\"alpha3\":\"GUF\",\"region\":\"Americas\"},{\"name\":\"French Polynesia\",\"alpha2\":\"PF\",\"alpha3\":\"PYF\",\"region\":\"Oceania\"},{\"name\":\"French Southern Territories\",\"alpha2\":\"TF\",\"alpha3\":\"ATF\",\"region\":\"Africa\"},{\"name\":\"Gabon\",\"alpha2\":\"GA\",\"alpha3\":\"GAB\",\"region\":\"Africa\"},{\"name\":\"Gambia\",\"alpha2\":\"GM\",\"alpha3\":\"GMB\",\"region\":\"Africa\"},{\"name\":\"Georgia\",\"alpha2\":\"GE\",\"alpha3\":\"GEO\",\"region\":\"Asia\"},{\"name\":\"Germany\",\"alpha2\":\"DE\",\"alpha3\":\"DEU\",\"region\":\"Europe\"},{\"name\":\"Ghana\",\"alpha2\":\"GH\",\"alpha3\":\"GHA\",\"region\":\"Africa\"},{\"name\":\"Gibraltar\",\"alpha2\":\"GI\",\"alpha3\":\"GIB\",\"region\":\"Europe\"},{\"name\":\"Greece\",\"alpha2\":\"GR\",\"alpha3\":\"GRC\",\"region\":\"Europe\"},{\"name\":\"Greenland\",\"alpha2\":\"GL\",\"alpha3\":\"GRL\",\"region\":\"Americas\"},{\"name\":\"Grenada\",\"alpha2\":\"GD\",\"alpha3\":\"GRD\",\"region\":\"Americas\"},{\"name\":\"Guadeloupe\",\"alpha2\":\"GP\",\"alpha3\":\"GLP\",\"region\":\"Americas\"},{\"name\":\"Guam\",\"alpha2\":\"GU\",\"alpha3\":\"GUM\",\"region\":\"Oceania\"},{\"name\":\"Guatemala\",\"alpha2\":\"GT\",\"alpha3\":\"GTM\",\"region\":\"Americas\"},{\"name\":\"Guernsey\",\"alpha2\":\"GG\",\"alpha3\":\"GGY\",\"region\":\"Europe\"},{\"name\":\"Guinea\",\"alpha2\":\"GN\",\"alpha3\":\"GIN\",\"region\":\"Africa\"},{\"name\":\"Guinea-Bissau\",\"alpha2\":\"GW\",\"alpha3\":\"GNB\",\"region\":\"Africa\"},{\"name\":\"Guyana\",\"alpha2\":\"GY\",\"alpha3\":\"GUY\",\"region\":\"Americas\"},{\"name\":\"Haiti\",\"alpha2\":\"HT\",\"alpha3\":\"HTI\",\"region\":\"Americas\"},{\"name\":\"Heard Island and McDonald Islands\",\"alpha2\":\"HM\",\"alpha3\":\"HMD\",\"region\":\"Oceania\"},{\"name\":\"Holy See\",\"alpha2\":\"VA\",\"alpha3\":\"VAT\",\"region\":\"Europe\"},{\"name\":\"Honduras\",\"alpha2\":\"HN\",\"alpha3\":\"HND\",\"region\":\"Americas\"},{\"name\":\"Hong Kong\",\"alpha2\":\"HK\",\"alpha3\":\"HKG\",\"region\":\"Asia\"},{\"name\":\"Hungary\",\"alpha2\":\"HU\",\"alpha3\":\"HUN\",\"region\":\"Europe\"},{\"name\":\"Iceland\",\"alpha2\":\"IS\",\"alpha3\":\"ISL\",\"region\":\"Europe\"},{\"name\":\"India\",\"alpha2\":\"IN\",\"alpha3\":\"IND\",\"region\":\"Asia\"},{\"name\":\"Indonesia\",\"alpha2\":\"ID\",\"alpha3\":\"IDN\",\"region\":\"Asia\"},{\"name\":\"Iran (Islamic Republic of)\",\"alpha2\":\"IR\",\"alpha3\":\"IRN\",\"region\":\"Asia\"},{\"name\":\"Iraq\",\"alpha2\":\"IQ\",\"alpha3\":\"IRQ\",\"region\":\"Asia\"},{\"name\":\"Ireland\",\"alpha2\":\"IE\",\"alpha3\":\"IRL\",\"region\":\"Europe\"},{\"name\":\"Isle of Man\",\"alpha2\":\"IM\",\"alpha3\":\"IMN\",\"region\":\"Europe\"},{\"name\":\"Israel\",\"alpha2\":\"IL\",\"alpha3\":\"ISR\",\"region\":\"Asia\"},{\"name\":\"Italy\",\"alpha2\":\"IT\",\"alpha3\":\"ITA\",\"region\":\"Europe\"},{\"name\":\"Jamaica\",\"alpha2\":\"JM\",\"alpha3\":\"JAM\",\"region\":\"Americas\"},{\"name\":\"Japan\",\"alpha2\":\"JP\",\"alpha3\":\"JPN\",\"region\":\"Asia\"},{\"name\":\"Jersey\",\"alpha2\":\"JE\",\"alpha3\":\"JEY\",\"region\":\"Europe\"},{\"name\":\"Jordan\",\"alpha2\":\"JO\",\"alpha3\":\"JOR\",\"region\":\"Asia\"},{\"name\":\"Kazakhstan\",\"alpha2\":\"KZ\",\"alpha3\":\"KAZ\",\"region\":\"Asia\"},{\"name\":\"Kenya\",\"alpha2\":\"KE\",\"alpha3\":\"KEN\",\"region\":\"Africa\"},{\"name\":\"Kiribati\",\"alpha2\":\"KI\",\"alpha3\":\"KIR\",\"region\":\"Oceania\"},{\"name\":\"Korea, Republic of\",\"alpha2\":\"KR\",\"alpha3\":\"KOR\",\"region\":\"Asia\"},{\"name\":\"Kuwait\",\"alpha2\":\"KW\",\"alpha3\":\"KWT\",\"region\":\"Asia\"},{\"name\":\"Kyrgyzstan\",\"alpha2\":\"KG\",\"alpha3\":\"KGZ\",\"region\":\"Asia\"},{\"name\":\"Latvia\",\"alpha2\":\"LV\",\"alpha3\":\"LVA\",\"region\":\"Europe\"},{\"name\":\"Lebanon\",\"alpha2\":\"LB\",\"alpha3\":\"LBN\",\"region\":\"Asia\"},{\"name\":\"Lesotho\",\"alpha2\":\"LS\",\"alpha3\":\"LSO\",\"region\":\"Africa\"},{\"name\":\"Liberia\",\"alpha2\":\"LR\",\"alpha3\":\"LBR\",\"region\":\"Africa\"},{\"name\":\"Libya\",\"alpha2\":\"LY\",\"alpha3\":\"LBY\",\"region\":\"Africa\"},{\"name\":\"Liechtenstein\",\"alpha2\":\"LI\",\"alpha3\":\"LIE\",\"region\":\"Europe\"},{\"name\":\"Lithuania\",\"alpha2\":\"LT\",\"alpha3\":\"LTU\",\"region\":\"Europe\"},{\"name\":\"Luxembourg\",\"alpha2\":\"LU\",\"alpha3\":\"LUX\",\"region\":\"Europe\"},{\"name\":\"Macao\",\"alpha2\":\"MO\",\"alpha3\":\"MAC\",\"region\":\"Asia\"},{\"name\":\"Madagascar\",\"alpha2\":\"MG\",\"alpha3\":\"MDG\",\"region\":\"Africa\"},{\"name\":\"Malawi\",\"alpha2\":\"MW\",\"alpha3\":\"MWI\",\"region\":\"Africa\"},{\"name\":\"Malaysia\",\"alpha2\":\"MY\",\"alpha3\":\"MYS\",\"region\":\"Asia\"},{\"name\":\"Maldives\",\"alpha2\":\"MV\",\"alpha3\":\"MDV\",\"region\":\"Asia\"},{\"name\":\"Mali\",\"alpha2\":\"ML\",\"alpha3\":\"MLI\",\"region\":\"Africa\"},{\"name\":\"Malta\",\"alpha2\":\"MT\",\"alpha3\":\"MLT\",\"region\":\"Europe\"},{\"name\":\"Marshall Islands\",\"alpha2\":\"MH\",\"alpha3\":\"MHL\",\"region\":\"Oceania\"},{\"name\":\"Martinique\",\"alpha2\":\"MQ\",\"alpha3\":\"MTQ\",\"region\":\"Americas\"},{\"name\":\"Mauritania\",\"alpha2\":\"MR\",\"alpha3\":\"MRT\",\"region\":\"Africa\"},{\"name\":\"Mauritius\",\"alpha2\":\"MU\",\"alpha3\":\"MUS\",\"region\":\"Africa\"},{\"name\":\"Mayotte\",\"alpha2\":\"YT\",\"alpha3\":\"MYT\",\"region\":\"Africa\"},{\"name\":\"Mexico\",\"alpha2\":\"MX\",\"alpha3\":\"MEX\",\"region\":\"Americas\"},{\"name\":\"Micronesia (Federated States of)\",\"alpha2\":\"FM\",\"alpha3\":\"FSM\",\"region\":\"Oceania\"},{\"name\":\"Moldova, Republic of\",\"alpha2\":\"MD\",\"alpha3\":\"MDA\",\"region\":\"Europe\"},{\"name\":\"Monaco\",\"alpha2\":\"MC\",\"alpha3\":\"MCO\",\"region\":\"Europe\"},{\"name\":\"Mongolia\",\"alpha2\":\"MN\",\"alpha3\":\"MNG\",\"region\":\"Asia\"},{\"name\":\"Montenegro\",\"alpha2\":\"ME\",\"alpha3\":\"MNE\",\"region\":\"Europe\"},{\"name\":\"Montserrat\",\"alpha2\":\"MS\",\"alpha3\":\"MSR\",\"region\":\"Americas\"},{\"name\":\"Morocco\",\"alpha2\":\"MA\",\"alpha3\":\"MAR\",\"region\":\"Africa\"},{\"name\":\"Mozambique\",\"alpha2\":\"MZ\",\"alpha3\":\"MOZ\",\"region\":\"Africa\"},{\"name\":\"Myanmar\",\"alpha2\":\"MM\",\"alpha3\":\"MMR\",\"region\":\"Asia\"},{\"name\":\"Namibia\",\"alpha2\":\"NA\",\"alpha3\":\"NAM\",\"region\":\"Africa\"},{\"name\":\"Nauru\",\"alpha2\":\"NR\",\"alpha3\":\"NRU\",\"region\":\"Oceania\"},{\"name\":\"Nepal\",\"alpha2\":\"NP\",\"alpha3\":\"NPL\",\"region\":\"Asia\"},{\"name\":\"Netherlands\",\"alpha2\":\"NL\",\"alpha3\":\"NLD\",\"region\":\"Europe\"},{\"name\":\"New Caledonia\",\"alpha2\":\"NC\",\"alpha3\":\"NCL\",\"region\":\"Oceania\"},{\"name\":\"New Zealand\",\"alpha2\":\"NZ\",\"alpha3\":\"NZL\",\"region\":\"Oceania\"},{\"name\":\"Nicaragua\",\"alpha2\":\"NI\",\"alpha3\":\"NIC\",\"region\":\"Americas\"},{\"name\":\"Niger\",\"alpha2\":\"NE\",\"alpha3\":\"NER\",\"region\":\"Africa\"},{\"name\":\"Nigeria\",\"alpha2\":\"NG\",\"alpha3\":\"NGA\",\"region\":\"Africa\"},{\"name\":\"Niue\",\"alpha2\":\"NU\",\"alpha3\":\"NIU\",\"region\":\"Oceania\"},{\"name\":\"Norfolk Island\",\"alpha2\":\"NF\",\"alpha3\":\"NFK\",\"region\":\"Oceania\"},{\"name\":\"North Macedonia\",\"alpha2\":\"MK\",\"alpha3\":\"MKD\",\"region\":\"Europe\"},{\"name\":\"Northern Mariana Islands\",\"alpha2\":\"MP\",\"alpha3\":\"MNP\",\"region\":\"Oceania\"},{\"name\":\"Norway\",\"alpha2\":\"NO\",\"alpha3\":\"NOR\",\"region\":\"Europe\"},{\"name\":\"Oman\",\"alpha2\":\"OM\",\"alpha3\":\"OMN\",\"region\":\"Asia\"},{\"name\":\"Pakistan\",\"alpha2\":\"PK\",\"alpha3\":\"PAK\",\"region\":\"Asia\"},{\"name\":\"Palau\",\"alpha2\":\"PW\",\"alpha3\":\"PLW\",\"region\":\"Oceania\"},{\"name\":\"Palestine, State of\",\"alpha2\":\"PS\",\"alpha3\":\"PSE\",\"region\":\"Asia\"},{\"name\":\"Panama\",\"alpha2\":\"PA\",\"alpha3\":\"PAN\",\"region\":\"Americas\"},{\"name\":\"Papua New Guinea\",\"alpha2\":\"PG\",\"alpha3\":\"PNG\",\"region\":\"Oceania\"},{\"name\":\"Paraguay\",\"alpha2\":\"PY\",\"alpha3\":\"PRY\",\"region\":\"Americas\"},{\"name\":\"Peru\",\"alpha2\":\"PE\",\"alpha3\":\"PER\",\"region\":\"Americas\"},{\"name\":\"Philippines\",\"alpha2\":\"PH\",\"alpha3\":\"PHL\",\"region\":\"Asia\"},{\"name\":\"Pitcairn\",\"alpha2\":\"PN\",\"alpha3\":\"PCN\",\"region\":\"Oceania\"},{\"name\":\"Poland\",\"alpha2\":\"PL\",\"alpha3\":\"POL\",\"region\":\"Europe\"},{\"name\":\"Portugal\",\"alpha2\":\"PT\",\"alpha3\":\"PRT\",\"region\":\"Europe\"},{\"name\":\"Puerto Rico\",\"alpha2\":\"PR\",\"alpha3\":\"PRI\",\"region\":\"Americas\"},{\"name\":\"Qatar\",\"alpha2\":\"QA\",\"alpha3\":\"QAT\",\"region\":\"Asia\"},{\"name\":\"Réunion\",\"alpha2\":\"RE\",\"alpha3\":\"REU\",\"region\":\"Africa\"},{\"name\":\"Romania\",\"alpha2\":\"RO\",\"alpha3\":\"ROU\",\"region\":\"Europe\"},{\"name\":\"Russian Federation\",\"alpha2\":\"RU\",\"alpha3\":\"RUS\",\"region\":\"Europe\"},{\"name\":\"Rwanda\",\"alpha2\":\"RW\",\"alpha3\":\"RWA\",\"region\":\"Africa\"},{\"name\":\"Saint Barthélemy\",\"alpha2\":\"BL\",\"alpha3\":\"BLM\",\"region\":\"Americas\"},{\"name\":\"Saint Helena, Ascension and Tristan da Cunha\",\"alpha2\":\"SH\",\"alpha3\":\"SHN\",\"region\":\"Africa\"},{\"name\":\"Saint Kitts and Nevis\",\"alpha2\":\"KN\",\"alpha3\":\"KNA\",\"region\":\"Americas\"},{\"name\":\"Saint Lucia\",\"alpha2\":\"LC\",\"alpha3\":\"LCA\",\"region\":\"Americas\"},{\"name\":\"Saint Martin (French part)\",\"alpha2\":\"MF\",\"alpha3\":\"MAF\",\"region\":\"Americas\"},{\"name\":\"Saint Pierre and Miquelon\",\"alpha2\":\"PM\",\"alpha3\":\"SPM\",\"region\":\"Americas\"},{\"name\":\"Saint Vincent and the Grenadines\",\"alpha2\":\"VC\",\"alpha3\":\"VCT\",\"region\":\"Americas\"},{\"name\":\"Samoa\",\"alpha2\":\"WS\",\"alpha3\":\"WSM\",\"region\":\"Oceania\"},{\"name\":\"San Marino\",\"alpha2\":\"SM\",\"alpha3\":\"SMR\",\"region\":\"Europe\"},{\"name\":\"Sao Tome and Principe\",\"alpha2\":\"ST\",\"alpha3\":\"STP\",\"region\":\"Africa\"},{\"name\":\"Saudi Arabia\",\"alpha2\":\"SA\",\"alpha3\":\"SAU\",\"region\":\"Asia\"},{\"name\":\"Senegal\",\"alpha2\":\"SN\",\"alpha3\":\"SEN\",\"region\":\"Africa\"},{\"name\":\"Serbia\",\"alpha2\":\"RS\",\"alpha3\":\"SRB\",\"region\":\"Europe\"},{\"name\":\"Seychelles\",\"alpha2\":\"SC\",\"alpha3\":\"SYC\",\"region\":\"Africa\"},{\"name\":\"Sierra Leone\",\"alpha2\":\"SL\",\"alpha3\":\"SLE\",\"region\":\"Africa\"},{\"name\":\"Singapore\",\"alpha2\":\"SG\",\"alpha3\":\"SGP\",\"region\":\"Asia\"},{\"name\":\"Sint Maarten (Dutch part)\",\"alpha2\":\"SX\",\"alpha3\":\"SXM\",\"region\":\"Americas\"},{\"name\":\"Slovakia\",\"alpha2\":\"SK\",\"alpha3\":\"SVK\",\"region\":\"Europe\"},{\"name\":\"Slovenia\",\"alpha2\":\"SI\",\"alpha3\":\"SVN\",\"region\":\"Europe\"},{\"name\":\"Solomon Islands\",\"alpha2\":\"SB\",\"alpha3\":\"SLB\",\"region\":\"Oceania\"},{\"name\":\"Somalia\",\"alpha2\":\"SO\",\"alpha3\":\"SOM\",\"region\":\"Africa\"},{\"name\":\"South Africa\",\"alpha2\":\"ZA\",\"alpha3\":\"ZAF\",\"region\":\"Africa\"},{\"name\":\"South Georgia and the South Sandwich Islands\",\"alpha2\":\"GS\",\"alpha3\":\"SGS\",\"region\":\"Americas\"},{\"name\":\"South Sudan\",\"alpha2\":\"SS\",\"alpha3\":\"SSD\",\"region\":\"Africa\"},{\"name\":\"Spain\",\"alpha2\":\"ES\",\"alpha3\":\"ESP\",\"region\":\"Europe\"},{\"name\":\"Sri Lanka\",\"alpha2\":\"LK\",\"alpha3\":\"LKA\",\"region\":\"Asia\"},{\"name\":\"Sudan\",\"alpha2\":\"SD\",\"alpha3\":\"SDN\",\"region\":\"Africa\"},{\"name\":\"Suriname\",\"alpha2\":\"SR\",\"alpha3\":\"SUR\",\"region\":\"Americas\"},{\"name\":\"Svalbard and Jan Mayen\",\"alpha2\":\"SJ\",\"alpha3\":\"SJM\",\"region\":\"Europe\"},{\"name\":\"Sweden\",\"alpha2\":\"SE\",\"alpha3\":\"SWE\",\"region\":\"Europe\"},{\"name\":\"Switzerland\",\"alpha2\":\"CH\",\"alpha3\":\"CHE\",\"region\":\"Europe\"},{\"name\":\"Syrian Arab Republic\",\"alpha2\":\"SY\",\"alpha3\":\"SYR\",\"region\":\"Asia\"},{\"name\":\"Taiwan, Province of China\",\"alpha2\":\"TW\",\"alpha3\":\"TWN\",\"region\":\"Asia\"},{\"name\":\"Tajikistan\",\"alpha2\":\"TJ\",\"alpha3\":\"TJK\",\"region\":\"Asia\"},{\"name\":\"Tanzania, United Republic of\",\"alpha2\":\"TZ\",\"alpha3\":\"TZA\",\"region\":\"Africa\"},{\"name\":\"Thailand\",\"alpha2\":\"TH\",\"alpha3\":\"THA\",\"region\":\"Asia\"},{\"name\":\"Timor-Leste\",\"alpha2\":\"TL\",\"alpha3\":\"TLS\",\"region\":\"Asia\"},{\"name\":\"Togo\",\"alpha2\":\"TG\",\"alpha3\":\"TGO\",\"region\":\"Africa\"},{\"name\":\"Tokelau\",\"alpha2\":\"TK\",\"alpha3\":\"TKL\",\"region\":\"Oceania\"},{\"name\":\"Tonga\",\"alpha2\":\"TO\",\"alpha3\":\"TON\",\"region\":\"Oceania\"},{\"name\":\"Trinidad and Tobago\",\"alpha2\":\"TT\",\"alpha3\":\"TTO\",\"region\":\"Americas\"},{\"name\":\"Tunisia\",\"alpha2\":\"TN\",\"alpha3\":\"TUN\",\"region\":\"Africa\"},{\"name\":\"Turkey\",\"alpha2\":\"TR\",\"alpha3\":\"TUR\",\"region\":\"Asia\"},{\"name\":\"Turkmenistan\",\"alpha2\":\"TM\",\"alpha3\":\"TKM\",\"region\":\"Asia\"},{\"name\":\"Turks and Caicos Islands\",\"alpha2\":\"TC\",\"alpha3\":\"TCA\",\"region\":\"Americas\"},{\"name\":\"Tuvalu\",\"alpha2\":\"TV\",\"alpha3\":\"TUV\",\"region\":\"Oceania\"},{\"name\":\"Uganda\",\"alpha2\":\"UG\",\"alpha3\":\"UGA\",\"region\":\"Africa\"},{\"name\":\"Ukraine\",\"alpha2\":\"UA\",\"alpha3\":\"UKR\",\"region\":\"Europe\"},{\"name\":\"United Arab Emirates\",\"alpha2\":\"AE\",\"alpha3\":\"ARE\",\"region\":\"Asia\"},{\"name\":\"United Kingdom of Great Britain and Northern Ireland\",\"alpha2\":\"GB\",\"alpha3\":\"GBR\",\"region\":\"Europe\"},{\"name\":\"United States of America\",\"alpha2\":\"US\",\"alpha3\":\"USA\",\"region\":\"Americas\"},{\"name\":\"United States Minor Outlying Islands\",\"alpha2\":\"UM\",\"alpha3\":\"UMI\",\"region\":\"Oceania\"},{\"name\":\"Uruguay\",\"alpha2\":\"UY\",\"alpha3\":\"URY\",\"region\":\"Americas\"},{\"name\":\"Uzbekistan\",\"alpha2\":\"UZ\",\"alpha3\":\"UZB\",\"region\":\"Asia\"},{\"name\":\"Vanuatu\",\"alpha2\":\"VU\",\"alpha3\":\"VUT\",\"region\":\"Oceania\"},{\"name\":\"Venezuela (Bolivarian Republic of)\",\"alpha2\":\"VE\",\"alpha3\":\"VEN\",\"region\":\"Americas\"},{\"name\":\"Viet Nam\",\"alpha2\":\"VN\",\"alpha3\":\"VNM\",\"region\":\"Asia\"},{\"name\":\"Virgin Islands (British)\",\"alpha2\":\"VG\",\"alpha3\":\"VGB\",\"region\":\"Americas\"},{\"name\":\"Virgin Islands (U.S.)\",\"alpha2\":\"VI\",\"alpha3\":\"VIR\",\"region\":\"Americas\"},{\"name\":\"Wallis and Futuna\",\"alpha2\":\"WF\",\"alpha3\":\"WLF\",\"region\":\"Oceania\"},{\"name\":\"Western Sahara\",\"alpha2\":\"EH\",\"alpha3\":\"ESH\",\"region\":\"Africa\"},{\"name\":\"Yemen\",\"alpha2\":\"YE\",\"alpha3\":\"YEM\",\"region\":\"Asia\"},{\"name\":\"Zambia\",\"alpha2\":\"ZM\",\"alpha3\":\"ZMB\",\"region\":\"Africa\"},{\"name\":\"Zimbabwe\",\"alpha2\":\"ZW\",\"alpha3\":\"ZWE\",\"region\":\"Africa\"},{\"name\":\"Byteland PROD\",\"alpha2\":\"YY\",\"alpha3\":\"YYY\",\"region\":\"Europe\"}];", + "", + "", + "const codesToCheck = ['RU', 'SK', 'YY'];", + "", + "codesToCheck.forEach(function (code) {", + " pm.test(`Get country \"${code}\" [existing]`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/countries/\" + code;", + "", + " pm.sendRequest(url, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, countrySchema), \"Invalid JSON schema\").to.be.true;", + "", + " const expected = countries.find((c) => c.alpha2 == code);", + "", + " console.log(\"got\", resp, \"expected\", expected);", + " pm.expect(resp).to.deep.eq(expected, `Got invalid object`);", + " });", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get country by alpha2 [not found]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const unknownCodes = ['UU', 'PP', 'GJ'];", + "", + "unknownCodes.forEach(function (code) {", + " pm.test(`Get country \"${code}\" [non-existing]`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/countries/\" + code;", + "", + " pm.sendRequest(url, function (err, response) {", + " pm.test(\"Validate response [Not Found expected]\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(404, \"Invalid response code status\");", + " });", + " });", + " });", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "03/auth/registration", + "item": [ + { + "name": "Register a user [basic]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey2',", + " 'email': 'yellowstone1980@you.ru',", + " 'password': '$aba4821FWfew01#.fewA$',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+74951239922',", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'yellowMonkey2',", + " 'email': 'yellowstone1980@you.ru',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+74951239922',", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " console.log(\"got\", resp, \"expected\", profile);", + " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register a user [without optional fields]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'redGoat',", + " 'email': 'redGoat@you.ru',", + " 'password': 'PWD@few29aaa',", + " 'countryCode': 'KZ',", + " 'isPublic': true,", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'redGoat',", + " 'email': 'redGoat@you.ru',", + " 'countryCode': 'KZ',", + " 'isPublic': true,", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " console.log(\"got\", resp, \"expected\", profile);", + " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register a duplicated user [error]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const cases = [", + " {", + " 'conflict': 'login',", + " 'body': {", + " 'login': 'yellowMonkey2',", + " 'email': 'yellowstone12392@you.ru',", + " 'password': '$aba4821FWfew01#.fewA$',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " }", + " },", + " {", + " 'conflict': 'email',", + " 'body': {", + " 'login': 'spiderman',", + " 'email': 'yellowstone1980@you.ru',", + " 'password': '$991jjFFF#.fewA$',", + " 'countryCode': 'LV',", + " 'isPublic': true,", + " }", + " },", + " {", + " 'conflict': 'phone',", + " 'body': {", + " 'login': 'mickeymouse',", + " 'email': 'mickeymouse@you.ru',", + " 'password': '$1kewofew!#.fewA$',", + " 'countryCode': 'MG',", + " 'isPublic': true,", + " 'phone': '+74951239922',", + " }", + " }", + "];", + "", + "cases.forEach(function (data) {", + " pm.test(`Register a user with duplicated ${data.conflict}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify(data.body)", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [expect conflict on ${data.conflict}]`, () => {", + " var resp = response.json();", + " ", + " console.log('Tried to register a user', data.body);", + " pm.expect(response.code).to.be.eq(409, \"Invalid response code status (expected 409 due to openapi.yml line #163\");", + " });", + " });", + " });", + "});", + "", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register a user with not strong enough password", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const passwords = [", + " 'sH0r#',", + " '#onlylowercase1$',", + " '@UPPERCASE1!',", + " 'NoDigitsAtAll'", + "];", + "", + "passwords.forEach(function (password) {", + " pm.test(`Register a user with not strong enough password \"${password}\"`, () => {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'passwordkitten',", + " 'email': 'kitty@gmail.com',", + " 'password': password,", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [password ${password}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(400, \"Invalid response code status (expected 400 due to openapi.yml line #842\");", + " });", + " });", + "});", + "", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register a user from non-existing country", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Register a user from non-existing country\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'MIMMIMI',", + " 'email': 'feowio321@you.ru',", + " 'password': '$GGAAAzzo3#.fewA$',", + " 'countryCode': 'UU',", + " 'isPublic': true,", + " 'phone': '+3742371919',", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response [expect error]\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(400, \"Invalid response code status (expected 400 due to openapi.yml line #151\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "04/auth/sign-in", + "item": [ + { + "name": "Register a user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey200',", + " 'email': 'yellowstone2000@gmail.com',", + " 'password': '$PASSw0rd^',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + " 'phone': '+74951439922',", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'yellowMonkey200',", + " 'email': 'yellowstone2000@gmail.com',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + " 'phone': '+74951439922',", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey200',", + " 'password': '$PASSw0rd^',", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " console.log('Token', resp.token);", + " pm.expect(resp.token).to.have.lengthOf.above(19, \"Violated requirements on minimum token length (openapi.yml line #206)\");", + "", + " const previousToken = resp.token;", + "", + " setTimeout(() => {", + " pm.test('Sign in one more time to check if tokens are unique', () => {", + " pm.sendRequest(options, function (err, response) {", + " pm.test('Validate response [expect a new token]', () => {", + " var newResp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(newResp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " const newToken = newResp.token;", + " console.log('previous token', previousToken);", + " console.log('new token', newToken);", + "", + " pm.expect(newToken).to.not.equal(previousToken, \"Tokens have to be unique (openapi.yml line #174)\");", + " });", + " });", + " });", + " }, 1000);", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in with invalid login", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Sign in with invalid credentials\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey201',", + " 'password': '$PASSw0rd^',", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status (openapi.yml line #211)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in with invalid password", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Sign in with invalid credentials\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey200',", + " 'password': 'Ewfffl0',", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status (openapi.yml line #211)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "05/me", + "item": [ + { + "name": "Register a user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey335',", + " 'email': 'iamnotayellowmonkey@gmail.com',", + " 'password': '$PASSw0rd^',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'yellowMonkey335',", + " 'email': 'iamnotayellowmonkey@gmail.com',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register another user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'billyJean',", + " 'email': 'billyJean@gmail.com',", + " 'password': 'Password0',", + " 'countryCode': 'UG',", + " 'isPublic': true,", + " 'phone': '+1999999999'", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'billyJean',", + " 'email': 'billyJean@gmail.com',", + " 'countryCode': 'UG',", + " 'isPublic': true,", + " 'phone': '+1999999999'", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.expect(resp).to.deep.eq(profile, `Got invalid object`);", + " pm.globals.set(\"05_taken_phone\", resp.phone);", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey335',", + " 'password': '$PASSw0rd^',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.globals.set(\"05_profile_token\", resp.token);", + " console.log(\"Token has been saved\", resp.token)", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get my profile", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const profile = {", + " 'login': 'yellowMonkey335',", + " 'email': 'iamnotayellowmonkey@gmail.com',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + "};", + "const token = pm.globals.get(\"05_profile_token\");", + "", + "pm.test(\"Get profile\", function () {", + " console.log('Getting profile with token', token);", + " ", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate profile\", () => {", + " var resp = response.json();", + "", + " console.log(\"Got profile\", resp);", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp).to.deep.eq(profile, \"Invalid profile\");", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get my profile with invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const tokens = [", + " '',", + " 'blahblahfewufojweiiojfweifwejiojfweioj'", + "];", + "", + "tokens.forEach(function (token) {", + " pm.test(`Get profile with invalid token \"${token}\"`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status (openapi.yml line #233)\");", + " });", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Patch profile", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const oldProfile = {", + " 'login': 'yellowMonkey335',", + " 'email': 'iamnotayellowmonkey@gmail.com',", + " 'countryCode': 'BY',", + " 'isPublic': true,", + "};", + "const patchData = {", + " 'countryCode': 'YY',", + " 'isPublic': false,", + " 'phone': '+4821930125',", + " 'image': 'https://http.cat/images/200.jpg',", + "};", + "const expected = {", + " 'login': 'yellowMonkey335',", + " 'email': 'iamnotayellowmonkey@gmail.com',", + " 'countryCode': 'YY',", + " 'isPublic': false,", + " 'phone': '+4821930125',", + " 'image': 'https://http.cat/images/200.jpg',", + "};", + "", + "const token = pm.globals.get(\"05_profile_token\");", + "", + "pm.test(\"Patch profile\", function () {", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'PATCH',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify(patchData)", + " }", + " };", + "", + " console.log('Patch data', patchData);", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " console.log('Got profile', resp);", + " console.log('Expected', expected);", + "", + " pm.expect(resp).to.deep.eq(expected, 'Invalid profile');", + "", + " pm.test('Patch with the same data one more time', () => {", + " pm.sendRequest(options, function (err, response) {", + " pm.test('Validate response, no conflicts expected as the phone is used by the same user ', () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " console.log('Got profile', resp);", + " console.log('Expected', expected);", + "", + " pm.expect(resp).to.deep.eq(expected, 'Invalid profile');", + " });", + " });", + " });", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Patch profile with conflict", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const patchData = {", + " 'phone': '+1999999999',", + "};", + "const token = pm.globals.get(\"05_profile_token\");", + "", + "pm.test(\"Patch profile and expect conflict\", function () {", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'PATCH',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify(patchData)", + " }", + " };", + "", + " console.log('Patch data', patchData);", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(409, \"Invalid response code status (openapi.yml line #300)\");", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Patch profile with a non-existing country", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const patchData = {", + " 'countryCode': 'UU',", + "};", + "const token = pm.globals.get(\"05_profile_token\");", + "", + "pm.test(\"Patch profile with a non-existing country\", function () {", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'PATCH',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify(patchData)", + " }", + " };", + "", + " console.log('Patch data', patchData);", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(400, \"Invalid response code status (openapi.yml line #288)\");", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "06/profiles", + "item": [ + { + "name": "Register a user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'bloodmary',", + " 'email': 'bloodmary@ya.ru',", + " 'password': '$ab1a4821FWfew01#.fewA$',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+73121239992',", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'bloodmary',", + " 'email': 'bloodmary@ya.ru',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+73121239992',", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Register other user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'otherUser1234',", + " 'email': 'otherUser1234@you.ru',", + " 'password': '$1ab1221F23fdWfew01#.fewA$',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+71111239922',", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'otherUser1234',", + " 'email': 'otherUser1234@you.ru',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+71111239922',", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'bloodmary',", + " 'password': '$ab1a4821FWfew01#.fewA$',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.globals.set(\"06_profile_token\", resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get other user profile", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Get other user profile\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/profiles/otherUser1234\";", + " const token = pm.globals.get(\"06_profile_token\");", + " var options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.expect(resp.login).to.be.eq(\"otherUser1234\", \"Invalid login\");", + " pm.expect(resp.email).to.be.eq(\"otherUser1234@you.ru\", \"Invalid email\");", + " pm.expect(resp.countryCode).to.be.eq(\"RU\", \"Invalid countryCode\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get profile with invalid token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const tokens = [", + " '',", + " 'blahblahfewufojweiiojfweifwejiojfweioj'", + "];", + "", + "tokens.forEach(function (token) {", + " pm.test(`Get profile with invalid token \"${token}\"`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/profiles/otherUser1234\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status (openapi.yml line #332)\");", + " });", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get a non-existing user's profile", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"06_profile_token\");", + "", + "pm.test(`Get a non-existing profile \"${token}\"`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/profiles/iDoesntExist\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " pm.expect(response.code).to.be.eq(403, \"Invalid response code status (openapi.yml line #339)\");", + " });", + " });", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "07/password", + "item": [ + { + "name": "Register a user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"profile\": {", + " \"type\": \"object\",", + " \"description\": \"Информация о профиле пользователя\",", + " \"properties\": {", + " \"login\": {", + " \"type\": \"string\",", + " \"description\": \"Логин пользователя\",", + " \"maxLength\": 30,", + " \"pattern\": \"[a-zA-Z0-9-]+\"", + " },", + " \"email\": {", + " \"type\": \"string\",", + " \"description\": \"E-mail пользователя\",", + " \"maxLength\": 50", + " },", + " \"countryCode\": {", + " \"type\": \"string\",", + " \"description\": \"Двухбуквенный код, уникально идентифицирующий страну\",", + " \"maxLength\": 2,", + " \"pattern\": \"[a-zA-Z]{2}\"", + " },", + " \"isPublic\": {", + " \"type\": \"boolean\",", + " \"description\": \"Является ли данный профиль публичным. \\n\\nПубличные профили доступны другим пользователям: если профиль публичный, любой пользователь платформы сможет получить информацию о пользователе.\\n\"", + " },", + " \"phone\": {", + " \"type\": \"string\",", + " \"description\": \"Номер телефона пользователя в формате +123456789\",", + " \"pattern\": \"\\\\+[\\\\d]+\"", + " },", + " \"image\": {", + " \"type\": \"string\",", + " \"description\": \"Ссылка на фото для аватара пользователя\",", + " \"maxLength\": 200", + " }", + " },", + " \"required\": [", + " \"login\",", + " \"email\",", + " \"countryCode\",", + " \"isPublic\"", + " ]", + " }", + " },", + " \"required\": [", + " \"profile\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Register a user\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey2023',", + " 'email': 'yellowMonkey2023@you.ru',", + " 'password': '$oldPassword0',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+74951239223',", + " })", + " }", + " };", + "", + " const profile = {", + " 'profile': {", + " 'login': 'yellowMonkey2023',", + " 'email': 'yellowMonkey2023@you.ru',", + " 'countryCode': 'RU',", + " 'isPublic': true,", + " 'phone': '+74951239223',", + " }", + " }", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.oneOf([201, 409], \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey2023',", + " 'password': '$oldPassword0',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.globals.set(\"07_profile_token\", resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Change password [invalid token]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Update password with invalid token\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/me/updatePassword\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer invalidTOKENjfewoijfiowej`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'oldPassword': '$oldPassword0',", + " 'newPassword': '$aba4821FWTYR^%#.fewA$',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate get other user profile response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Change password [invalid old password]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Update password with invalid old password\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/me/updatePassword\";", + " const token = pm.globals.get(\"07_profile_token\");", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'oldPassword': 'lolL0L',", + " 'newPassword': '$aba4821FWTYR^%#.fewA$',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(403, \"Invalid response code status (invalid old password)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Change password [not strong enough]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const passwords = [", + " 'sH0r#',", + " '#onlylowercase1$',", + " '@UPPERCASE1!',", + " 'NoDigitsAtAll'", + "];", + "const token = pm.globals.get(\"07_profile_token\");", + "", + "passwords.forEach(function (password) {", + " pm.test(`Update password with not strong enough password \"${password}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/me/updatePassword\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'oldPassword': '$oldPassword0',", + " 'newPassword': password,", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response (for password \"${password}\")`, () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(400, \"Invalid response code status (not strong enough password, openapi.yml line #387)\");", + " });", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Change password", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Update password\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/me/updatePassword\";", + " const token = pm.globals.get(\"07_profile_token\");", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'oldPassword': '$oldPassword0',", + " 'newPassword': '#newPassword1',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate get other user profile response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in with old password", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey2023',", + " 'password': '$oldPassword0',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in with new password", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var schema = {", + " \"type\": \"object\",", + " \"properties\": {", + " \"token\": {", + " \"type\": \"string\",", + " \"description\": \"Сгенерированный токен пользователя\",", + " \"minLength\": 20,", + " }", + " },", + " \"required\": [", + " \"token\"", + " ],", + " \"$schema\": \"http://json-schema.org/draft-04/schema#\"", + "};", + "", + "setTimeout(() => {", + " pm.test(\"Sign in\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'yellowMonkey2023',", + " 'password': '#newPassword1',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " pm.expect(tv4.validate(resp, schema), \"Invalid JSON schema\").to.be.true;", + "", + " pm.globals.set(\"07_profile_new_token\", resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + " });", + "}, 1000); // Wait until new second to guarantee token uniquiness ", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get my profile with new token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"07_profile_new_token\");", + "", + "pm.test(\"Get profile\", function () {", + " console.log('Getting profile with token', token);", + " ", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " console.log(\"Got profile\", resp);", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp.login).to.be.eq(\"yellowMonkey2023\", \"Invalid login\");", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get my profile with old token", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"07_profile_token\");", + "", + "pm.test(\"Get profile\", function () {", + " console.log('Getting profile with token', token);", + " ", + " const url = pm.variables.get(\"base_url\") + \"/me/profile\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " console.log(\"Got profile\", resp);", + " pm.expect(response.code).to.be.eq(401, \"Invalid response code status (old token has to be invalidated)\");", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "08/friends", + "item": [ + { + "name": "Register users", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const users = [", + " {", + " 'login': 'user1',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user2',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user3',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user4',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user5',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user6',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user7',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'Alice',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'Bob',", + " 'isPublic': false,", + " },", + "]", + "", + "users.forEach(function (userData) {", + " pm.test(`Register user \"${userData.login}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': userData.login,", + " 'email': userData.login + 'reg@yahoo.com',", + " 'password': 'Strong0!',", + " 'countryCode': 'RU',", + " 'isPublic': userData.isPublic,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [user ${userData.login}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "users = [", + " 'Alice',", + " 'Bob',", + "]", + "", + "users.forEach(function (user) {", + " pm.test(`Sign in as ${user}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': user,", + " 'password': 'Strong0!',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.globals.set(\"08_friends_token_\" + user, resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Friends add / remove", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const log = [", + " {", + " 'login': 'user1',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user2',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user3',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user4',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user5',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user5',", + " 'action': 'remove',", + " },", + " {", + " 'login': 'user2',", + " 'action': 'remove',", + " },", + " {", + " 'login': 'user4',", + " 'action': 'remove',", + " },", + " {", + " 'login': 'user6',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user5',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user7',", + " 'action': 'add',", + " },", + " {", + " 'login': 'user2',", + " 'action': 'add',", + " },", + "];", + "// user1, user3, user6, user5, user7, user2", + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "var friendList = [];", + "", + "let promises = [];", + "let resolves = [];", + "for (var i = 0; i < log.length; i++) {", + " promises.push(new Promise((resolve) => {", + " resolves.push(resolve);", + " }));", + "}", + "", + "function testAction(idx) {", + " if (idx >= log.length) {", + " return;", + " }", + "", + " const op = log[idx];", + "", + " pm.test(`Friends action: ${op.action} \"${op.login}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/\" + op.action;", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': op.login,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [${op.action} \"${op.login}\"}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " if (op.action == 'add') {", + " friendList.push(op.login);", + " } else {", + " const index = friendList.indexOf(op.login);", + " if (index !== -1) {", + " friendList.splice(index, 1);", + " }", + " }", + "", + " console.log('Actual friend list', friendList);", + "", + " resolves[idx]();", + "", + " testAction(idx + 1);", + " });", + " });", + " });", + "}", + "", + "testAction(0);", + "", + "async function waitAll() {", + " const result = await Promise.all(promises);", + " console.log('Finish waiting');", + "}", + "waitAll();", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Friend list with pagination", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const querystring = require('querystring');", + "", + "const params = [", + " {", + " 'offset': 0,", + " 'limit': 3,", + " },", + " {", + " 'offset': 3,", + " 'limit': 3,", + " },", + " {", + " 'offset': null,", + " 'limit': 10,", + " },", + " {", + " 'offset': 1,", + " 'limit': 2,", + " },", + " {", + " 'offset': 0,", + " 'limit': 4,", + " },", + " {", + " 'offset': 4,", + " 'limit': 4,", + " },", + " {", + " 'offset': 8,", + " 'limit': 4,", + " },", + " {", + " 'offset': 3,", + " 'limit': null,", + " },", + " {", + " 'offset': null,", + " 'limit': null,", + " },", + " {", + " 'offset': 5,", + " 'limit': 1,", + " },", + "];", + "// user1, user3, user6, user5, user7, user2", + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "var expected = [\"user2\", \"user7\", \"user5\", \"user6\", \"user3\", \"user1\"];", + "", + "params.forEach(function (page) {", + " pm.test(`Get friends [offset ${page.offset}, limit ${page.limit}]`, function () {", + " var data = {};", + " if (page.offset != null) {", + " data['offset'] = page.offset;", + " }", + " if (page.limit != null) {", + " data['limit'] = page.limit;", + " }", + " const query = querystring.stringify(data);", + "", + " var url = pm.variables.get(\"base_url\") + \"/friends\";", + " if (query.length > 0) {", + " url += `?${query}`;", + " }", + "", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [offset ${page.offset}, limit ${page.limit}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " var offset = page.offset;", + " if (offset == null) {", + " offset = 0;", + " }", + "", + " var limit = page.limit;", + " if (limit == null) {", + " limit = 5;", + " }", + "", + " const start = Math.min(offset, expected.length);", + " const end = Math.min(offset + limit, expected.length);", + " pm.expect(resp).to.have.lengthOf(end - start, \"Invalid response array length\");", + "", + " for (var i = start; i < end; i++) {", + " const idx = i - start;", + " pm.expect(resp[idx].login).to.be.eq(expected[i], `Invalid login of user #${idx}`);", + " }", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Add a non-existing user", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "pm.test(`Add to friends a user that doesn't exist`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/add\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': \"IDoesntExist\",", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(404, \"Invalid response code status (openapi.yml line #450)\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Remove users that are not friends", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "pm.test(`Remove a user that is not a friend`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/remove\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'Bob',", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get private profile [failure]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "pm.test(\"Get private profile without permission\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/profiles/Bob\";", + " var options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(403, \"Invalid response code status (profile is private and Alice is not a friend of Bob)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Bob adds Alice to friends", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"08_friends_token_Bob\");", + "", + "pm.test(\"Bob adds Alice to friends and opens his profile to her\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/add\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'Alice',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get private profile [success]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"08_friends_token_Alice\");", + "", + "pm.test(\"Get private profile WITH permission (now Alice is a friend of Bob)\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/profiles/Bob\";", + " var options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp.login).to.be.eq(\"Bob\", \"Invalid login\");", + " pm.expect(resp.email).to.be.eq(\"Bobreg@yahoo.com\", \"Invalid email\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "09/posts/publish", + "item": [ + { + "name": "Register users", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const users = [", + " {", + " 'login': 'Harry',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'Ron',", + " 'isPublic': false,", + " },", + "]", + "", + "users.forEach(function (userData) {", + " pm.test(`Register user \"${userData.login}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': userData.login,", + " 'email': userData.login + 'reg@yahoo.com',", + " 'password': 'Strong0!',", + " 'countryCode': 'RU',", + " 'isPublic': userData.isPublic,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [user ${userData.login}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "users = [", + " 'Harry',", + " 'Ron',", + "]", + "", + "users.forEach(function (user) {", + " pm.test(`Sign in as ${user}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': user,", + " 'password': 'Strong0!',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.globals.set(\"09_token_\" + user, resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Publish posts", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const posts = [", + " {", + " 'login': 'Harry',", + " 'content': 'Это мой первый пост!',", + " 'tags': ['первый', 'самара'],", + " },", + " {", + " 'login': 'Harry',", + " 'content': 'А это второй!',", + " 'tags': ['новичок'],", + " },", + " {", + " 'login': 'Harry',", + " 'content': 'Ребята, можете подсказать, теслу надо закупать или нет? Бум уже прошел?',", + " 'tags': ['moex', 'tesla', 'советы'],", + " },", + " {", + " 'login': 'Harry',", + " 'content': 'ТЕСЛА ДАЛА +20% ЗА СУТКИ, А Я ТАК И НЕ КУПИЛ, ВОТ БЛИН!!!!',", + " 'tags': ['fail', 'tesla'],", + " },", + " {", + " 'login': 'Ron',", + " 'content': 'Чтобы быть таким же успешным как я, надо каждый день покупать... Пост приватный!',", + " 'tags': ['private'],", + " },", + "];", + "", + "let promises = [];", + "let resolves = [];", + "for (var i = 0; i < posts.length; i++) {", + " promises.push(new Promise((resolve) => {", + " resolves.push(resolve);", + " }));", + "}", + "", + "function recPublish(idx) {", + " console.log(`Running iteration ${idx}`);", + "", + " if (idx >= posts.length) {", + " console.log(`Stop iterating`);", + " return;", + " }", + "", + " const post = posts[idx];", + " const token = pm.globals.get(`09_token_${post.login}`);", + "", + " pm.test(`Publish a post from \"${post.login}\" #${idx}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/posts/new\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'content': post.content,", + " 'tags': post.tags,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [\"${post.login}\" #${idx}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " console.log('A new post has been published', resp);", + "", + " pm.expect(resp.content).to.be.eq(post.content, 'Invalid content');", + " pm.expect(resp.tags).to.have.lengthOf(post.tags.length, 'Invalid tags');", + " pm.expect(resp.author).to.be.eq(post.login, 'Invalid author');", + "", + " pm.globals.set(`09_post_id_${idx}`, resp.id);", + "", + " resolves[idx]();", + "", + " recPublish(idx + 1);", + " });", + " });", + " });", + "}", + "", + "recPublish(0);", + "", + "async function waitAll() {", + " const result = await Promise.all(promises);", + " console.log('Finish waiting');", + "}", + "waitAll();", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get public posts", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var posts = [", + " {", + " 'id': pm.globals.get('09_post_id_0'),", + " 'content': 'Это мой первый пост!',", + " 'tags': ['первый', 'самара'],", + " },", + " {", + " 'id': pm.globals.get('09_post_id_1'),", + " 'content': 'А это второй!',", + " 'tags': ['новичок'],", + " },", + " {", + " 'id': pm.globals.get('09_post_id_2'),", + " 'content': 'Ребята, можете подсказать, теслу надо закупать или нет? Бум уже прошел?',", + " 'tags': ['moex', 'tesla', 'советы'],", + " },", + " {", + " 'id': pm.globals.get('09_post_id_3'),", + " 'content': 'ТЕСЛА ДАЛА +20% ЗА СУТКИ, А Я ТАК И НЕ КУПИЛ, ВОТ БЛИН!!!!',", + " 'tags': ['fail', 'tesla'],", + " },", + "];", + "", + "const users = [", + " 'Harry',", + " 'Ron',", + "]", + "", + "users.forEach(function (user) {", + " posts.forEach(function (post) {", + " const token = pm.globals.get(`09_token_${user}`);", + " ", + " pm.test(`Get public post by ID ${post.id} (on behalf of ${user})`, function () {", + " var url = pm.variables.get(\"base_url\") + `/posts/${post.id}`;", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [${post.id} (on behalf of ${user})]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp.content).to.be.eq(post.content, 'Invalid content');", + " pm.expect(resp.tags).to.have.lengthOf(post.tags.length, 'Invalid tags');", + " pm.expect(resp.author).to.be.eq('Harry', 'Invalid author');", + " });", + " });", + " });", + " });", + "});", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get a private post [failure]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(`09_token_Harry`);", + "const postId = pm.globals.get('09_post_id_4');", + "", + "pm.test(`Harry tries to fetch a Ron's post by ID ${postId} while they are not friends`, function () {", + " var url = pm.variables.get(\"base_url\") + `/posts/${postId}`;", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(404, \"Invalid response code status (openapi.yml line #594)\");", + " });", + " });", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Ron adds Harry to friends", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"09_token_Ron\");", + "", + "pm.test(\"Ron adds Harry to friends and opens his posts to a new friend\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/add\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'Harry',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get a private post [success]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(`09_token_Harry`);", + "const postId = pm.globals.get('09_post_id_4');", + "", + "pm.test(`Harry tries to fetch a Ron's post by ID ${postId}, but they are friends now`, function () {", + " var url = pm.variables.get(\"base_url\") + `/posts/${postId}`;", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status (openapi.yml line #594)\");", + "", + " pm.expect(resp.author).to.be.eq('Ron', 'Invalid author');", + " });", + " });", + "});", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "10/posts/feed", + "item": [ + { + "name": "Register users", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const users = [", + " {", + " 'login': 'Diana',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'William',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'Charles',", + " 'isPublic': false,", + " }", + "]", + "", + "users.forEach(function (userData) {", + " pm.test(`Register user \"${userData.login}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': userData.login,", + " 'email': userData.login + 'reg@yahoo.com',", + " 'password': 'Strong0!',", + " 'countryCode': 'RU',", + " 'isPublic': userData.isPublic,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [user ${userData.login}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "users = [", + " 'Diana',", + " 'William',", + " 'Charles',", + "]", + "", + "users.forEach(function (user) {", + " pm.test(`Sign in as ${user}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': user,", + " 'password': 'Strong0!',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.globals.set(\"10_token_\" + user, resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Publish posts", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const posts = [", + " {", + " 'login': 'Diana',", + " 'content': 'Это мой первый пост!',", + " 'tags': ['первый', 'самара'],", + " },", + " {", + " 'login': 'Diana',", + " 'content': 'А это второй!',", + " 'tags': ['новичок'],", + " },", + " {", + " 'login': 'Diana',", + " 'content': 'Ребята, можете подсказать, теслу надо закупать или нет? Бум уже прошел?',", + " 'tags': ['moex', 'tesla', 'советы'],", + " },", + " {", + " 'login': 'Charles',", + " 'content': 'Пожалуй, останусь в тени, и доступа не будет даже у членов семьи!',", + " 'tags': ['royal'],", + " },", + " {", + " 'login': 'Diana',", + " 'content': 'ТЕСЛА ДАЛА +20% ЗА СУТКИ, А Я ТАК И НЕ КУПИЛ, ВОТ БЛИН!!!!',", + " 'tags': ['fail', 'tesla'],", + " },", + " {", + " 'login': 'Diana',", + " 'content': 'Чтобы быть таким же успешным как я, надо каждый день покупать... Пост приватный!',", + " 'tags': ['private'],", + " },", + " {", + " 'login': 'Diana',", + " 'content': 'Покупайте акции английской королевской семьи!',", + " 'tags': ['royal'],", + " },", + " {", + " 'login': 'William',", + " 'content': 'У меня тоже есть фид!',", + " 'tags': ['royal'],", + " },", + " {", + " 'login': 'William',", + " 'content': 'И я тоже планирую в него что-то да постить!',", + " 'tags': ['royal'],", + " }", + "];", + "", + "let promises = [];", + "let resolves = [];", + "for (var i = 0; i < posts.length; i++) {", + " promises.push(new Promise((resolve) => {", + " resolves.push(resolve);", + " }));", + "}", + "", + "function recPublish(idx) {", + " if (idx >= posts.length) {", + " return;", + " }", + "", + " const post = posts[idx];", + " const token = pm.globals.get(`10_token_${post.login}`);", + "", + " pm.test(`Publish a post from \"${post.login}\" #${idx}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/posts/new\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'content': post.content,", + " 'tags': post.tags,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [\"${post.login}\" #${idx}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " console.log('A new post has been published', resp);", + "", + " pm.expect(resp.content).to.be.eq(post.content, 'Invalid content');", + " pm.expect(resp.tags).to.have.lengthOf(post.tags.length, 'Invalid tags');", + " pm.expect(resp.author).to.be.eq(post.login, 'Invalid author');", + "", + " resolves[idx]();", + "", + " recPublish(idx + 1);", + " });", + " });", + " });", + "}", + "", + "recPublish(0);", + "", + "async function waitAll() {", + " const result = await Promise.all(promises);", + " console.log('Finish waiting');", + "}", + "waitAll();", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get Diana's feed with pagination", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const querystring = require('querystring');", + "", + "const expected = [", + " {", + " 'content': 'Покупайте акции английской королевской семьи!',", + " 'tags': ['royal'],", + " },", + " {", + " 'content': 'Чтобы быть таким же успешным как я, надо каждый день покупать... Пост приватный!',", + " 'tags': ['private'],", + " },", + " {", + " 'content': 'ТЕСЛА ДАЛА +20% ЗА СУТКИ, А Я ТАК И НЕ КУПИЛ, ВОТ БЛИН!!!!',", + " 'tags': ['fail', 'tesla'],", + " },", + " {", + " 'content': 'Ребята, можете подсказать, теслу надо закупать или нет? Бум уже прошел?',", + " 'tags': ['moex', 'tesla', 'советы'],", + " },", + " {", + " 'content': 'А это второй!',", + " 'tags': ['новичок'],", + " },", + " {", + " 'content': 'Это мой первый пост!',", + " 'tags': ['первый', 'самара'],", + " },", + "];", + "", + "const params = [", + " {", + " 'offset': 0,", + " 'limit': 3,", + " },", + " {", + " 'offset': 3,", + " 'limit': 3,", + " },", + " {", + " 'offset': null,", + " 'limit': 10,", + " },", + " {", + " 'offset': 1,", + " 'limit': 2,", + " },", + " {", + " 'offset': 0,", + " 'limit': 4,", + " },", + " {", + " 'offset': 4,", + " 'limit': 4,", + " },", + " {", + " 'offset': 8,", + " 'limit': 4,", + " },", + " {", + " 'offset': 3,", + " 'limit': null,", + " },", + " {", + " 'offset': null,", + " 'limit': null,", + " },", + " {", + " 'offset': 5,", + " 'limit': 1,", + " },", + "];", + "", + "const token = pm.globals.get(\"10_token_Charles\");", + "", + "params.forEach(function (page) {", + " pm.test(`Charles fetches Diana's feed [offset ${page.offset}, limit ${page.limit}]`, function () {", + " var data = {};", + " if (page.offset != null) {", + " data['offset'] = page.offset;", + " }", + " if (page.limit != null) {", + " data['limit'] = page.limit;", + " }", + " const query = querystring.stringify(data);", + "", + " var url = pm.variables.get(\"base_url\") + \"/posts/feed/Diana\";", + " if (query.length > 0) {", + " url += `?${query}`;", + " }", + "", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [offset ${page.offset}, limit ${page.limit}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " var offset = page.offset;", + " if (offset == null) {", + " offset = 0;", + " }", + "", + " var limit = page.limit;", + " if (limit == null) {", + " limit = 5;", + " }", + "", + " const start = Math.min(offset, expected.length);", + " const end = Math.min(offset + limit, expected.length);", + " pm.expect(resp).to.have.lengthOf(end - start, \"Invalid response array length\");", + "", + " for (var i = start; i < end; i++) {", + " const idx = i - start;", + "", + " pm.expect(resp[idx].author).to.be.eq('Diana', `Invalid author for post [#${idx}] ${resp[idx].id}`);", + " pm.expect(resp[idx].content).to.be.eq(expected[i].content, `Invalid content for post [#${idx}] ${resp[idx].id}`);", + " pm.expect(resp[idx].tags).to.have.lengthOf(expected[i].tags.length, `Invalid tags for post [#${idx}] ${resp[idx].id}`);", + " }", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "William gets his feed", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const querystring = require('querystring');", + "", + "const expected = [", + " {", + " 'content': 'И я тоже планирую в него что-то да постить!',", + " 'tags': ['royal'],", + " },", + " {", + " 'content': 'У меня тоже есть фид!',", + " 'tags': ['royal'],", + " }", + "];", + "", + "", + "const token = pm.globals.get(\"10_token_William\");", + "", + "pm.test(`William gets his feed`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/posts/feed/my\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp).to.have.lengthOf(expected.length, \"Invalid response array length\");", + "", + " for (var i = 0; i < expected.length; i++) {", + " pm.expect(resp[i].author).to.be.eq('William', `Invalid author for post [#${i}] ${resp[i].id}`);", + " pm.expect(resp[i].content).to.be.eq(expected[i].content, `Invalid content for post [#${i}] ${resp[i].id}`);", + " pm.expect(resp[i].tags).to.have.lengthOf(expected[i].tags.length, `Invalid tags for post [#${i}] ${resp[i].id}`);", + " }", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get Charles' feed [failure]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"10_token_William\");", + "", + "pm.test(`William gets Charles' feed, but they are not friends`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/posts/feed/Charles\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(404, \"Invalid response code status (openapi.yml line #668)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Charles adds William to friends", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"10_token_Charles\");", + "", + "pm.test(\"Charles adds William to friends and opens his posts to a new friend\", function () {", + " var url = pm.variables.get(\"base_url\") + \"/friends/add\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`,", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': 'William',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get Charles' feed [success]", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"10_token_William\");", + "", + "pm.test(`William gets Charles' feed, but THEY ARE FRIENDS now`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/posts/feed/Charles\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status (openapi.yml line #668)\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "11/posts/likes", + "item": [ + { + "name": "Register users", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const users = [", + " {", + " 'login': 'Joey',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'Peter',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user100',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user101',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user102',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user103',", + " 'isPublic': true,", + " },", + " {", + " 'login': 'user104',", + " 'isPublic': true,", + " }", + "]", + "", + "users.forEach(function (userData) {", + " pm.test(`Register user \"${userData.login}\"`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/register\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': userData.login,", + " 'email': userData.login + 'reg@yahoo.com',", + " 'password': 'Strong0!',", + " 'countryCode': 'RU',", + " 'isPublic': userData.isPublic,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [user ${userData.login}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(201, \"Invalid response code status\");", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Sign in", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "users = [", + " 'Joey',", + " 'Peter',", + " 'user100',", + " `user101`,", + " `user102`,", + " `user103`,", + " `user104`", + "]", + "", + "users.forEach(function (user) {", + " pm.test(`Sign in as ${user}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/auth/sign-in\";", + " var options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'login': user,", + " 'password': 'Strong0!',", + " })", + " }", + " };", + " ", + " pm.sendRequest(options, function (err, response) {", + " pm.test(\"Validate sign-in response\", () => {", + " var resp = response.json();", + "", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.globals.set(\"11_token_\" + user, resp.token);", + " console.log(\"Token has been saved\")", + " });", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Publish posts", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const posts = [", + " {", + " 'login': 'Joey',", + " 'content': 'Это мой первый пост! Накидайте реакций!',", + " 'tags': ['первый', 'казань'],", + " }", + "];", + "", + "let promises = [];", + "let resolves = [];", + "for (var i = 0; i < posts.length; i++) {", + " promises.push(new Promise((resolve) => {", + " resolves.push(resolve);", + " }));", + "}", + "", + "function recPublish(idx) {", + " if (idx >= posts.length) {", + " return;", + " }", + "", + " const post = posts[idx];", + " const token = pm.globals.get(`11_token_${post.login}`);", + "", + " pm.test(`Publish a post from \"${post.login}\" #${idx}`, function () {", + " var url = pm.variables.get(\"base_url\") + \"/posts/new\";", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " body: {", + " mode: 'raw',", + " raw: JSON.stringify({", + " 'content': post.content,", + " 'tags': post.tags,", + " })", + " }", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [\"${post.login}\" #${idx}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " console.log('A new post has been published', resp);", + "", + " pm.expect(resp.content).to.be.eq(post.content, 'Invalid content');", + " pm.expect(resp.tags).to.have.lengthOf(post.tags.length, 'Invalid tags');", + " pm.expect(resp.author).to.be.eq(post.login, 'Invalid author');", + "", + " pm.globals.set(`11_post_id_${idx}`, resp.id);", + "", + " resolves[idx]();", + "", + " recPublish(idx + 1);", + " });", + " });", + " });", + "}", + "", + "recPublish(0);", + "", + "async function waitAll() {", + " const result = await Promise.all(promises);", + " console.log('Finish waiting');", + "}", + "waitAll();", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Like / dislike", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const log = [", + " {", + " 'login': 'Joey',", + " 'action': 'like',", + " },", + " {", + " 'login': 'user100',", + " 'action': 'dislike',", + " },", + " {", + " 'login': 'user101',", + " 'action': 'like',", + " },", + " {", + " 'login': 'user101',", + " 'action': 'like',", + " },", + " {", + " 'login': 'user102',", + " 'action': 'dislike',", + " },", + " {", + " 'login': 'user104',", + " 'action': 'like',", + " },", + " {", + " 'login': 'Peter',", + " 'action': 'dislike',", + " },", + " {", + " 'login': 'user103',", + " 'action': 'like',", + " },", + " {", + " 'login': 'Peter',", + " 'action': 'like',", + " },", + " {", + " 'login': 'Joey',", + " 'action': 'like',", + " },", + " {", + " 'login': 'Joey',", + " 'action': 'dislike',", + " },", + " {", + " 'login': 'user101',", + " 'action': 'like',", + " },", + " {", + " 'login': 'user102',", + " 'action': 'dislike',", + " },", + "];", + "", + "const postId = pm.globals.get(`11_post_id_0`);", + "var lastAction = new Map();", + "", + "let promises = [];", + "let resolves = [];", + "for (var i = 0; i < log.length; i++) {", + " promises.push(new Promise((resolve) => {", + " resolves.push(resolve);", + " }));", + "}", + "", + "function reproduceLog(idx) {", + " if (idx >= log.length) {", + " return;", + " }", + "", + " const op = log[idx];", + " const token = pm.globals.get(`11_token_${op.login}`);", + "", + " pm.test(`${op.login} ${op.action}s post with ID ${postId} [#${idx}]`, function () {", + " var url = pm.variables.get(\"base_url\") + `/posts/${postId}/` + op.action;", + " const options = {", + " url: url,", + " method: 'POST',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response [${op.login} ${op.action} #${idx}]`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp.content).to.be.eq('Это мой первый пост! Накидайте реакций!', 'Invalid content');", + " pm.expect(resp.author).to.be.eq('Joey', 'Invalid author');", + "", + " lastAction.set(op.login, op.action);", + " console.log('last actions', lastAction);", + "", + " let likes = 0;", + " let dislikes = 0;", + " for (let [key, value] of lastAction) {", + " if (value == 'like') {", + " likes++;", + " } else {", + " dislikes++;", + " }", + " }", + "", + " pm.expect(resp.likesCount).to.be.eq(likes, 'Invalid likes count');", + " pm.expect(resp.dislikesCount).to.be.eq(dislikes, 'Invalid dislikes count');", + "", + " resolves[idx]();", + "", + " reproduceLog(idx + 1);", + " });", + " });", + " });", + "}", + "", + "reproduceLog(0);", + "", + "async function waitAll() {", + " const result = await Promise.all(promises);", + " console.log('Finish waiting');", + "}", + "waitAll();", + "", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + }, + { + "name": "Get feed and check counters", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "const token = pm.globals.get(\"11_token_Joey\");", + "", + "pm.test(`Joey gets his feed`, function () {", + " const url = pm.variables.get(\"base_url\") + \"/posts/feed/my\";", + " const options = {", + " url: url,", + " method: 'GET',", + " header: {", + " 'Content-Type': 'application/json',", + " 'Authorization': `Bearer ${token}`", + " },", + " };", + "", + " pm.sendRequest(options, function (err, response) {", + " pm.test(`Validate response`, () => {", + " var resp = response.json();", + " ", + " pm.expect(response.code).to.be.eq(200, \"Invalid response code status\");", + "", + " pm.expect(resp).to.have.lengthOf(1, \"Invalid response array length\");", + "", + " pm.expect(resp[0].likesCount).to.be.eq(4, \"Invalid likes count\");", + " pm.expect(resp[0].dislikesCount).to.be.eq(3, \"Invalid dislikes count\");", + " });", + " });", + "});", + "", + "", + "" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{base_url}}/ping", + "host": [ + "{{base_url}}" + ], + "path": [ + "ping" + ] + } + }, + "response": [] + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "base_url", + "value": "http://localhost:8080/api", + "type": "default" + } + ] +} \ No newline at end of file