Files
insomnia/packages/insomnia-data/__tests__/request.test.ts
Bingbing b09cde814d refactor: extract insomnia-data into workspace package (#10010)
Move insomnia-data models, services, database code, and common utilities into a dedicated workspace package. Update consumers to import from the new package entrypoints and declare workspace dependencies for the extracted package.
2026-06-02 09:49:10 +00:00

836 lines
24 KiB
TypeScript

/**
* @fileoverview Comprehensive tests for Request Model functionality
*
* This test suite covers all the authentication types and request body structures
* we added comments to in request.ts, ensuring they work correctly.
*/
import type {
AuthTypeAPIKey,
AuthTypeAsap,
AuthTypeAwsIam,
AuthTypeBasic,
AuthTypeBearer,
AuthTypeDigest,
AuthTypeHawk,
AuthTypeNetrc,
AuthTypeNTLM,
AuthTypeOAuth1,
AuthTypeOAuth2,
AuthTypeSingleToken,
RequestBody,
RequestHeader,
RequestParameter,
} from 'insomnia-data';
import { services } from 'insomnia-data';
import { v4 as uuidv4 } from 'uuid';
import { beforeEach, describe, expect, it } from 'vitest';
// @vitest-environment jsdom
describe('Request Model - Comprehensive Tests', () => {
beforeEach(async () => {
await services.settings.getOrCreate();
// Create test project for all tests
try {
await services.project.create({
_id: `proj_test_${uuidv4()}`,
name: 'Test Project',
});
} catch {
// Project might already exist, that's okay
}
});
describe('Basic Request Creation', () => {
it('should create a basic HTTP request', async () => {
const workspace = await services.workspace.create({
_id: 'wrk_basic_test',
name: 'Basic Test Workspace',
parentId: 'proj_test',
scope: 'collection',
});
const request = await services.request.create({
_id: 'req_basic',
name: 'Basic Request',
parentId: workspace._id,
url: 'https://api.example.com/test',
method: 'GET',
metaSortKey: 0,
});
expect(request).toMatchObject({
_id: 'req_basic',
name: 'Basic Request',
parentId: workspace._id,
url: 'https://api.example.com/test',
method: 'GET',
type: 'Request',
});
});
it('should create a request with headers', async () => {
const workspace = await services.workspace.create({
_id: 'wrk_headers',
name: 'Headers Test Workspace',
parentId: 'proj_test',
scope: 'collection',
});
const headers: RequestHeader[] = [
{ name: 'Content-Type', value: 'application/json' },
{ name: 'Authorization', value: 'Bearer token123' },
{ name: 'X-Custom-Header', value: 'custom-value' },
];
const request = await services.request.create({
_id: 'req_headers',
name: 'Request with Headers',
parentId: workspace._id,
url: 'https://api.example.com/headers',
method: 'POST',
headers,
metaSortKey: 0,
});
expect(request.headers).toEqual(headers);
});
it('should create a request with parameters', async () => {
const workspace = await services.workspace.create({
_id: 'wrk_params',
name: 'Parameters Test Workspace',
parentId: 'proj_test',
scope: 'collection',
});
const parameters: RequestParameter[] = [
{ name: 'page', value: '1' },
{ name: 'limit', value: '10' },
{ name: 'sort', value: 'created_at' },
];
const request = await services.request.create({
_id: 'req_params',
name: 'Request with Parameters',
parentId: workspace._id,
url: 'https://api.example.com/params',
method: 'GET',
parameters,
metaSortKey: 0,
});
expect(request.parameters).toEqual(parameters);
});
});
describe('Authentication Types', () => {
let workspace: any;
beforeEach(async () => {
workspace = await services.workspace.create({
_id: `wrk_auth_${uuidv4()}`,
name: 'Auth Test Workspace',
parentId: `proj_test_${uuidv4()}`,
scope: 'collection',
});
});
describe('Basic Authentication', () => {
it('should create request with basic auth', async () => {
const basicAuth: AuthTypeBasic = {
type: 'basic',
username: 'testuser',
password: 'testpass',
useISO88591: false,
};
const request = await services.request.create({
_id: 'req_basic_auth',
name: 'Basic Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/basic',
method: 'GET',
authentication: basicAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(basicAuth);
});
it('should create request with basic auth and ISO-8859-1 encoding', async () => {
const basicAuth: AuthTypeBasic = {
type: 'basic',
username: 'testuser',
password: 'testpass',
useISO88591: true,
};
const request = await services.request.create({
_id: 'req_basic_auth_iso',
name: 'Basic Auth ISO Request',
parentId: workspace._id,
url: 'https://api.example.com/basic-iso',
method: 'GET',
authentication: basicAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(basicAuth);
});
});
describe('API Key Authentication', () => {
it('should create request with API key in header', async () => {
const apiKeyAuth: AuthTypeAPIKey = {
type: 'apikey',
key: 'X-API-Key',
value: 'api-key-123',
addTo: 'header',
};
const request = await services.request.create({
_id: 'req_apikey_header',
name: 'API Key Header Request',
parentId: workspace._id,
url: 'https://api.example.com/apikey',
method: 'GET',
authentication: apiKeyAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(apiKeyAuth);
});
it('should create request with API key in query params', async () => {
const apiKeyAuth: AuthTypeAPIKey = {
type: 'apikey',
key: 'api_key',
value: 'api-key-123',
addTo: 'query',
};
const request = await services.request.create({
_id: 'req_apikey_query',
name: 'API Key Query Request',
parentId: workspace._id,
url: 'https://api.example.com/apikey',
method: 'GET',
authentication: apiKeyAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(apiKeyAuth);
});
});
describe('OAuth 2.0 Authentication', () => {
it('should create request with OAuth 2.0 authorization code flow', async () => {
const oauth2Auth: AuthTypeOAuth2 = {
type: 'oauth2',
grantType: 'authorization_code',
accessTokenUrl: 'https://auth.example.com/token',
authorizationUrl: 'https://auth.example.com/authorize',
clientId: 'test-client',
clientSecret: 'test-secret',
scope: 'read write',
redirectUrl: 'https://app.example.com/callback',
state: 'random-state',
audience: 'https://api.example.com',
resource: 'https://api.example.com',
};
const request = await services.request.create({
_id: 'req_oauth2_auth_code',
name: 'OAuth2 Auth Code Request',
parentId: workspace._id,
url: 'https://api.example.com/oauth2',
method: 'GET',
authentication: oauth2Auth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(oauth2Auth);
});
it('should create request with OAuth 2.0 client credentials flow', async () => {
const oauth2Auth: AuthTypeOAuth2 = {
type: 'oauth2',
grantType: 'client_credentials',
accessTokenUrl: 'https://auth.example.com/token',
clientId: 'test-client',
clientSecret: 'test-secret',
scope: 'read write',
};
const request = await services.request.create({
_id: 'req_oauth2_client_creds',
name: 'OAuth2 Client Creds Request',
parentId: workspace._id,
url: 'https://api.example.com/oauth2',
method: 'GET',
authentication: oauth2Auth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(oauth2Auth);
});
it('should create request with OAuth 2.0 password flow', async () => {
const oauth2Auth: AuthTypeOAuth2 = {
type: 'oauth2',
grantType: 'password',
accessTokenUrl: 'https://auth.example.com/token',
clientId: 'test-client',
clientSecret: 'test-secret',
username: 'testuser',
password: 'testpass',
scope: 'read write',
};
const request = await services.request.create({
_id: 'req_oauth2_password',
name: 'OAuth2 Password Request',
parentId: workspace._id,
url: 'https://api.example.com/oauth2',
method: 'GET',
authentication: oauth2Auth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(oauth2Auth);
});
});
describe('Digest Authentication', () => {
it('should create request with digest auth', async () => {
const digestAuth: AuthTypeDigest = {
type: 'digest',
username: 'testuser',
password: 'testpass',
};
const request = await services.request.create({
_id: 'req_digest_auth',
name: 'Digest Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/digest',
method: 'GET',
authentication: digestAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(digestAuth);
});
});
describe('NTLM Authentication', () => {
it('should create request with NTLM auth', async () => {
const ntlmAuth: AuthTypeNTLM = {
type: 'ntlm',
username: 'testuser',
password: 'testpass',
};
const request = await services.request.create({
_id: 'req_ntlm_auth',
name: 'NTLM Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/ntlm',
method: 'GET',
authentication: ntlmAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(ntlmAuth);
});
});
describe('AWS IAM Authentication', () => {
it('should create request with AWS IAM auth', async () => {
const awsIamAuth: AuthTypeAwsIam = {
type: 'iam',
accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
sessionToken: 'session-token-example',
region: 'us-east-1',
service: 'execute-api',
};
const request = await services.request.create({
_id: 'req_aws_iam_auth',
name: 'AWS IAM Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/aws',
method: 'GET',
authentication: awsIamAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(awsIamAuth);
});
});
describe('Hawk Authentication', () => {
it('should create request with Hawk auth', async () => {
const hawkAuth: AuthTypeHawk = {
type: 'hawk',
id: 'test-auth-id',
key: 'test-auth-key',
algorithm: 'sha256',
ext: 'test-ext',
validatePayload: true,
};
const request = await services.request.create({
_id: 'req_hawk_auth',
name: 'Hawk Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/hawk',
method: 'GET',
authentication: hawkAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(hawkAuth);
});
});
describe('Bearer Token Authentication', () => {
it('should create request with Bearer token auth', async () => {
const bearerAuth: AuthTypeBearer = {
type: 'bearer',
token: 'test-bearer-token',
prefix: 'Bearer',
};
const request = await services.request.create({
_id: 'req_bearer_auth',
name: 'Bearer Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/bearer',
method: 'GET',
authentication: bearerAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(bearerAuth);
});
});
describe('OAuth 1.0 Authentication', () => {
it('should create request with OAuth 1.0 auth', async () => {
const oauth1Auth: AuthTypeOAuth1 = {
type: 'oauth1',
consumerKey: 'test-consumer-key',
consumerSecret: 'test-consumer-secret',
tokenKey: 'test-token-key',
tokenSecret: 'test-token-secret',
signatureMethod: 'HMAC-SHA1',
realm: 'test-realm',
timestamp: '1234567890',
nonce: 'test-nonce',
version: '1.0',
callback: 'https://app.example.com/callback',
verifier: 'test-verifier',
};
const request = await services.request.create({
_id: 'req_oauth1_auth',
name: 'OAuth 1.0 Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/oauth1',
method: 'GET',
authentication: oauth1Auth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(oauth1Auth);
});
});
describe('ASAP Authentication', () => {
it('should create request with ASAP auth', async () => {
const asapAuth: AuthTypeAsap = {
type: 'asap',
issuer: 'test-issuer',
subject: 'test-subject',
audience: 'test-audience',
keyId: 'test-key-id',
privateKey: 'test-private-key',
additionalClaims: '{"customClaim": "custom-value"}',
};
const request = await services.request.create({
_id: 'req_asap_auth',
name: 'ASAP Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/asap',
method: 'GET',
authentication: asapAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(asapAuth);
});
});
describe('Single Token Authentication', () => {
it('should create request with Single Token auth', async () => {
const singleTokenAuth: AuthTypeSingleToken = {
type: 'singleToken',
token: 'test-single-token',
};
const request = await services.request.create({
_id: 'req_single_token_auth',
name: 'Single Token Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/single-token',
method: 'GET',
authentication: singleTokenAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(singleTokenAuth);
});
});
describe('Netrc Authentication', () => {
it('should create request with Netrc auth', async () => {
const netrcAuth: AuthTypeNetrc = {
type: 'netrc',
};
const request = await services.request.create({
_id: 'req_netrc_auth',
name: 'Netrc Auth Request',
parentId: workspace._id,
url: 'https://api.example.com/netrc',
method: 'GET',
authentication: netrcAuth,
metaSortKey: 0,
});
expect(request.authentication).toEqual(netrcAuth);
});
});
});
describe('Request Body Types', () => {
let workspace: any;
beforeEach(async () => {
workspace = await services.workspace.create({
_id: `wrk_body_${uuidv4()}`,
name: 'Body Test Workspace',
parentId: `proj_test_${uuidv4()}`,
scope: 'collection',
});
});
describe('JSON Body', () => {
it('should create request with JSON body', async () => {
const jsonBody: RequestBody = {
mimeType: 'application/json',
text: '{"name": "test", "value": 123}',
};
const request = await services.request.create({
_id: 'req_json_body',
name: 'JSON Body Request',
parentId: workspace._id,
url: 'https://api.example.com/json',
method: 'POST',
body: jsonBody,
metaSortKey: 0,
});
expect(request.body).toEqual(jsonBody);
});
});
describe('Form Data Body', () => {
it('should create request with form data body', async () => {
const formDataBody: RequestBody = {
mimeType: 'application/x-www-form-urlencoded',
params: [
{ name: 'field1', value: 'value1' },
{ name: 'field2', value: 'value2' },
],
};
const request = await services.request.create({
_id: 'req_form_data_body',
name: 'Form Data Body Request',
parentId: workspace._id,
url: 'https://api.example.com/form',
method: 'POST',
body: formDataBody,
metaSortKey: 0,
});
expect(request.body).toEqual(formDataBody);
});
});
describe('Multipart Form Data Body', () => {
it('should create request with multipart form data body', async () => {
const multipartBody: RequestBody = {
mimeType: 'multipart/form-data',
params: [
{ name: 'text_field', value: 'text_value', type: 'text' },
{ name: 'file_field', value: 'file_content', type: 'file', fileName: 'test.txt' },
],
};
const request = await services.request.create({
_id: 'req_multipart_body',
name: 'Multipart Body Request',
parentId: workspace._id,
url: 'https://api.example.com/multipart',
method: 'POST',
body: multipartBody,
metaSortKey: 0,
});
expect(request.body).toEqual(multipartBody);
});
});
describe('Raw Text Body', () => {
it('should create request with raw text body', async () => {
const rawTextBody: RequestBody = {
mimeType: 'text/plain',
text: 'This is raw text content',
};
const request = await services.request.create({
_id: 'req_raw_text_body',
name: 'Raw Text Body Request',
parentId: workspace._id,
url: 'https://api.example.com/raw',
method: 'POST',
body: rawTextBody,
metaSortKey: 0,
});
expect(request.body).toEqual(rawTextBody);
});
});
describe('XML Body', () => {
it('should create request with XML body', async () => {
const xmlBody: RequestBody = {
mimeType: 'application/xml',
text: '<?xml version="1.0"?><root><item>value</item></root>',
};
const request = await services.request.create({
_id: 'req_xml_body',
name: 'XML Body Request',
parentId: workspace._id,
url: 'https://api.example.com/xml',
method: 'POST',
body: xmlBody,
metaSortKey: 0,
});
expect(request.body).toEqual(xmlBody);
});
});
describe('Binary Body', () => {
it('should create request with binary body', async () => {
const binaryBody: RequestBody = {
mimeType: 'application/octet-stream',
fileName: 'test.bin',
};
const request = await services.request.create({
_id: 'req_binary_body',
name: 'Binary Body Request',
parentId: workspace._id,
url: 'https://api.example.com/binary',
method: 'POST',
body: binaryBody,
metaSortKey: 0,
});
expect(request.body).toEqual(binaryBody);
});
});
});
describe('GraphQL Operations', () => {
let workspace: any;
beforeEach(async () => {
workspace = await services.workspace.create({
_id: `wrk_graphql_${uuidv4()}`,
name: 'GraphQL Test Workspace',
parentId: `proj_test_${uuidv4()}`,
scope: 'collection',
});
});
it('should detect GraphQL query operation', async () => {
const request = await services.request.create({
_id: 'req_graphql_query',
name: 'GraphQL Query',
parentId: workspace._id,
url: 'https://api.example.com/graphql',
method: 'POST',
body: {
mimeType: 'application/json',
text: '{"query": "query { user { name } }"}',
},
metaSortKey: 0,
});
// The GraphQL operation type detection would be tested here
// This is a placeholder for the actual implementation
expect(request.body?.text).toContain('query');
});
it('should detect GraphQL mutation operation', async () => {
const request = await services.request.create({
_id: 'req_graphql_mutation',
name: 'GraphQL Mutation',
parentId: workspace._id,
url: 'https://api.example.com/graphql',
method: 'POST',
body: {
mimeType: 'application/json',
text: '{"query": "mutation { createUser(input: {name: \"test\"}) { id } }"}',
},
metaSortKey: 0,
});
expect(request.body?.text).toContain('mutation');
});
it('should detect GraphQL subscription operation', async () => {
const request = await services.request.create({
_id: 'req_graphql_subscription',
name: 'GraphQL Subscription',
parentId: workspace._id,
url: 'https://api.example.com/graphql',
method: 'POST',
body: {
mimeType: 'application/json',
text: '{"query": "subscription { userUpdated { id name } }"}',
},
metaSortKey: 0,
});
expect(request.body?.text).toContain('subscription');
});
});
describe('Request Updates', () => {
let workspace: any;
let request: any;
beforeEach(async () => {
workspace = await services.workspace.create({
_id: `wrk_update_${uuidv4()}`,
name: 'Update Test Workspace',
parentId: `proj_test_${uuidv4()}`,
scope: 'collection',
});
request = await services.request.create({
_id: `req_update_${uuidv4()}`,
name: 'Update Request',
parentId: workspace._id,
url: 'https://api.example.com/update',
method: 'GET',
metaSortKey: 0,
});
});
it('should update request name', async () => {
const updatedRequest = await services.request.update(request, {
name: 'Updated Request Name',
});
expect(updatedRequest.name).toBe('Updated Request Name');
});
it('should update request URL', async () => {
const updatedRequest = await services.request.update(request, {
url: 'https://api.example.com/updated',
});
expect(updatedRequest.url).toBe('https://api.example.com/updated');
});
it('should update request method', async () => {
const updatedRequest = await services.request.update(request, {
method: 'POST',
});
expect(updatedRequest.method).toBe('POST');
});
it('should update request headers', async () => {
const newHeaders: RequestHeader[] = [
{ name: 'Content-Type', value: 'application/json' },
{ name: 'Authorization', value: 'Bearer new-token' },
];
const updatedRequest = await services.request.update(request, {
headers: newHeaders,
});
expect(updatedRequest.headers).toEqual(newHeaders);
});
it('should update request authentication', async () => {
const newAuth: AuthTypeBasic = {
type: 'basic',
username: 'newuser',
password: 'newpass',
};
const updatedRequest = await services.request.update(request, {
authentication: newAuth,
});
expect(updatedRequest.authentication).toEqual(newAuth);
});
});
describe('Request Deletion', () => {
let workspace: any;
let request: any;
beforeEach(async () => {
workspace = await services.workspace.create({
_id: `wrk_delete_${uuidv4()}`,
name: 'Delete Test Workspace',
parentId: `proj_test_${uuidv4()}`,
scope: 'collection',
});
request = await services.request.create({
_id: `req_delete_${uuidv4()}`,
name: 'Delete Request',
parentId: workspace._id,
url: 'https://api.example.com/delete',
method: 'GET',
metaSortKey: 0,
});
});
it('should delete request', async () => {
await services.request.remove(request);
const deletedRequest = await services.request.getById(request._id);
expect(deletedRequest).toBeUndefined();
});
});
});