import RubyNetHttp from './ruby.nethttp' import { Config, Http } from '../utils/generate' import { describe, test, expect } from 'vitest' describe('RubyNetHttp.generate', () => { test('should build a basic GET request', () => { const httpRequest: Http = { method: 'GET', url: 'https://example.com' } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Get.new(uri) response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with headers', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer token' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request["Content-Type"] = "application/json" request["Authorization"] = "Bearer token" response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with cookies', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', cookies: { key1: 'value1' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request["Cookie"] = "key1=value1" response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with body', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', body: { key1: 'value1' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request.body = { "key1": "value1" }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with advanced json body', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', body: { key1: 'value1', key2: { key3: 'value3' }, key4: ['value4'], key5: [{ key6: 'value6' }], empty: null } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request.body = { "key1": "value1", "key2": { "key3": "value3" }, "key4": [ "value4" ], "key5": [{ "key6": "value6" } ], "empty": null }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with text/plain body', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', headers: { 'Content-Type': 'text/plain' }, body: 'Plain text content here' } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request["Content-Type"] = "text/plain" request.body = "Plain text content here" response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with XML body', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', headers: { 'Content-Type': 'application/xml' }, body: 'test' } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request["Content-Type"] = "application/xml" request.body = "test" response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a PUT request', () => { const httpRequest: Http = { method: 'PUT', url: 'https://example.com/resource/123', headers: { 'Content-Type': 'application/json' }, body: { name: 'updated' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com/resource/123") request = Net::HTTP::Put.new(uri) request["Content-Type"] = "application/json" request.body = { "name": "updated" }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a DELETE request', () => { const httpRequest: Http = { method: 'DELETE', url: 'https://example.com/resource/123' } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com/resource/123") request = Net::HTTP::Delete.new(uri) response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a PATCH request (generic method)', () => { const httpRequest: Http = { method: 'PATCH', url: 'https://example.com/resource/123', body: { status: 'active' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com/resource/123") request = Net::HTTP::GenericRequest.new("PATCH", uri.path, nil, nil) request.body = { "status": "active" }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should handle array header values', () => { const httpRequest: Http = { method: 'GET', url: 'https://example.com', headers: { Accept: ['application/json', 'text/plain'] } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") request = Net::HTTP::Get.new(uri) request["Accept"] = "application/json" request["Accept"] = "text/plain" response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a POST request with error handling', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', headers: { 'Content-Type': 'application/json' }, body: { test: 'data' } } const config: Config = { handleErrors: true } const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" begin uri = URI.parse("https://example.com") request = Net::HTTP::Post.new(uri) request["Content-Type"] = "application/json" request.body = { "test": "data" }.to_json response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body rescue StandardError => e puts "Error: #{e.message}" end `.trim() ) }) test('should build a GET request with URL parameters', () => { const httpRequest: Http = { method: 'GET', url: 'https://example.com', params: { 'address.zip': '66031', 'address.country': 'Wallis' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toBe( ` require "net/http" require "uri" uri = URI.parse("https://example.com") params = { "address.zip" => "66031", "address.country" => "Wallis", } uri.query = URI.encode_www_form(params) request = Net::HTTP::Get.new(uri) response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http| http.request(request) end puts response.body `.trim() ) }) test('should build a GET request with array URL parameters', () => { const httpRequest: Http = { method: 'GET', url: 'https://example.com', params: { tags: ['ruby', 'nethttp'], category: 'backend' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toContain('"tags" => ["ruby", "nethttp"],') expect(result).toContain('"category" => "backend",') }) test('should build a POST request with URL parameters and body', () => { const httpRequest: Http = { method: 'POST', url: 'https://example.com', params: { version: '1.0' }, headers: { 'Content-Type': 'application/json' }, body: { name: 'John' } } const config: Config = {} const result = RubyNetHttp.generate(config, httpRequest) expect(result).toContain('"version" => "1.0",') expect(result).toContain('"name": "John"') }) })