import { describe, it, expect } from 'vitest' import { formatRequest } from '../../src/formatter/request.js' import type { RequestFile } from '../../src/types.js' function makeGet(overrides: Partial = {}): RequestFile { return { info: { name: 'Get Users', type: 'http', seq: 1 }, http: { method: 'GET', url: 'https://api.example.com/users' }, ...overrides, } } describe('formatRequest', () => { it('emits meta block', () => { const out = formatRequest(makeGet()) expect(out).toContain('meta {') expect(out).toContain('name: Get Users') expect(out).toContain('type: http') expect(out).toContain('seq: 1') }) it('emits HTTP method block', () => { const out = formatRequest(makeGet()) expect(out).toContain('get {') expect(out).toContain('url: https://api.example.com/users') expect(out).toContain('auth: none') expect(out).toContain('body: none') }) it('emits POST with JSON body', () => { const req = makeGet({ info: { name: 'Create', type: 'http' }, http: { method: 'POST', url: 'https://api.example.com/users', body: { type: 'json', data: '{"name":"John"}' }, }, }) const out = formatRequest(req) expect(out).toContain('post {') expect(out).toContain('body: json') expect(out).toContain('body:json {') expect(out).toContain('{"name":"John"}') }) it('emits bearer auth block', () => { const req = makeGet({ http: { method: 'GET', url: 'https://api.example.com', auth: { type: 'bearer', bearer: { token: '{{token}}' } }, }, }) const out = formatRequest(req) expect(out).toContain('auth: bearer') expect(out).toContain('auth:bearer {') expect(out).toContain('token: {{token}}') }) it('emits basic auth block', () => { const req = makeGet({ http: { method: 'GET', url: 'https://api.example.com', auth: { type: 'basic', basic: { username: 'admin', password: 'secret' } }, }, }) const out = formatRequest(req) expect(out).toContain('auth: basic') expect(out).toContain('auth:basic {') expect(out).toContain('username: admin') }) it('uses ~ prefix for disabled params and headers', () => { const req = makeGet({ http: { method: 'GET', url: 'https://api.example.com', params: [ { name: 'page', value: '1', type: 'query', disabled: false }, { name: 'debug', value: 'true', type: 'query', disabled: true }, ], headers: [ { name: 'Accept', value: 'application/json', disabled: false }, { name: 'X-Disabled', value: 'val', disabled: true }, ], }, }) const out = formatRequest(req) expect(out).toContain('~debug: true') expect(out).toContain('~X-Disabled: val') expect(out).not.toContain('~page:') expect(out).not.toContain('~Accept:') }) it('emits assert block', () => { const req = makeGet({ runtime: { assertions: [ { expression: 'res.status', operator: 'eq', value: '200' }, ], }, }) const out = formatRequest(req) expect(out).toContain('assert {') expect(out).toContain('res.status: eq 200') }) it('emits settings block', () => { const req = makeGet({ settings: { encodeUrl: true } }) const out = formatRequest(req) expect(out).toContain('settings {') expect(out).toContain('encodeUrl: true') }) it('emits form-urlencoded body as dict block', () => { const req = makeGet({ http: { method: 'POST', url: 'https://api.example.com', body: { type: 'form-urlencoded', data: [ { name: 'username', value: 'admin', enabled: true }, { name: 'password', value: 'secret', enabled: false }, ], }, }, }) const out = formatRequest(req) expect(out).toContain('body:form-urlencoded {') expect(out).toContain('username: admin') expect(out).toContain('~password: secret') }) })