From 4a0415ec32d7693e0276c3f3d335c62a55cfe502 Mon Sep 17 00:00:00 2001 From: George He Date: Sat, 12 Oct 2024 15:20:29 +0800 Subject: [PATCH 01/21] fix(timings): finished step still shows the spinner icon (#8072) --- packages/insomnia/src/ui/components/response-timer.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/insomnia/src/ui/components/response-timer.tsx b/packages/insomnia/src/ui/components/response-timer.tsx index ab9bd611f499..55d7eb97e05a 100644 --- a/packages/insomnia/src/ui/components/response-timer.tsx +++ b/packages/insomnia/src/ui/components/response-timer.tsx @@ -41,7 +41,7 @@ export const ResponseTimer: FunctionComponent = ({ handleCancel, activeRe
{ - record.duration ? + record.duration !== undefined ? () : () } @@ -51,7 +51,7 @@ export const ResponseTimer: FunctionComponent = ({ handleCancel, activeRe
- {record.duration ? `${((record.duration) / 1000).toFixed(1)} s` : ()} + {record.duration !== undefined ? `${((record.duration) / 1000).toFixed(1)} s` : ()}
))} From b7b45475738c36c927c7c4c5ba4b68f3e5f49aef Mon Sep 17 00:00:00 2001 From: Curry Yang <163384738+CurryYangxx@users.noreply.github.com> Date: Sat, 12 Oct 2024 15:34:08 +0800 Subject: [PATCH 02/21] fix: disable request error modal - [INS-4559] (#8068) * fix: disable request error modal * fix test * update script response * fix test after disable request error alert modal --- .../tests/critical/certificates.test.ts | 1 - .../tests/smoke/app.test.ts | 1 - .../smoke/pre-request-script-features.test.ts | 4 ---- .../smoke/pre-request-script-window.test.ts | 9 ++------- .../src/ui/components/request-url-bar.tsx | 12 ------------ packages/insomnia/src/ui/routes/request.tsx | 18 +++++++++++++++++- 6 files changed, 19 insertions(+), 26 deletions(-) diff --git a/packages/insomnia-smoke-test/tests/critical/certificates.test.ts b/packages/insomnia-smoke-test/tests/critical/certificates.test.ts index 2e6144f03929..ab37852ed634 100644 --- a/packages/insomnia-smoke-test/tests/critical/certificates.test.ts +++ b/packages/insomnia-smoke-test/tests/critical/certificates.test.ts @@ -16,7 +16,6 @@ test('can send request with custom ca root certificate', async ({ app, page }) = await page.getByLabel('Request Collection').getByTestId('sends request with certs').press('Enter'); await page.getByRole('button', { name: 'Send', exact: true }).click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); await page.getByText('Error: SSL peer certificate or SSH remote key was not OK').click(); const fixturePath = getFixturePath('certificates'); diff --git a/packages/insomnia-smoke-test/tests/smoke/app.test.ts b/packages/insomnia-smoke-test/tests/smoke/app.test.ts index be5a4f16019f..01b9e0ac2b6e 100644 --- a/packages/insomnia-smoke-test/tests/smoke/app.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/app.test.ts @@ -96,6 +96,5 @@ test('can cancel requests', async ({ app, page }) => { await page.getByTestId('request-pane').getByRole('button', { name: 'Send' }).click(); await page.getByRole('button', { name: 'Cancel Request' }).click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); await page.click('text=Request was cancelled'); }); diff --git a/packages/insomnia-smoke-test/tests/smoke/pre-request-script-features.test.ts b/packages/insomnia-smoke-test/tests/smoke/pre-request-script-features.test.ts index f208d0dfec16..7768f789cb7c 100644 --- a/packages/insomnia-smoke-test/tests/smoke/pre-request-script-features.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/pre-request-script-features.test.ts @@ -368,10 +368,6 @@ test.describe('pre-request features tests', async () => { // send await page.getByTestId('request-pane').getByRole('button', { name: 'Send' }).click(); - // close the alert modal - await page.getByRole('code').getByText('Error: Couldn\'t connect to').click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); - // verify await page.getByRole('tab', { name: 'Console' }).click(); await expect(responsePane).toContainText('localhost:2222'); // original proxy diff --git a/packages/insomnia-smoke-test/tests/smoke/pre-request-script-window.test.ts b/packages/insomnia-smoke-test/tests/smoke/pre-request-script-window.test.ts index 4855cb7dc3ed..a91871081d36 100644 --- a/packages/insomnia-smoke-test/tests/smoke/pre-request-script-window.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/pre-request-script-window.test.ts @@ -28,9 +28,6 @@ test.describe('test hidden window handling', async () => { await page.getByRole('button', { name: 'Cancel Request' }).click(); - // check the alert model message - await page.getByRole('code').getByText('Request was cancelled').click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); // check the response pane message await page.click('text=Request was cancelled'); }); @@ -54,8 +51,7 @@ test.describe('test hidden window handling', async () => { await page.getByLabel('Request Collection').getByTestId('Long running task - post').press('Enter'); await page.getByTestId('request-pane').getByRole('button', { name: 'Send', exact: true }).click(); - await page.getByRole('code').getByText('Executing script timeout').click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); + await page.getByText('Executing script timeout').click(); await page.getByRole('tab', { name: 'Console' }).click(); await page.getByRole('tab', { name: 'Preview' }).click(); @@ -98,8 +94,7 @@ test.describe('test hidden window handling', async () => { await page.getByTestId('request-pane').getByRole('button', { name: 'Send', exact: true }).click(); // await page.getByText('Timeout: Hidden browser window is not responding').click(); - await page.getByRole('code').getByText('Executing script timeout').click(); - await page.getByRole('button', { name: 'Ok', exact: true }).click(); + await page.getByText('Executing script timeout').click(); // send the another script with normal script await page.getByLabel('Request Collection').getByTestId('simple log').press('Enter'); diff --git a/packages/insomnia/src/ui/components/request-url-bar.tsx b/packages/insomnia/src/ui/components/request-url-bar.tsx index 6a67eebe86cc..b1c96ad0d966 100644 --- a/packages/insomnia/src/ui/components/request-url-bar.tsx +++ b/packages/insomnia/src/ui/components/request-url-bar.tsx @@ -51,18 +51,6 @@ export const RequestUrlBar = forwardRef(({ if (searchParams.has('envVariableMissing') && searchParams.get('undefinedEnvironmentVariables')) { setShowEnvVariableMissingModal(true); setUndefinedEnvironmentVariables(searchParams.get('undefinedEnvironmentVariables')!); - } else { - showAlert({ - title: 'Unexpected Request Failure', - message: ( -
-

The request failed due to an unhandled error:

- -
{searchParams.get('error')}
-
-
- ), - }); } // clean up params diff --git a/packages/insomnia/src/ui/routes/request.tsx b/packages/insomnia/src/ui/routes/request.tsx index 73bb621deb17..088f05abcded 100644 --- a/packages/insomnia/src/ui/routes/request.tsx +++ b/packages/insomnia/src/ui/routes/request.tsx @@ -422,7 +422,13 @@ export const sendAction: ActionFunction = async ({ request, params }) => { console.log('[request] Failed to send request', err); const e = err.error || err; + // when after-script error, there is no error in response, we need to set error info into response, so that we can show it in response viewer if (err.response && err.requestMeta && err.response._id) { + if (!err.response.error) { + err.response.error = e; + err.response.statusMessage = 'Error'; + err.response.statusCode = 0; + } // this part is for persisting useful info (e.g. timeline) for debugging, even there is an error const existingResponse = await models.response.getById(err.response._id); const response = existingResponse || await models.response.create(err.response, err.maxHistoryResponses); @@ -484,10 +490,21 @@ export const sendActionImplementation = async ({ }) => { window.main.startExecution({ requestId }); const requestData = await fetchRequestData(requestId); + const requestMeta = await models.requestMeta.getByParentId(requestId); window.main.addExecutionStep({ requestId, stepName: 'Executing pre-request script' }); const mutatedContext = await tryToExecutePreRequestScript(requestData, userUploadEnvironment, iteration, iterationCount); if ('error' in mutatedContext) { throw { + // create response with error info, so that we can store response in db and show it in response viewer + response: { + _id: requestData.responseId, + parentId: requestId, + environemntId: requestData.environment, + statusMessage: 'Error', + error: mutatedContext.error, + }, + maxHistoryResponses: requestData.settings.maxHistoryResponses, + requestMeta, error: mutatedContext.error, }; } @@ -531,7 +548,6 @@ export const sendActionImplementation = async ({ // TODO: remove this temporary hack to support GraphQL variables in the request body properly parseGraphQLReqeustBody(renderedRequest); - const requestMeta = await models.requestMeta.getByParentId(requestId); invariant(requestMeta, 'RequestMeta not found'); window.main.addExecutionStep({ requestId, stepName: 'Sending request' }); From 05932743dbae1bf75bdcdf2e3e182d428f913f6c Mon Sep 17 00:00:00 2001 From: yaoweiprc <6896642+yaoweiprc@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:43:45 +0800 Subject: [PATCH 03/21] fix the bug that postman collection's variable can not be added as insomnia collection's top layer folder's environment when import from postman data dump file (#8073) --- .../__snapshots__/convert.test.ts.snap | 40 +++++++++++++++---- .../insomnia/src/utils/importers/convert.ts | 14 ++++--- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/packages/insomnia/src/utils/importers/__tests__/__snapshots__/convert.test.ts.snap b/packages/insomnia/src/utils/importers/__tests__/__snapshots__/convert.test.ts.snap index 7c0c56d89126..f9e70d320a3c 100644 --- a/packages/insomnia/src/utils/importers/__tests__/__snapshots__/convert.test.ts.snap +++ b/packages/insomnia/src/utils/importers/__tests__/__snapshots__/convert.test.ts.snap @@ -69,7 +69,10 @@ Tests help you confirm that your API is working as expected. You can write test [Using variables](https://learning.postman.com/docs/sending-requests/variables/) [Managing environments](https://learning.postman.com/docs/sending-requests/managing-environments/) [Writing scripts](https://learning.postman.com/docs/writing-scripts/intro-to-scripts/)", - "environment": {}, + "environment": { + "base_url": "https://postman-rest-api-learner.glitch.me/", + "id": "1", + }, "name": "RESTful API Basics #blueprint", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -198,7 +201,16 @@ A successful DELETE request typically returns a \`200 OK\`, \`202 Accepted\`, or "afterResponseScript": "", "authentication": {}, "description": "", - "environment": {}, + "environment": { + "access_token": "", + "access_token_authO": "", + "appid": "", + "devid": "", + "globalReferenceId": "", + "provision_id": "", + "refresh_token_authO": "", + "usrrefid": "", + }, "name": "Device Collection", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -3113,7 +3125,10 @@ Adding tests to your requests can help you confirm that your API is working as e [API testing basics](https://go.postman.co/redirect/workspace?type=personal&collectionTemplateId=e9a37a28-055b-49cd-8c7e-97494a21eb54&sourceTemplateId=ddb19591-3097-41cf-82af-c84273e56719) [API documentation](https://go.postman.co/redirect/workspace?type=personal&collectionTemplateId=e9c28f47-1253-44af-a2f3-20dce4da1f18&sourceTemplateId=ddb19591-3097-41cf-82af-c84273e56719) [Authorization methods](https://go.postman.co/redirect/workspace?type=personal&collectionTemplateId=31a9a6ed-4cdf-4ced-984c-d12c9aec1c27&sourceTemplateId=ddb19591-3097-41cf-82af-c84273e56719)", - "environment": {}, + "environment": { + "base_url": "https://postman-rest-api-learner.glitch.me/", + "id": "1", + }, "name": "REST API basics: CRUD, test & variable", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -3247,7 +3262,10 @@ A successful DELETE request typically returns a \`200 OK\`, \`202 Accepted\`, or "username": "yaowei", }, "description": "", - "environment": {}, + "environment": { + "asd": "qwer", + "asfd": "qtrsda", + }, "name": "GetSubscriberIdAPI", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -3412,7 +3430,10 @@ Tests help you confirm that your API is working as expected. You can write test [Using variables](https://learning.postman.com/docs/sending-requests/variables/) [Managing environments](https://learning.postman.com/docs/sending-requests/managing-environments/) [Writing scripts](https://learning.postman.com/docs/writing-scripts/intro-to-scripts/)", - "environment": {}, + "environment": { + "base_url": "https://postman-rest-api-learner.glitch.me/", + "id": "1", + }, "name": "RESTful API Basics #blueprint", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -3621,7 +3642,9 @@ In case you have questions, go through our tutorials ((link to your video or hel Or you can check out our community forum, there’s a good chance our community has an answer for you. Visit our developer forum ((link to developer forum)) to review topics, ask questions, and learn from others. \`You can also document or add links to libraries, code examples, and other resources needed to make a request.\`", - "environment": {}, + "environment": { + "baseUrl": "https://farming-simulator.pstmn.io", + }, "name": "API Documentation #reference", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", @@ -3929,7 +3952,10 @@ In case you have questions, go through our tutorials ((link to your video or hel Or you can check out our community forum, there’s a good chance our community has an answer for you. Visit our developer forum ((link to developer forum)) to review topics, ask questions, and learn from others. \`You can also document or add links to libraries, code examples, and other resources needed to make a request.\`", - "environment": {}, + "environment": { + "baseUrl": "https://farming-simulator.pstmn.io", + "haha": "", + }, "name": "API Documentation #reference", "parentId": "__WORKSPACE_ID__", "preRequestScript": "", diff --git a/packages/insomnia/src/utils/importers/convert.ts b/packages/insomnia/src/utils/importers/convert.ts index 73b01ad8b9f5..2ef4881c1722 100644 --- a/packages/insomnia/src/utils/importers/convert.ts +++ b/packages/insomnia/src/utils/importers/convert.ts @@ -25,6 +25,8 @@ export interface ConvertResult { function modifyResourcesAfterConvert(resources: ImportRequest[]): ImportRequest[] { dotInKeyNameInvariant(resources); + // Each postman's collection has its variable, we map it to request group's environment in Insomnia + // I think it's better to check if the resource's type is request_group rather than to check it by index 0, but let's just leave it as it is if (resources.length > 0 && resources[0].variable) { resources[0].environment = resources[0].variable; } @@ -67,7 +69,7 @@ export async function convertPostmanDataDump({ collectionList, envList, }: PostmanDataDumpRawData) { - let resources: ImportRequest[] = []; + const resources: ImportRequest[] = []; collectionList.forEach(collectionRawStr => { const workspaceUuid = uuidv4(); const result = postmanConvert(collectionRawStr, { @@ -85,16 +87,18 @@ export async function convertPostmanDataDump({ _type: 'workspace', workspaceUuid, }); - resources.push(...result as ImportRequest[]); + resources.push( + ...(modifyResourcesAfterConvert(result as ImportRequest[])) + ); } }); envList.forEach(envRawStr => { const result = postmanEnvConvert(envRawStr); - result && resources.push(...result as ImportRequest[]); + result && resources.push( + ...(modifyResourcesAfterConvert(result as ImportRequest[])) + ); }); - resources = modifyResourcesAfterConvert(resources as ImportRequest[]); - return { type: { id: 'postman-data-dump', From 35b9b0c508c68eef72cdda8ac8aadc0690282687 Mon Sep 17 00:00:00 2001 From: yaoweiprc <6896642+yaoweiprc@users.noreply.github.com> Date: Mon, 14 Oct 2024 21:15:28 +0800 Subject: [PATCH 04/21] change file card dropdown menu item name from Duplicate to Duplicate / Move (#8076) --- .../src/ui/components/dropdowns/workspace-card-dropdown.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx index 0890b5e3b5f5..a60c7cc74ffc 100644 --- a/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx @@ -110,9 +110,9 @@ export const WorkspaceCardDropdown: FC = props => { } > - + setIsDuplicateModalOpen(true)} /> From 9d9ddcb788a5fbe1d78ad479b5b71a9b2e285ece Mon Sep 17 00:00:00 2001 From: Ryan Willis Date: Mon, 14 Oct 2024 08:19:52 -0700 Subject: [PATCH 05/21] fix: keep project dropdown in place (#8077) * fix: keep project dropdown in place --- .../insomnia/src/ui/components/dropdowns/project-dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx index ff9f311c4dc6..7bf22a8c1004 100644 --- a/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/project-dropdown.tsx @@ -135,7 +135,7 @@ export const ProjectDropdown: FC = ({ project, organizationId, storage }) From fdc6a4afb37e7a94106fc7fd53a1db67fa54da74 Mon Sep 17 00:00:00 2001 From: Filipe Freire Date: Mon, 14 Oct 2024 16:46:07 +0100 Subject: [PATCH 06/21] fix: base_url not generated from spec [#6663] (#8075) * fix: base_url not generated from spec [#6663] * rm the set subenv as primary, and replace instead of merging baseEnv * explict updates --------- Co-authored-by: jackkav --- packages/insomnia/src/common/import.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/insomnia/src/common/import.ts b/packages/insomnia/src/common/import.ts index 96fa7daf3df9..09b8ac54c873 100644 --- a/packages/insomnia/src/common/import.ts +++ b/packages/insomnia/src/common/import.ts @@ -281,13 +281,16 @@ export const importResourcesToWorkspace = async ({ workspaceId }: { workspaceId: const baseEnvironment = await models.environment.getOrCreateForParentId(workspaceId); invariant(baseEnvironment, 'Could not create base environment'); + const baseEnvironmentFromResources = resources.filter(isEnvironment).find(env => env.parentId && env.parentId.startsWith('__WORKSPACE_ID__')); + if (baseEnvironmentFromResources) { + await models.environment.update(baseEnvironment, { data: baseEnvironmentFromResources.data }); + } const subEnvironments = resources.filter(isEnvironment).filter(isSubEnvironmentResource) || []; for (const environment of subEnvironments) { const model = getModel(environment.type); model && ResourceIdMap.set(environment._id, generateId(model.prefix)); - - await db.docCreate(environment.type, { + await models.environment.create({ ...environment, _id: ResourceIdMap.get(environment._id), parentId: baseEnvironment._id, @@ -307,7 +310,7 @@ export const importResourcesToWorkspace = async ({ workspaceId }: { workspaceId: if (model) { // Make sure we point to the new proto file if (isGrpcRequest(resource)) { - await db.docCreate(model.type, { + await models.grpcRequest.create({ ...resource, _id: ResourceIdMap.get(resource._id), protoFileId: ResourceIdMap.get(resource.protoFileId), @@ -316,14 +319,14 @@ export const importResourcesToWorkspace = async ({ workspaceId }: { workspaceId: // Make sure we point unit test to the new request } else if (isUnitTest(resource)) { - await db.docCreate(model.type, { + await models.unitTest.create({ ...resource, _id: ResourceIdMap.get(resource._id), requestId: ResourceIdMap.get(resource.requestId), parentId: ResourceIdMap.get(resource.parentId), }); } else if (isRequest(resource)) { - await db.docCreate(model.type, importRequestWithNewIds(resource, ResourceIdMap, canTransform)); + await models.request.create(importRequestWithNewIds(resource, ResourceIdMap, canTransform)); } else { await db.docCreate(model.type, { ...resource, @@ -413,21 +416,21 @@ const importResourcesToNewWorkspace = async (projectId: string, workspaceToImpor if (model) { if (isGrpcRequest(resource)) { - await db.docCreate(model.type, { + await models.grpcRequest.create({ ...resource, _id: ResourceIdMap.get(resource._id), protoFileId: ResourceIdMap.get(resource.protoFileId), parentId: ResourceIdMap.get(resource.parentId), }); } else if (isUnitTest(resource)) { - await db.docCreate(model.type, { + await models.unitTest.create({ ...resource, _id: ResourceIdMap.get(resource._id), requestId: ResourceIdMap.get(resource.requestId), parentId: ResourceIdMap.get(resource.parentId), }); } else if (isRequest(resource)) { - await db.docCreate(model.type, importRequestWithNewIds(resource, ResourceIdMap, canTransform)); + await models.request.create(importRequestWithNewIds(resource, ResourceIdMap, canTransform)); } else { await db.docCreate(model.type, { ...resource, @@ -438,9 +441,8 @@ const importResourcesToNewWorkspace = async (projectId: string, workspaceToImpor } } - // Use the first environment as the active one - const subEnvironments = - resources.filter(isEnvironment).filter(isSubEnvironmentResource) || []; + // Use the first sub environment as the active one + const subEnvironments = resources.filter(isEnvironment).filter(isSubEnvironmentResource) || []; if (subEnvironments.length > 0) { const firstSubEnvironment = subEnvironments[0]; From bf5181c7e1a25c466b314fa0305531558f39ab9d Mon Sep 17 00:00:00 2001 From: Filipe Freire <11976836+filfreire@users.noreply.github.com> Date: Mon, 14 Oct 2024 15:54:59 +0000 Subject: [PATCH 07/21] Bump app version to 10.1.0-beta.3 --- package-lock.json | 10 +++++----- packages/insomnia-inso/package.json | 2 +- packages/insomnia-sdk/package.json | 2 +- packages/insomnia-smoke-test/package.json | 2 +- packages/insomnia-testing/package.json | 2 +- packages/insomnia/package.json | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7fc018760689..17bff63403a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23016,7 +23016,7 @@ } }, "packages/insomnia": { - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "license": "Apache-2.0", "dependencies": { "@apideck/better-ajv-errors": "^0.3.6", @@ -23169,7 +23169,7 @@ } }, "packages/insomnia-inso": { - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "license": "Apache-2.0", "dependencies": { "@seald-io/nedb": "^4.0.4", @@ -23196,7 +23196,7 @@ } }, "packages/insomnia-sdk": { - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "license": "Apache-2.0", "dependencies": { "@types/deep-equal": "^1.0.4", @@ -23248,7 +23248,7 @@ } }, "packages/insomnia-smoke-test": { - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "license": "Apache-2.0", "devDependencies": { "@grpc/grpc-js": "^1.12.00", @@ -23276,7 +23276,7 @@ } }, "packages/insomnia-testing": { - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "license": "Apache-2.0" } } diff --git a/packages/insomnia-inso/package.json b/packages/insomnia-inso/package.json index 1a813ac8ca8b..3d522e93ad03 100644 --- a/packages/insomnia-inso/package.json +++ b/packages/insomnia-inso/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "insomnia-inso", - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "homepage": "https://insomnia.rest", "description": "A CLI for Insomnia - The Collaborative API Design Tool", "author": "Kong ", diff --git a/packages/insomnia-sdk/package.json b/packages/insomnia-sdk/package.json index 95bca24d4f6b..2f5702dd4963 100644 --- a/packages/insomnia-sdk/package.json +++ b/packages/insomnia-sdk/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "insomnia-sdk", - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "description": "", "main": "src/objects/index.ts", "types": "src/objects/index.ts", diff --git a/packages/insomnia-smoke-test/package.json b/packages/insomnia-smoke-test/package.json index 9c456794d1ad..01f4c4d70c9b 100644 --- a/packages/insomnia-smoke-test/package.json +++ b/packages/insomnia-smoke-test/package.json @@ -11,7 +11,7 @@ "bugs": { "url": "https://github.com/kong/insomnia/issues" }, - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "scripts": { "test:dev": "xvfb-maybe cross-env BUNDLE=dev playwright test", "test:build": "xvfb-maybe cross-env BUNDLE=build playwright test", diff --git a/packages/insomnia-testing/package.json b/packages/insomnia-testing/package.json index 409e2c21e4fa..fcf0809ed09b 100644 --- a/packages/insomnia-testing/package.json +++ b/packages/insomnia-testing/package.json @@ -2,7 +2,7 @@ "private": true, "name": "insomnia-testing", "license": "Apache-2.0", - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "author": "Kong ", "repository": { "type": "git", diff --git a/packages/insomnia/package.json b/packages/insomnia/package.json index 46722e05dc03..3bc99afbd5f4 100644 --- a/packages/insomnia/package.json +++ b/packages/insomnia/package.json @@ -1,6 +1,6 @@ { "name": "insomnia", - "version": "10.1.0-beta.2", + "version": "10.1.0-beta.3", "productName": "Insomnia", "private": true, "description": "The Collaborative API Design Tool", From 1a265c677de0efae53695dc29e15c291e2489595 Mon Sep 17 00:00:00 2001 From: Filipe Freire Date: Mon, 14 Oct 2024 17:44:27 +0100 Subject: [PATCH 08/21] fix: collection env modal dropdown and add test --- .../tests/smoke/environment-editor-interactions.test.ts | 8 ++++++++ .../modals/workspace-environments-edit-modal.tsx | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts b/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts index 20761685ad68..208b1b474d8f 100644 --- a/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts @@ -34,6 +34,14 @@ test.describe('Environment Editor', async () => { await page.getByText('baseenv1').click(); }); + test.only('duplicate an environment', async ({ page }) => { + await page.getByRole('button', { name: 'Manage Environments' }).click(); + await page.getByRole('button', { name: 'Manage collection environments' }).click(); + await page.getByRole('row', { name: 'ExampleA' }).getByLabel('Environment Actions').click(); + await page.getByText('Duplicate').click(); + await page.getByLabel('Environments', { exact: true }).getByText('ExampleA (Copy)').click(); + }); + // rename an existing environment test('Rename an existing environment', async ({ page }) => { // Rename the environment diff --git a/packages/insomnia/src/ui/components/modals/workspace-environments-edit-modal.tsx b/packages/insomnia/src/ui/components/modals/workspace-environments-edit-modal.tsx index 5c43b54da550..f96b54c5430e 100644 --- a/packages/insomnia/src/ui/components/modals/workspace-environments-edit-modal.tsx +++ b/packages/insomnia/src/ui/components/modals/workspace-environments-edit-modal.tsx @@ -1,6 +1,6 @@ import type { IconName, IconProp } from '@fortawesome/fontawesome-svg-core'; import React, { useMemo, useRef, useState } from 'react'; -import { Button, Dialog, DropIndicator, GridList, GridListItem, Heading, Label, ListBoxItem, Menu, MenuItem, MenuTrigger, Modal, ModalOverlay, Popover, Text, useDragAndDrop } from 'react-aria-components'; +import { Button, Dialog, DropIndicator, GridList, GridListItem, Heading, Label, Menu, MenuItem, MenuTrigger, Modal, ModalOverlay, Popover, Text, useDragAndDrop } from 'react-aria-components'; import { useFetcher, useParams, useRouteLoaderData } from 'react-router-dom'; import { docsAfterResponseScript, docsTemplateTags } from '../../../common/documentation'; @@ -315,7 +315,7 @@ export const WorkspaceEnvironmentsEditModal = ({ onClose }: { className="border select-none text-sm min-w-max border-solid border-[--hl-sm] shadow-lg bg-[--color-bg] py-2 rounded-md overflow-y-auto max-h-[85vh] focus:outline-none" > {item => ( - {item.name} - + )} From 8ba014b515592731d4cfa792f2c445ec89be0d58 Mon Sep 17 00:00:00 2001 From: Filipe Freire Date: Mon, 14 Oct 2024 17:45:25 +0100 Subject: [PATCH 09/21] fix: rm test.only --- .../tests/smoke/environment-editor-interactions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts b/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts index 208b1b474d8f..b1dff01aa71c 100644 --- a/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts +++ b/packages/insomnia-smoke-test/tests/smoke/environment-editor-interactions.test.ts @@ -34,7 +34,7 @@ test.describe('Environment Editor', async () => { await page.getByText('baseenv1').click(); }); - test.only('duplicate an environment', async ({ page }) => { + test('duplicate an environment', async ({ page }) => { await page.getByRole('button', { name: 'Manage Environments' }).click(); await page.getByRole('button', { name: 'Manage collection environments' }).click(); await page.getByRole('row', { name: 'ExampleA' }).getByLabel('Environment Actions').click(); From 395dea014cd7a69cea4d75c8192d4539cb9e735e Mon Sep 17 00:00:00 2001 From: George He Date: Tue, 15 Oct 2024 15:44:31 +0800 Subject: [PATCH 10/21] fix: test syntax error crashes whole app (#8080) --- packages/insomnia/src/ui/routes/actions.tsx | 115 +++++++++++++++++--- 1 file changed, 99 insertions(+), 16 deletions(-) diff --git a/packages/insomnia/src/ui/routes/actions.tsx b/packages/insomnia/src/ui/routes/actions.tsx index 92d118c955b6..c4bb3e2c8eb9 100644 --- a/packages/insomnia/src/ui/routes/actions.tsx +++ b/packages/insomnia/src/ui/routes/actions.tsx @@ -1,5 +1,6 @@ import type { IRuleResult } from '@stoplight/spectral-core'; import { generate, runTests, type Test } from 'insomnia-testing'; +import type { TestResults } from 'insomnia-testing/src/run/entities'; import path from 'path'; import { type ActionFunction, redirect } from 'react-router-dom'; @@ -610,16 +611,57 @@ export const runAllTestsAction: ActionFunction = async ({ const sendRequest = getSendRequestCallback(); - const results = await runTests(src, { sendRequest }); - - const testResult = await models.unitTestResult.create({ - results, - parentId: workspaceId, - }); + let results: TestResults = { + failures: [], + passes: [], + pending: [], + stats: { + suites: 0, + tests: 0, + passes: 0, + pending: 0, + failures: 0, + start: undefined, + end: undefined, + duration: undefined, + }, + tests: [], + }; - window.main.trackSegmentEvent({ event: SegmentEvent.unitTestRun }); + try { + results = await runTests(src, { sendRequest }); + } catch (err) { + // create a result manually so that it can be displayed in the UI + results.stats.failures = 1; + results.stats.tests = 1; + results.tests.push( + { + currentRetry: 0, + duration: 0, + err: { + actual: undefined, + expected: undefined, + message: err.toString(), + multiple: [], + operator: undefined, + showDiff: false, + stack: '', + }, + file: '', + fullTitle: 'Test Error', + id: '', + title: 'Test Error', + }, + ); + } finally { + const testResult = await models.unitTestResult.create({ + results, + parentId: workspaceId, + }); + window.main.trackSegmentEvent({ event: SegmentEvent.unitTestRun }); - return redirect(`/organization/${organizationId}/project/${projectId}/workspace/${workspaceId}/test/test-suite/${testSuiteId}/test-result/${testResult._id}`); + return redirect(`/organization/${organizationId}/project/${projectId}/workspace/${workspaceId}/test/test-suite/${testSuiteId}/test-result/${testResult._id}`); + } }; export const updateTestSuiteAction: ActionFunction = async ({ request, params }) => { @@ -712,16 +754,57 @@ export const runTestAction: ActionFunction = async ({ params }) => { const sendRequest = getSendRequestCallback(); - const results = await runTests(src, { sendRequest }); - - const testResult = await models.unitTestResult.create({ - results, - parentId: unitTest.parentId, - }); + let results: TestResults = { + failures: [], + passes: [], + pending: [], + stats: { + suites: 0, + tests: 0, + passes: 0, + pending: 0, + failures: 0, + start: undefined, + end: undefined, + duration: undefined, + }, + tests: [], + }; - window.main.trackSegmentEvent({ event: SegmentEvent.unitTestRun }); + try { + results = await runTests(src, { sendRequest }); + } catch (error) { + // create a result manually so that it can be displayed in the UI + results.stats.failures = 1; + results.stats.tests = 1; + results.tests.push( + { + currentRetry: 0, + duration: 0, + err: { + actual: undefined, + expected: undefined, + message: error.toString(), + multiple: [], + operator: undefined, + showDiff: false, + stack: '', + }, + file: '', + fullTitle: unitTest.name, + id: '', + title: unitTest.name, + }, + ); + } finally { + const testResult = await models.unitTestResult.create({ + results, + parentId: unitTest.parentId, + }); + window.main.trackSegmentEvent({ event: SegmentEvent.unitTestRun }); - return redirect(`/organization/${organizationId}/project/${projectId}/workspace/${workspaceId}/test/test-suite/${testSuiteId}/test-result/${testResult._id}`); + return redirect(`/organization/${organizationId}/project/${projectId}/workspace/${workspaceId}/test/test-suite/${testSuiteId}/test-result/${testResult._id}`); + } }; // Api Spec From 3878f5b9bf8db29ab6c8ec03edb08f57d3d144a2 Mon Sep 17 00:00:00 2001 From: Ryan Willis Date: Tue, 15 Oct 2024 00:53:41 -0700 Subject: [PATCH 11/21] fix: show user logout reason message (#8061) --- packages/insomnia/src/ui/insomniaFetch.ts | 17 +++++++++-------- packages/insomnia/src/ui/routes/auth.login.tsx | 12 +++++++++++- .../insomnia/src/ui/routes/organization.tsx | 2 +- packages/insomnia/src/ui/routes/root.tsx | 3 +++ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/insomnia/src/ui/insomniaFetch.ts b/packages/insomnia/src/ui/insomniaFetch.ts index f600ca14f56d..4c9ac789b915 100644 --- a/packages/insomnia/src/ui/insomniaFetch.ts +++ b/packages/insomnia/src/ui/insomniaFetch.ts @@ -12,13 +12,14 @@ interface FetchConfig { origin?: string; headers?: Record; onlyResolveOnSuccess?: boolean; + timeout?: number; } export class ResponseFailError extends Error { constructor(msg: string, response: Response) { super(msg); this.response = response; - }; + } response; name = 'ResponseFailError'; } @@ -33,6 +34,7 @@ export async function insomniaFetch({ origin, headers, onlyResolveOnSuccess = false, + timeout = INSOMNIA_FETCH_TIME_OUT, }: FetchConfig): Promise { const config: RequestInit = { method, @@ -47,7 +49,7 @@ export async function insomniaFetch({ ...(PLAYWRIGHT ? { 'X-Mockbin-Test': 'true' } : {}), }, ...(data ? { body: JSON.stringify(data) } : {}), - signal: AbortSignal.timeout(INSOMNIA_FETCH_TIME_OUT), + signal: AbortSignal.timeout(timeout), }; if (sessionId === undefined) { throw new Error(`No session ID provided to ${method}:${path}`); @@ -59,7 +61,9 @@ export async function insomniaFetch({ if (uri) { window.main.openDeepLink(uri); } - const isJson = response.headers.get('content-type')?.includes('application/json') || path.match(/\.json$/); + const isJson = + response.headers.get('content-type')?.includes('application/json') || + path.match(/\.json$/); if (onlyResolveOnSuccess && !response.ok) { let errMsg = ''; if (isJson) { @@ -68,12 +72,9 @@ export async function insomniaFetch({ if (typeof json?.message === 'string') { errMsg = json.message; } - } catch (err) { } + } catch (err) {} } - throw new ResponseFailError( - errMsg, - response, - ); + throw new ResponseFailError(errMsg, response); } return isJson ? response.json() : response.text(); } catch (err) { diff --git a/packages/insomnia/src/ui/routes/auth.login.tsx b/packages/insomnia/src/ui/routes/auth.login.tsx index cc82941da495..3f3dd180dec2 100644 --- a/packages/insomnia/src/ui/routes/auth.login.tsx +++ b/packages/insomnia/src/ui/routes/auth.login.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { Button } from 'react-aria-components'; import { type ActionFunction, redirect, useFetcher, useNavigate } from 'react-router-dom'; @@ -49,6 +49,7 @@ export const action: ActionFunction = async ({ const Login = () => { const loginFetcher = useFetcher(); const navigate = useNavigate(); + const [message, setMessage] = useState(null); const login = (provider: string) => { loginFetcher.submit({ @@ -63,6 +64,14 @@ const Login = () => { window.main.landingPageRendered(LandingPage.Login); }, []); + const logoutMessage = window.localStorage.getItem('logoutMessage'); + useEffect(() => { + if (logoutMessage) { + window.localStorage.removeItem('logoutMessage'); + setMessage(logoutMessage); + } + }, [logoutMessage]); + return (
{ APIs locally, on Git or in the Cloud.
+ {message &&
{message}
}