diff --git a/postman/sprint.json b/postman/sprint.json index 541e79a2..b8e2a2aa 100644 --- a/postman/sprint.json +++ b/postman/sprint.json @@ -1,9 +1,10 @@ { "info": { - "_postman_id": "e337606f-5df6-47d0-9784-7fa89c1b51fe", - "name": "sprint09/controllers-films-users", + "_postman_id": "0aad53da-5bc9-4a7d-9606-033da01c9027", + "name": "sprint10/controllers-films-users", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "2036415" + "_exporter_id": "23073145", + "_collection_link": "https://universal-shadow-295426.postman.co/workspace/My-Workspace~4200f6aa-0504-44b1-8a1d-707d0dcbd5ce/collection/23073145-0aad53da-5bc9-4a7d-9606-033da01c9027?action=share&source=collection_link&creator=23073145" }, "item": [ { @@ -16,6 +17,8 @@ "listen": "test", "script": { "exec": [ + "const source = JSON.parse(pm.request.body.raw)\r", + "\r", "pm.test(\"Status code is 200 or 201\", function () {\r", " pm.expect(pm.response.code).to.be.oneOf([200,201]);\r", "});\r", @@ -26,31 +29,70 @@ "pm.test(\"Test user 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('id');\r", - " pm.expect(jsonData.id, '\"id\" must be 1').to.eql(1);\r", "});\r", "pm.test(\"Test user 'email' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('email');\r", - " pm.expect(jsonData.email, '\"email\" must be \"mail@mail.ru\"').to.eql('mail@mail.ru');\r", + " pm.expect(jsonData.email, `\"email\" must be \"${source.mail}\"`).to.eql(source.email);\r", "});\r", "pm.test(\"Test user 'name' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('name');\r", - " pm.expect(jsonData.name, '\"name\" must be \"Nick Name\"').to.eql('Nick Name');\r", + " pm.expect(jsonData.name, `\"name\" must be \"${source.name}\"`).to.eql(source.name);\r", "});\r", "pm.test(\"Test user 'login' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('login');\r", - " pm.expect(jsonData.login, '\"login\" field must be \"dolore\"').to.eql('dolore'); \r", + " pm.expect(jsonData.login, `\"login\" field must be \"${source.login}\"`).to.eql(source.login); \r", "});\r", "pm.test(\"Test user 'birthday' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('birthday');\r", - " pm.expect(jsonData.birthday, '\"birthday\" field must be \"1946-08-20\"').to.eql('1946-08-20');\r", + " pm.expect(jsonData.birthday, `\"birthday\" field must be \"${source.birthday}\"`).to.eql(source.birthday);\r", "});" ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let user;\r", + " try {\r", + " user = rnd.getUser();\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify(user),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -250,6 +292,8 @@ "listen": "test", "script": { "exec": [ + "const source = pm.collectionVariables.get(\"user\")\r", + "\r", "pm.test(\"Status code is 200\", function () {\r", " pm.response.to.be.ok;\r", "});\r", @@ -260,7 +304,7 @@ "pm.test(\"Test user 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('id');\r", - " pm.expect(jsonData.id, '\"id\" must be 1').to.eql(1);\r", + " pm.expect(jsonData.id, `\"id\" must be ${source.id}`).to.eql(source.id);\r", "});\r", "pm.test(\"Test user 'email' field\", function () {\r", " var jsonData = pm.response.json();\r", @@ -285,6 +329,54 @@ ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let user;\r", + " try {\r", + " user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"user\", user);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify({\r", + " \"login\": \"doloreUpdate\",\r", + " \"name\": \"est adipisicing\",\r", + " \"id\": user.id,\r", + " \"email\": \"mail@yandex.ru\",\r", + " \"birthday\": \"1976-09-20\"\r", + " }),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -301,7 +393,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"login\": \"doloreUpdate\",\n \"name\": \"est adipisicing\",\n \"id\": 1,\n \"email\": \"mail@yandex.ru\",\n \"birthday\": \"1976-09-20\"\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -337,6 +429,54 @@ ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let user;\r", + " try {\r", + " user = await api.addUser(rnd.getUser());\r", + " pm.collectionVariables.set(\"user\", user);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify({\r", + " \"login\": \"doloreUpdate\",\r", + " \"name\": \"est adipisicing\",\r", + " \"id\": user.id+1,\r", + " \"email\": \"mail@yandex.ru\",\r", + " \"birthday\": \"1976-09-20\"\r", + " }),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -385,35 +525,12 @@ "pm.test(\"Test list user response\", function () {\r", " pm.response.to.be.withBody;\r", " pm.response.to.be.json;\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData.length, 'List length must be 1').to.eql(1);\r", "});\r", "pm.test(\"Test user[0] 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData[0]).to.have.property('id');\r", " pm.expect(jsonData[0].id, '\"id\" must be 1').to.eql(1);\r", "});\r", - "pm.test(\"Test user[0] 'email' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('email');\r", - " pm.expect(jsonData[0].email, '\"email\" must be \"mail@yandex.ru\"').to.eql('mail@yandex.ru');\r", - "});\r", - "pm.test(\"Test user[0] 'name' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('name');\r", - " pm.expect(jsonData[0].name, '\"name\" must be \"est adipisicing\"').to.eql('est adipisicing');\r", - "});\r", - "pm.test(\"Test user[0] 'login' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('login');\r", - " pm.expect(jsonData[0].login, '\"login\" field must be \"doloreUpdate\"').to.eql('doloreUpdate'); \r", - "});\r", - "pm.test(\"Test user[0] 'birthday' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('birthday');\r", - " pm.expect(jsonData[0].birthday, '\"birthday\" field must be \"1976-09-20\"').to.eql('1976-09-20');\r", - "});\r", - "\r", "" ], "type": "text/javascript" @@ -457,7 +574,6 @@ "pm.test(\"Test user 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('id');\r", - " pm.expect(jsonData.id, '\"id\" must be 2').to.eql(2);\r", "});\r", "pm.test(\"Test user 'email' field\", function () {\r", " var jsonData = pm.response.json();\r", @@ -530,6 +646,8 @@ "listen": "test", "script": { "exec": [ + "const source = JSON.parse(pm.request.body.raw)\r", + "\r", "pm.test(\"Status code is 200 or 201\", function () {\r", " pm.expect(pm.response.code).to.be.oneOf([200,201]);\r", "});\r", @@ -540,33 +658,72 @@ "pm.test(\"Test film 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('id');\r", - " pm.expect(jsonData.id, '\"id\" must be 1').to.eql(1);\r", "});\r", "pm.test(\"Test film 'name' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('name');\r", - " pm.expect(jsonData.name, '\"name\" must be \"nisi eiusmod\"').to.eql('nisi eiusmod');\r", + " pm.expect(jsonData.name, `\"name\" must be \"${source.name}\"`).to.eql(source.name);\r", "});\r", "pm.test(\"Test film 'description' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('description');\r", - " pm.expect(jsonData.description, '\"description\" must be \"adipisicing\"').to.eql('adipisicing');\r", + " pm.expect(jsonData.description, `\"description\" must be \"${source.description}\"`).to.eql(source.description);\r", "});\r", "pm.test(\"Test film 'releaseDate' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('releaseDate');\r", - " pm.expect(jsonData.releaseDate, '\"releaseDate\" field must be \"1967-03-25\"').to.eql('1967-03-25');\r", + " pm.expect(jsonData.releaseDate, `\"releaseDate\" field must be \"${source.releaseDate}\"`).to.eql(source.releaseDate);\r", "});\r", "pm.test(\"Test film 'duration' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('duration');\r", - " pm.expect(jsonData.duration, '\"duration\" field must be 100').to.eql(100); \r", + " pm.expect(jsonData.duration, `\"duration\" field must be %{source.duration}`).to.eql(source.duration); \r", "});\r", "\r", "" ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let film;\r", + " try {\r", + " film = rnd.getFilm();\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify(film),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -821,6 +978,8 @@ "listen": "test", "script": { "exec": [ + "const source = pm.collectionVariables.get(\"film\")\r", + "\r", "pm.test(\"Status code is 200\", function () {\r", " pm.response.to.be.ok;\r", "});\r", @@ -832,7 +991,7 @@ "pm.test(\"Test film 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData).to.have.property('id');\r", - " pm.expect(jsonData.id, '\"id\" must be 1').to.eql(1);\r", + " pm.expect(jsonData.id, `\"id\" must be ${source.id}`).to.eql(source.id);\r", "});\r", "pm.test(\"Test film 'name' field\", function () {\r", " var jsonData = pm.response.json();\r", @@ -859,6 +1018,55 @@ ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let user;\r", + " try {\r", + " film = await api.addFilm(rnd.getFilm());\r", + " pm.collectionVariables.set(\"film\", film);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify({\r", + " \"id\": film.id,\r", + " \"name\": \"Film Updated\",\r", + " \"releaseDate\": \"1989-04-17\",\r", + " \"description\": \"New film update decription\",\r", + " \"duration\": 190,\r", + " \"rate\": 4\r", + " }),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -875,7 +1083,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"id\": 1,\n \"name\": \"Film Updated\",\n \"releaseDate\": \"1989-04-17\",\n \"description\": \"New film update decription\",\n \"duration\": 190,\n \"rate\": 4\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -912,6 +1120,55 @@ ], "type": "text/javascript" } + }, + { + "listen": "prerequest", + "script": { + "exec": [ + "const main = async () => {\r", + " const api = new API(pm);\r", + " const rnd = new RandomUtils();\r", + "\r", + " let user;\r", + " try {\r", + " film = await api.addFilm(rnd.getFilm());\r", + " pm.collectionVariables.set(\"film\", film);\r", + " } catch(err) {\r", + " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", + " }\r", + "\r", + " pm.request.body.update({\r", + " mode: 'raw',\r", + " raw: JSON.stringify({\r", + " \"id\": film.id+1,\r", + " \"name\": \"Film Updated\",\r", + " \"releaseDate\": \"1989-04-17\",\r", + " \"description\": \"New film update decription\",\r", + " \"duration\": 190,\r", + " \"rate\": 4\r", + " }),\r", + " options: { raw: { language: 'json' } }\r", + " });\r", + "\r", + "};\r", + "\r", + "const interval = setInterval(() => {}, 1000);\r", + "\r", + "setTimeout(async () => \r", + " {\r", + " try {\r", + " await main();\r", + " } catch (e) {\r", + " console.error(e);\r", + " } finally {\r", + " clearInterval(interval);\r", + " }\r", + " }, \r", + " 100 \r", + ");" + ], + "type": "text/javascript" + } } ], "request": { @@ -928,7 +1185,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"id\": 9999,\n \"name\": \"Film Updated\",\n \"releaseDate\": \"1989-04-17\",\n \"description\": \"New film update decription\",\n \"duration\": 190,\n \"rate\": 4\n}", + "raw": "", "options": { "raw": { "language": "json" @@ -960,34 +1217,12 @@ "pm.test(\"Test list film response\", function () {\r", " pm.response.to.be.withBody;\r", " pm.response.to.be.json;\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData.length, 'List length must be 1').to.eql(1);\r", "});\r", "pm.test(\"Test film[0] 'id' field\", function () {\r", " var jsonData = pm.response.json();\r", " pm.expect(jsonData[0]).to.have.property('id');\r", " pm.expect(jsonData[0].id, '\"id\" must be 1').to.eql(1);\r", "});\r", - "pm.test(\"Test film[0] 'name' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('name');\r", - " pm.expect(jsonData[0].name, '\"name\" must be \"Film Updated\"').to.eql('Film Updated');\r", - "});\r", - "pm.test(\"Test film[0] 'description' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('description');\r", - " pm.expect(jsonData[0].description, '\"description\" must be \"New film update decription\"').to.eql('New film update decription');\r", - "});\r", - "pm.test(\"Test film[0] 'releaseDate' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('releaseDate');\r", - " pm.expect(jsonData[0].releaseDate, '\"releaseDate\" field must be \"1989-04-17\"').to.eql('1989-04-17');\r", - "});\r", - "pm.test(\"Test film[0] 'duration' field\", function () {\r", - " var jsonData = pm.response.json();\r", - " pm.expect(jsonData[0]).to.have.property('duration');\r", - " pm.expect(jsonData[0].duration, '\"duration\" field must be 190').to.eql(190); \r", - "});\r", "" ], "type": "text/javascript" @@ -1023,7 +1258,115 @@ "script": { "type": "text/javascript", "exec": [ - "" + "API = class {", + " constructor(postman, verbose = false, baseUrl = \"http://localhost:8080\") {", + " this.baseUrl = baseUrl;", + " this.pm = postman;", + " this._verbose = verbose;", + " }", + "", + " async addUser(user, verbose=null) {", + " return this.post(\"/users\", user, \"Ошибка при добавлении нового пользователя: \", verbose);", + " }", + "", + " async addFilm(film, verbose=null) {", + " return this.post(\"/films\", film, \"Ошибка при добавлении нового фильма: \", verbose);", + " }", + "", + " async addCategory(category, verbose=null) {", + " return this.post(\"/admin/categories\", category, \"Ошибка при добавлении новой категории: \", verbose);", + " }", + "", + " async post(path, body, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", + " return this.sendRequest(\"POST\", path, body, errorText, verbose);", + " }", + "", + " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", + " return this.sendRequest(\"PATCH\", path, body, errorText, verbose);", + " }", + "", + " async get(path, body = null, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {", + " return this.sendRequest(\"GET\", path, body, errorText, verbose);", + " }", + " async sendRequest(method, path, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", + " return new Promise((resolve, reject) => {", + " verbose = verbose == null ? this._verbose : verbose;", + " const request = {", + " url: this.baseUrl + path,", + " method: method,", + " body: body == null ? \"\" : JSON.stringify(body),", + " header: { \"Content-Type\": \"application/json\" },", + " };", + " if(verbose) {", + " console.log(\"Отправляю запрос: \", request);", + " }", + "", + " try {", + " this.pm.sendRequest(request, (error, response) => {", + " if(error || (response.code >= 400 && response.code <= 599)) {", + " let err = error ? error : JSON.stringify(response.json());", + " console.error(\"При выполнении запроса к серверу возникла ошика.\\n\", err,", + " \"\\nДля отладки проблемы повторите такой же запрос к вашей программе \" + ", + " \"на локальном компьютере. Данные запроса:\\n\", JSON.stringify(request));", + "", + " reject(new Error(errorText + err));", + " }", + " if(verbose) {", + " console.log(\"Результат обработки запроса: код состояния - \", response.code, \", тело: \", response.json());", + " }", + " if (response.stream.length === 0){", + " resolve(null);", + " }else{", + " resolve(response.json());", + " }", + " });", + " ", + " } catch(err) {", + " if(verbose) {", + " console.error(errorText, err);", + " }", + " return Promise.reject(err);", + " }", + " });", + " }", + "};", + "", + "RandomUtils = class {", + " constructor() {}", + "", + " getUser() {", + " let date = new Date(new Date(1960, 0, 1).getTime() + Math.random() * (new Date(2010, 0, 1).getTime() - new Date(1960, 0, 1).getTime()));", + " return {", + " name: pm.variables.replaceIn('{{$randomFullName}}'),", + " login: this.getWord(10),", + " email: pm.variables.replaceIn('{{$randomEmail}}'),", + " birthday: date.toISOString().slice(0,10)", + " };", + " }", + "", + " getFilm() {", + " let date = new Date(new Date(1960, 0, 1).getTime() + Math.random() * (new Date(2010, 0, 1).getTime() - new Date(1960, 0, 1).getTime()));", + " return {", + " name: this.getWord(15),", + " description: this.getWord(50),", + " releaseDate: date.toISOString().slice(0,10),", + " duration: Math.floor(Math.random() * (180 - 60 + 1) + 60)", + " };", + " }", + "", + " getWord(length = 1) {", + " let result = '';", + " const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';", + " const charactersLength = characters.length;", + " let counter = 0;", + " while (counter < length) {", + " result += characters.charAt(Math.floor(Math.random() * charactersLength));", + " counter += 1;", + " }", + " return result;", + " }", + "", + "}" ] } }, @@ -1042,6 +1385,14 @@ "key": "baseUrl", "value": "http://localhost:8080", "type": "string" + }, + { + "key": "user", + "value": "" + }, + { + "key": "film", + "value": "" } ] -} \ No newline at end of file +}