import RubyFaraday from './ruby.faraday'
import { Config, Http } from '../utils/generate'
import { describe, expect, test } from 'vitest'
describe('RubyFaraday.generate', () => {
test('should build a basic GET request', () => {
const httpRequest: Http = {
method: 'GET',
url: 'https://example.com'
}
const config: Config = {}
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.get do |req|
req.url "https://example.com"
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 = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.headers["Content-Type"] = "application/json"
req.headers["Authorization"] = "Bearer token"
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 = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.headers["Cookie"] = "key1=value1"
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 = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.body = {
"key1": "value1"
}.to_json
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',
num: 123,
key2: {
key3: 'value3'
},
key4: ['value4', 'value5'],
empty: null
}
}
const config: Config = {}
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.body = {
"key1": "value1",
"num": 123,
"key2": {
"key3": "value3"
},
"key4": [
"value4",
"value5"
],
"empty": null
}.to_json
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 message'
}
const config: Config = {}
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.headers["Content-Type"] = "text/plain"
req.body = "Plain text message"
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 = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.headers["Content-Type"] = "application/xml"
req.body = "test"
end
puts response.body
`.trim()
)
})
test('should handle array header values', () => {
const httpRequest: Http = {
method: 'GET',
url: 'https://example.com',
headers: {
Accept: ['application/json', 'application/xml']
}
}
const config: Config = {}
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.get do |req|
req.url "https://example.com"
req.headers["Accept"] = "application/json"
req.headers["Accept"] = "application/xml"
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: {
name: 'test'
}
}
const config: Config = { handleErrors: true }
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
begin
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.post do |req|
req.url "https://example.com"
req.headers["Content-Type"] = "application/json"
req.body = {
"name": "test"
}.to_json
end
puts response.body
rescue Faraday::Error => 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 = RubyFaraday.generate(config, httpRequest)
expect(result).toBe(
`
require "faraday"
conn = Faraday.new(url: "https://example.com") do |f|
f.adapter Faraday.default_adapter
end
response = conn.get do |req|
req.url "https://example.com"
req.params["address.zip"] = "66031"
req.params["address.country"] = "Wallis"
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', 'faraday'],
category: 'backend'
}
}
const config: Config = {}
const result = RubyFaraday.generate(config, httpRequest)
expect(result).toContain('req.params["tags"] = "ruby"')
expect(result).toContain('req.params["tags"] = "faraday"')
expect(result).toContain('req.params["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 = RubyFaraday.generate(config, httpRequest)
expect(result).toContain('req.params["version"] = "1.0"')
expect(result).toContain('"name": "John"')
})
})