Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
b7a2432
project ui changes
jackkav Nov 6, 2023
6453541
project ui changes
jackkav Nov 6, 2023
1bd5123
create mock server model
jackkav Nov 6, 2023
d9a03e8
model mock server similarly to design doc
jackkav Nov 6, 2023
7aa5ebf
use spec modelling and nav
jackkav Nov 7, 2023
7169ba5
layout pass
jackkav Nov 7, 2023
9f178fc
rename requestbin to mock-route
jackkav Nov 8, 2023
a01211b
sidebar ui pass
jackkav Nov 8, 2023
1999ebb
load mock server
jackkav Nov 8, 2023
a1acfd4
add url bar
jackkav Nov 8, 2023
ba740ff
can navigate to headers
jackkav Nov 9, 2023
af03b78
Refactor mock server and mock route creation and
jackkav Nov 9, 2023
56ec7b2
route crud
jackkav Nov 9, 2023
13b140b
sidebar layout
jackkav Nov 9, 2023
704cf24
add delete guuard
jackkav Nov 9, 2023
ba3b639
patch route
jackkav Nov 9, 2023
d1173be
Add mock response tab to request pane
jackkav Nov 10, 2023
31c154a
wire up mock servers in requests
jackkav Nov 10, 2023
a241d43
Update mock server and route selection in
jackkav Nov 10, 2023
80408de
make it work without internet
jackkav Nov 17, 2023
ed2a19a
can create bin
jackkav Nov 17, 2023
b5efd5f
pass body and headers to bin
jackkav Nov 18, 2023
7c67359
can fetch logs but cant see em
jackkav Nov 18, 2023
3130126
split out response pane for hmr
jackkav Nov 18, 2023
fc86a7f
basic table
jackkav Nov 18, 2023
cb898dc
extract mock url bar
jackkav Nov 19, 2023
168a974
add header tab
jackkav Nov 19, 2023
45ab325
made a dumb cache
jackkav Nov 20, 2023
b04dd35
url bar pass
jackkav Nov 21, 2023
bfe7a77
send request and create response
jackkav Nov 21, 2023
1fc07d0
wire up timeline
jackkav Nov 22, 2023
555a3db
wire up preview
jackkav Nov 22, 2023
fbcdaa1
timeline useeffect
jackkav Nov 22, 2023
b7907ab
move to action
jackkav Nov 22, 2023
9e8dea1
fix types
jackkav Nov 22, 2023
f419aa9
empty states
jackkav Nov 24, 2023
1fabf30
rebase updating aria
jackkav Dec 11, 2023
6422cfd
use har type
jackkav Dec 20, 2023
f7f2a8b
can edit bins
jackkav Dec 20, 2023
6fe6e54
cookie support
jackkav Dec 20, 2023
6eddbbd
wire up status
jackkav Dec 20, 2023
207ac57
status text
jackkav Dec 20, 2023
909f18d
magic status text
jackkav Dec 21, 2023
988ccbe
ui
jackkav Jan 5, 2024
ad9de27
always use put rather than create bin
jackkav Jan 6, 2024
b0d71ae
add url to mock route
jackkav Jan 6, 2024
3421412
scroll bar
jackkav Jan 8, 2024
99dff32
add content types
jackkav Jan 8, 2024
8da63a2
validation
jackkav Jan 8, 2024
87a3781
fix flake
jackkav Jan 8, 2024
d411654
improve logs
jackkav Jan 8, 2024
d52ecf8
fix outlet warning
jackkav Jan 8, 2024
9019178
fix send to mock endpoint
jackkav Jan 8, 2024
ff5db47
switch table to grid
gatzjames Jan 8, 2024
f5eeb41
handle errors
jackkav Jan 8, 2024
35d0740
rotate log
jackkav Jan 9, 2024
056a798
create mockbin on open if needed
jackkav Jan 9, 2024
46a64d1
add full url ux
jackkav Jan 9, 2024
24e0a4f
reverse log order
jackkav Jan 9, 2024
15cb5b3
binId from store
jackkav Jan 9, 2024
d02ec06
remove http method
jackkav Jan 9, 2024
69b653f
rename prefix
jackkav Jan 9, 2024
7321005
use server Id for bin id
jackkav Jan 9, 2024
f8a9d0c
fix copy
jackkav Jan 9, 2024
bea6cf2
show log har
jackkav Jan 9, 2024
d578b37
fix url bar
jackkav Jan 10, 2024
c5d6cf7
fix button padding
jackkav Jan 10, 2024
8f7d0ec
tailwind
jackkav Jan 10, 2024
be58f48
method select
jackkav Jan 10, 2024
2fc0209
remove default status text
jackkav Jan 10, 2024
4b0f724
full tailwind
jackkav Jan 10, 2024
da31803
fix breadcrumb
jackkav Jan 10, 2024
3b011d0
default to json
jackkav Jan 11, 2024
ab99b7c
move copy to end, remove save
jackkav Jan 11, 2024
e1de9b6
error msg
jackkav Jan 11, 2024
6cc3e15
only patch when needed
jackkav Jan 12, 2024
298a8e1
fix ws colors
jackkav Jan 15, 2024
3778616
fix command palette
jackkav Jan 15, 2024
678cd17
add isMock helper
jackkav Jan 15, 2024
28c7a6c
revert local storage mechanism
jackkav Jan 16, 2024
86b7012
fix redirect
jackkav Jan 17, 2024
e86e797
fix ignore upsert
jackkav Jan 17, 2024
28b2204
extract to constant
jackkav Jan 17, 2024
b479d3e
ui test
jackkav Jan 17, 2024
c9314cf
hide actions from mock-server
jackkav Jan 17, 2024
abc53c5
fix code editor onBlur
jackkav Jan 18, 2024
30c2e1d
lift update to route
jackkav Jan 18, 2024
5bd44c2
refactor to return only errors
jackkav Jan 18, 2024
a3de6c3
add url to mock server model
jackkav Jan 18, 2024
41d77e9
select mock ui pass
jackkav Jan 18, 2024
bdc46d2
can modify url in settings
jackkav Jan 18, 2024
a29b30e
use server url from db if selected
jackkav Jan 18, 2024
c5f0bc3
hide url option
jackkav Jan 19, 2024
c4e451c
fix lint error
jackkav Jan 19, 2024
75ee891
extract to file
jackkav Jan 19, 2024
6d19575
remove binResponse
jackkav Jan 19, 2024
4f036a4
can sync
jackkav Jan 19, 2024
be8c251
move things around
jackkav Jan 19, 2024
e0bc558
rename name path sync
jackkav Jan 19, 2024
e10b687
fix type check
jackkav Jan 19, 2024
cc76848
capture kvp onBlur
jackkav Jan 19, 2024
f714a18
fix error message
jackkav Jan 19, 2024
8e06b94
basic mock test
jackkav Jan 19, 2024
759087e
wire up mock patcher and navigate
jackkav Jan 19, 2024
bc6c96a
rename component
jackkav Jan 19, 2024
35c5a48
remove url prop of route
jackkav Jan 23, 2024
56ffa68
fix lint
jackkav Jan 23, 2024
f71b90b
fix test
jackkav Jan 23, 2024
37e2a8f
temporary skip e2e test
jackkav Jan 23, 2024
fad32de
fix constant url
jackkav Jan 24, 2024
b0ae1f2
fix migration
jackkav Jan 24, 2024
c6403d3
remove console logs
jackkav Jan 24, 2024
33b221d
rename function
jackkav Jan 24, 2024
10f17e7
only create a single hidden request
jackkav Jan 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/insomnia-smoke-test/tests/smoke/app.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { expect } from '@playwright/test';

import { loadFixture } from '../../playwright/paths';
import { test } from '../../playwright/test';;
import { test } from '../../playwright/test';

test('can send requests', async ({ app, page }) => {
test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,18 +105,15 @@ test.describe('Dashboard', async () => {
await expect(page.locator('.app')).toContainText('test123');

// Duplicate document
await page.click('text=Documenttest123just now >> button');
await page.getByLabel('test123').getByRole('button').click();
await page.getByRole('menuitem', { name: 'Duplicate' }).click();
await page.locator('input[name="name"]').fill('test123-duplicate');
await page.click('[role="dialog"] button:has-text("Duplicate")');

await page.getByTestId('project').click();

const workspaceCards = page.getByLabel('Workspaces').getByRole('gridcell');
await expect(workspaceCards).toHaveCount(2);

// Delete document
await page.click('text=Documenttest123just now >> button');
await page.getByLabel('test123-duplicate').getByRole('button').click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('button', { name: 'Delete' }).click();
// @TODO: Re-enable - Requires mocking VCS operations
Expand All @@ -143,17 +140,15 @@ test.describe('Dashboard', async () => {
await expect(page.locator('.app')).toContainText('test123');

// Duplicate collection
await page.click('text=Collectiontest123just now >> button');
await page.getByLabel('test123').getByRole('button').click();
await page.getByRole('menuitem', { name: 'Duplicate' }).click();
await page.locator('input[name="name"]').fill('test123-duplicate');
await page.click('[role="dialog"] button:has-text("Duplicate")');

await page.getByTestId('project').click();
const workspaceCards = page.getByLabel('Workspaces').getByRole('gridcell');
await expect(workspaceCards).toHaveCount(2);

// Delete collection
await page.click('text=Collectiontest123just now >> button');
await page.getByLabel('test123-duplicate').getByRole('button').click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('button', { name: 'Delete' }).click();
// @TODO: Re-enable - Requires mocking VCS operations
Expand Down
25 changes: 25 additions & 0 deletions packages/insomnia-smoke-test/tests/smoke/mock.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { test } from '../../playwright/test';

// TODO: unskip this test when cloud mock is online
test.skip('can make a mock route', async ({ page }) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remember to change this when the api is deployed

test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');
await page.getByLabel('New Mock Server').click();
await page.getByRole('button', { name: 'Create', exact: true }).click();
await page.getByRole('button', { name: 'New Mock Route' }).click();
await page.getByText('GET/').click();
await page.getByTestId('CodeEditor').getByRole('textbox').fill('123');
await page.getByRole('tab', { name: 'Response Headers' }).click();
await page.locator('.CodeMirror').first().click();
await page.getByRole('textbox').nth(1).fill('my-header');
await page.getByRole('textbox').nth(2).fill('my-value');
await page.getByRole('tab', { name: 'Response Status' }).click();
await page.getByPlaceholder('200').click();
await page.getByPlaceholder('200').fill('201');

await page.getByRole('button', { name: 'Test' }).click();
await page.getByRole('tab', { name: 'Preview' }).click();
await page.getByLabel('Preview').getByText('123').click();
await page.getByRole('tab', { name: 'Timeline' }).click();
await page.getByText('HTTP/1.1 201 Created').click();
await page.getByText('my-header:').click();
});
5 changes: 4 additions & 1 deletion packages/insomnia/src/common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ export enum UpdateURL {

// API
export const getApiBaseURL = () => env.INSOMNIA_API_URL || 'https://api.insomnia.rest';
export const getMockServiceURL = () => env.INSOMNIA_MOCK_API_URL || 'https://mock.insomnia.rest';
export const getAIServiceURL = () => env.INSOMNIA_AI_URL || 'https://ai.insomnia.rest';

export const getUpdatesBaseURL = () => env.INSOMNIA_UPDATES_URL || 'https://updates.insomnia.rest';
Expand Down Expand Up @@ -267,7 +268,7 @@ export const CONTENT_TYPE_FORM_DATA = 'multipart/form-data';
export const CONTENT_TYPE_FILE = 'application/octet-stream';
export const CONTENT_TYPE_GRAPHQL = 'application/graphql';
export const CONTENT_TYPE_OTHER = '';
const contentTypesMap: Record<string, string[]> = {
export const contentTypesMap: Record<string, string[]> = {
[CONTENT_TYPE_EDN]: ['EDN', 'EDN'],
[CONTENT_TYPE_FILE]: ['File', 'Binary File'],
[CONTENT_TYPE_FORM_DATA]: ['Multipart', 'Multipart Form'],
Expand Down Expand Up @@ -573,6 +574,8 @@ export const EXPORT_TYPE_REQUEST = 'request';
export const EXPORT_TYPE_GRPC_REQUEST = 'grpc_request';
export const EXPORT_TYPE_WEBSOCKET_REQUEST = 'websocket_request';
export const EXPORT_TYPE_WEBSOCKET_PAYLOAD = 'websocket_payload';
export const EXPORT_TYPE_MOCK_SERVER = 'mock';
export const EXPORT_TYPE_MOCK_ROUTE = 'mock_route';
export const EXPORT_TYPE_REQUEST_GROUP = 'request_group';
export const EXPORT_TYPE_UNIT_TEST_SUITE = 'unit_test_suite';
export const EXPORT_TYPE_UNIT_TEST = 'unit_test';
Expand Down
8 changes: 6 additions & 2 deletions packages/insomnia/src/common/get-workspace-label.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import { isDesign, Workspace } from '../models/workspace';
import { isDesign, isMockServer, Workspace } from '../models/workspace';
import { strings } from './strings';

export const getWorkspaceLabel = (workspace: Workspace) =>
isDesign(workspace) ? strings.document : strings.collection;
isDesign(workspace)
? strings.document
: isMockServer(workspace)
? strings.mock
: strings.collection;
11 changes: 7 additions & 4 deletions packages/insomnia/src/common/har.ts
Original file line number Diff line number Diff line change
Expand Up @@ -414,9 +414,8 @@ function getRequestCookies(renderedRequest: RenderedRequest) {
return harCookies;
}

function getResponseCookies(response: Response) {
const headers = response.headers.filter(Boolean) as HarCookie[];
const responseCookies = getSetCookieHeaders(headers)
export function getResponseCookiesFromHeaders(headers: HarCookie[]) {
return getSetCookieHeaders(headers)
.reduce((accumulator, harCookie) => {
let cookie: null | undefined | ToughCookie = null;

Expand All @@ -433,7 +432,11 @@ function getResponseCookies(response: Response) {
mapCookie(cookie),
];
}, [] as HarCookie[]);
return responseCookies;
}

function getResponseCookies(response: Response) {
const headers = response.headers.filter(Boolean);
return getResponseCookiesFromHeaders(headers);
}

function mapCookie(cookie: ToughCookie) {
Expand Down
2 changes: 2 additions & 0 deletions packages/insomnia/src/common/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -596,5 +596,7 @@ export async function getRenderContextAncestors(base?: Request | GrpcRequest | W
models.requestGroup.type,
models.workspace.type,
models.project.type,
models.mockRoute.type,
models.mockServer.type,
]);
}
5 changes: 5 additions & 0 deletions packages/insomnia/src/common/strings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export interface StringInfo {

type StringId =
| 'collection'
| 'mock'
| 'document'
| 'project'
| 'workspace'
Expand All @@ -18,6 +19,10 @@ export const strings: Record<StringId, StringInfo> = {
singular: 'Collection',
plural: 'Collections',
},
mock: {
singular: 'Mock',
plural: 'Mocks',
},
document: {
singular: 'Document',
plural: 'Documents',
Expand Down
10 changes: 10 additions & 0 deletions packages/insomnia/src/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
EXPORT_TYPE_COOKIE_JAR,
EXPORT_TYPE_ENVIRONMENT,
EXPORT_TYPE_GRPC_REQUEST,
EXPORT_TYPE_MOCK_ROUTE,
EXPORT_TYPE_MOCK_SERVER,
EXPORT_TYPE_PROTO_DIRECTORY,
EXPORT_TYPE_PROTO_FILE,
EXPORT_TYPE_REQUEST,
Expand All @@ -22,6 +24,8 @@ import * as _environment from './environment';
import * as _gitRepository from './git-repository';
import * as _grpcRequest from './grpc-request';
import * as _grpcRequestMeta from './grpc-request-meta';
import * as _mockRoute from './mock-route';
import * as _mockServer from './mock-server';
import * as _oAuth2Token from './o-auth-2-token';
import * as _pluginData from './plugin-data';
import * as _project from './project';
Expand Down Expand Up @@ -64,6 +68,8 @@ export const caCertificate = _caCertificate;
export const cookieJar = _cookieJar;
export const environment = _environment;
export const gitRepository = _gitRepository;
export const mockServer = _mockServer;
export const mockRoute = _mockRoute;
export const oAuth2Token = _oAuth2Token;
export const pluginData = _pluginData;
export const request = _request;
Expand Down Expand Up @@ -109,6 +115,8 @@ export function all() {
requestVersion,
requestMeta,
response,
mockServer,
mockRoute,
oAuth2Token,
caCertificate,
clientCertificate,
Expand Down Expand Up @@ -211,6 +219,8 @@ export const MODELS_BY_EXPORT_TYPE: Record<string, any> = {
[EXPORT_TYPE_REQUEST]: request,
[EXPORT_TYPE_WEBSOCKET_PAYLOAD]: webSocketPayload,
[EXPORT_TYPE_WEBSOCKET_REQUEST]: webSocketRequest,
[EXPORT_TYPE_MOCK_SERVER]: mockServer,
[EXPORT_TYPE_MOCK_ROUTE]: mockRoute,
[EXPORT_TYPE_GRPC_REQUEST]: grpcRequest,
[EXPORT_TYPE_REQUEST_GROUP]: requestGroup,
[EXPORT_TYPE_UNIT_TEST_SUITE]: unitTestSuite,
Expand Down
82 changes: 82 additions & 0 deletions packages/insomnia/src/models/mock-route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { database as db } from '../common/database';
import type { BaseModel } from './index';
import { RequestHeader } from './request';

export const name = 'Mock Route';

export const type = 'MockRoute';

export const prefix = 'mock_route';

export const canDuplicate = true;

export const canSync = true;

interface BaseMockRoute {
body: string;
headers: RequestHeader[];
parentId: string;
statusCode: number;
statusText: string;
name: string;
mimeType: string;// response body type
method: string; // used only for sending the testing request
}

export type MockRoute = BaseModel & BaseMockRoute;

export function init(): BaseMockRoute {
return {
body: '',
headers: [],
parentId: '',
statusCode: 200,
statusText: '',
name: '/',
mimeType: 'application/json',
method: 'GET',
};
}

export const isMockRoute = (model: Pick<BaseModel, 'type'>): model is MockRoute => (
model.type === type
);

export function migrate(doc: MockRoute) {
return doc;
}

export function create(patch: Partial<MockRoute> = {}) {
if (!patch.parentId) {
throw new Error('New MockRoute missing `parentId`: ' + JSON.stringify(patch));
}

return db.docCreate<MockRoute>(type, patch);
}

export function update(
mockRoute: MockRoute,
patch: Partial<MockRoute> = {},
) {
return db.docUpdate<MockRoute>(mockRoute, patch);
}

export function getById(id: string) {
return db.get<MockRoute>(type, id);
}

export function findByParentId(parentId: string) {
return db.find<MockRoute>(type, { parentId });
}

export function removeWhere(parentId: string) {
return db.removeWhere(type, { parentId });
}

export function remove(mockRoute: MockRoute) {
return db.remove(mockRoute);
}

export function all() {
return db.all<MockRoute>(type);
}
91 changes: 91 additions & 0 deletions packages/insomnia/src/models/mock-server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { database as db } from '../common/database';
import { type BaseModel, workspace } from './index';

export const name = 'Mock Server';

export const type = 'MockServer';

export const prefix = 'mock';

export const canDuplicate = true;

export const canSync = true;

interface BaseMockServer {
parentId: string;
name: string;
url: string;
useInsomniaCloud: boolean;
}

export type MockServer = BaseModel & BaseMockServer;

export function init(): BaseMockServer {
return {
parentId: '',
name: 'New Mock',
url: 'http://localhost:8080',
useInsomniaCloud: true,
};
}

export const isMockServer = (model: Pick<BaseModel, 'type'>): model is MockServer => (
model.type === type
);

export function migrate(doc: MockServer) {
return doc;
}

export function create(patch: Partial<MockServer> = {}) {
if (!patch.parentId) {
throw new Error('New MockServer missing `parentId`: ' + JSON.stringify(patch));
}

return db.docCreate<MockServer>(type, patch);
}
export async function getOrCreateForParentId(
workspaceId: string,
patch: Partial<MockServer> = {},
) {
const mockServer = await db.getWhere<MockServer>(type, {
parentId: workspaceId,
});

if (!mockServer) {
return db.docCreate<MockServer>(type, { ...patch, parentId: workspaceId });
}

return mockServer;
}
export function update(
mockServer: MockServer,
patch: Partial<MockServer> = {},
) {
return db.docUpdate<MockServer>(mockServer, patch);
}

export function getById(id: string) {
return db.get<MockServer>(type, id);
}

export function getByParentId(parentId: string) {
return db.getWhere<MockServer>(type, { parentId });
}

export async function findByProjectId(projectId: string) {
const workspaces = await workspace.findByParentId(projectId);
return db.find<MockServer>(type, { parentId: { $in: workspaces.map(ws => ws._id) } });
}

export function removeWhere(parentId: string) {
return db.removeWhere(type, { parentId });
}

export function remove(mockServer: MockServer) {
return db.remove(mockServer);
}

export function all() {
return db.all<MockServer>(type);
}
Loading