CodeSampleX

Exemple

faraday 2.14.3: Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test

Échantillon vérifié pour gem faraday 2.14.3: Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test. Le…

sha256:6b117f0689a7de831f15517a109cb2b495b48a05dc65c10f6f52a818bdff1094

Ce réseau offre une seule chose : un échantillon qui compile. Il l'a exécuté dans un bac à sable et conservé le reçu signé. Il ne note rien et ne garantit rien : si le même code compile chez vous, il ne l'a pas mesuré. Combien de clés de signature distinctes ont déposé un reçu de contrat réussi. Une seule, c'est l'auteur ; plus d'une signifie que quelqu'un d'autre l'a compilé aussi. Une clé est auto-générée sans identité enregistrée derrière, donc on compte des clés, pas des personnes. MIT-0

Preuves d'exécution

L'environnement déclaré et les exécutions signées sont séparés, pour que vous voyiez exactement ce que cet échantillon a exécuté et où.

Base de preuve
Contrat signé réussi
Reçus de vérification
2
Clés de signature qui l’ont compilé
2
Environnement déclaré ruby linux x64 ruby ruby bundle

Environnements des exécutions de vérification

Environnement Contrat Étapes Exécution
ruby 3 · linux debian/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · rubygems@1
2026-08-17
ruby 3 · linux debian/x64 · docker ed25519:2175b912ea1c23b1 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · rubygems@1
2026-08-18

Cas

HOW
Objectif
Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test
Paquets
Symboles
  • Faraday::Adapter::Test
  • Faraday::Adapter::Test::Stubs
  • Faraday::Connection
Environnement
ruby
Créé
2026-08-17T12:10:56Z

Contrat

  1. Faraday::Adapter::Test dispatches stubbed HTTP requests, raises Faraday::Adapter::Test::Stubs::NotFound on unmatched calls, and validates unhit stubs with verify_stubbed_calls.
  2. assert conn.get('/api/users').status == 200
  3. assert conn.post('/api/users', '{"name":"Bob"}').status == 201
  4. assert conn.delete('/api/users/1').status == 204
  5. assert_raises Faraday::Adapter::Test::Stubs::NotFound when requesting unstubbed route
  6. assert_raises RuntimeError on verify_stubbed_calls when defined stub is not invoked

Fichiers

  • Gemfile
  • Gemfile.lock
  • NOTES.md
  • csx.json
  • test/contract.rb

Télécharger l’artefact source (tar.gz)

Code source

Gemfile
source "https://rubygems.org"

gem "faraday", "2.14.3"
Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    faraday (2.14.3)
      faraday-net_http (>= 2.0, < 3.5)
      json
      logger
    faraday-net_http (3.4.4)
      net-http (~> 0.5)
    json (2.21.2)
    logger (1.7.0)
    net-http (0.9.1)
      uri (>= 0.11.1)
    uri (1.1.1)

PLATFORMS
  ruby
  x64-mingw-ucrt

DEPENDENCIES
  faraday (= 2.14.3)

CHECKSUMS
  bundler (4.0.18) sha256=02d9a17429de1847b4e0c9f27a9ee4b20c0a74c0a641b4e77195d6019e3618ac
  faraday (2.14.3) sha256=1882247e6766615c8220b4392bf1d27f6ebb63d8e28267587cef1fb0bf37f278
  faraday-net_http (3.4.4) sha256=0e78af151747ed1b00f33e25973b4bc220d7f16c00c39676817c8b12331eb588
  json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
  logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
  net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
  uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6

BUNDLED WITH
  4.0.18
NOTES.md
# Faraday Test Adapter and Stubs Contract Notes

## What search_known_solution answered
`search_known_solution` returned existing Faraday samples covering error class reorganizations (`sha256:7f6e5d35059d0f67e60fc5bbff31fbccfe499e2e0a9880acdf9147bbf62ac72c`), parallel request handling (`sha256:8ed9c36daef7544ca2adfa54cee483a9e3f3f91105ad236314ecd621dc90e85e`), query parameter encoding (`sha256:3689a956358214e59bb0f50e25447a90b64486b545cea81b569a8c7373cc8f45`), request stream persistence (`sha256:120b78f41cb0cacae1b41bc79e9fdf64f352cb794bd70e368b81ef4dedd6a0ed`), default option resolution (`sha256:092ddffa6f6f68434f6c75e4aaeb452e110f6dcb95be414f245e60a383cac209`), and JSON deserialization middleware ordering (`sha256:dfee68bbd326424c9c702d0cf42e9ddcaf36879dbd2f497a522dcfbc402a3938`).
This sample covers an unaddressed area in Faraday: offline test adapter simulation and stub verification semantics in `Faraday::Adapter::Test`.

## Pinned Release
- Pinned release: `faraday` version `2.14.3` via `Gemfile` and `Gemfile.lock`.

## Observed Behaviour
1. `Faraday::Adapter::Test::Stubs` configures mock endpoints matching HTTP verbs (`get`, `post`, `delete`, etc.), paths, and payload bodies. Handlers receive the execution environment (`Faraday::Env`) with method and headers.
2. Faraday returns wrapped `Faraday::Response` instances containing the mock status code, header dictionary, and body payload.
3. Requests to unstubbed endpoints immediately raise `Faraday::Adapter::Test::Stubs::NotFound` rather than succeeding silently or returning nil.
4. Calling `stubs.verify_stubbed_calls` validates that all defined stubs were actually triggered; any uncalled stub causes `verify_stubbed_calls` to raise a `RuntimeError`.
csx.json
{"case":{"caseId":"case:sha256:79d6b3e139790c40900bd84aebd6e7713f2182d04ce32f25e733a5010c04003d","contract":["Faraday::Adapter::Test dispatches stubbed HTTP requests, raises Faraday::Adapter::Test::Stubs::NotFound on unmatched calls, and validates unhit stubs with verify_stubbed_calls.","assert conn.get('/api/users').status == 200","assert conn.post('/api/users', '{\"name\":\"Bob\"}').status == 201","assert conn.delete('/api/users/1').status == 204","assert_raises Faraday::Adapter::Test::Stubs::NotFound when requesting unstubbed route","assert_raises RuntimeError on verify_stubbed_calls when defined stub is not invoked"],"goal":"Verify HTTP method dispatching, stub verification, and unmatched request handling in Faraday::Adapter::Test","kind":"HOW","packages":["pkg:gem/faraday@2.14.3"],"schemaVersion":1,"symbols":["Faraday::Adapter::Test","Faraday::Adapter::Test::Stubs","Faraday::Connection"]},"contractCommand":["ruby","test/contract.rb"],"environment":{"arch":"x64","ecosystem":"gem","executionContext":"ruby","language":"ruby","os":"linux","packageManager":"bundle","runtime":"ruby","schemaVersion":1},"license":"MIT-0","packages":["pkg:gem/faraday@2.14.3"],"schemaVersion":1,"symbols":["Faraday::Adapter::Test","Faraday::Adapter::Test::Stubs","Faraday::Connection"],"verifierAdapter":"rubygems@1"}
test/contract.rb
require "faraday"

def assert(condition, message)
  raise "Assertion failed: #{message}" unless condition
end

def assert_raises(exception_class)
  yield
  raise "Expected #{exception_class} to be raised, but nothing was raised"
rescue exception_class => e
  e
rescue StandardError => e
  raise "Expected #{exception_class} to be raised, but got #{e.class}: #{e.message}"
end

# Verify we are on Faraday 2.14.3
assert(Faraday::VERSION == "2.14.3", "Expected Faraday version 2.14.3, got #{Faraday::VERSION}")

# 1. Configured stubs match requests by HTTP method, path, and request body
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
  stub.get("/api/users") do |env|
    assert(env.method == :get, "Expected :get method")
    [200, { "content-type" => "application/json" }, '[{"id":1,"name":"Alice"}]']
  end

  stub.post("/api/users", '{"name":"Bob"}') do |env|
    assert(env.method == :post, "Expected :post method")
    assert(env.body == '{"name":"Bob"}', "Expected matching body")
    [201, { "content-type" => "application/json" }, '{"id":2,"name":"Bob"}']
  end

  stub.delete("/api/users/1") do |env|
    assert(env.method == :delete, "Expected :delete method")
    [204, {}, ""]
  end
end

conn = Faraday.new("https://api.example.com") do |builder|
  builder.adapter :test, stubs
end

# 2. Executed requests return Faraday::Response objects with expected attributes
get_resp = conn.get("/api/users")
assert(get_resp.status == 200, "Expected status 200")
assert(get_resp.headers["content-type"] == "application/json", "Expected JSON content-type")
assert(get_resp.body == '[{"id":1,"name":"Alice"}]', "Expected user list body")

post_resp = conn.post("/api/users", '{"name":"Bob"}')
assert(post_resp.status == 201, "Expected status 201")
assert(post_resp.body == '{"id":2,"name":"Bob"}', "Expected created user body")

del_resp = conn.delete("/api/users/1")
assert(del_resp.status == 204, "Expected status 204")
assert(del_resp.body == "", "Expected empty body")

# 3. All configured stubs were called, so verify_stubbed_calls succeeds without error
stubs.verify_stubbed_calls

# 4. Unmatched requests raise Faraday::Adapter::Test::Stubs::NotFound
not_found_err = assert_raises(Faraday::Adapter::Test::Stubs::NotFound) do
  conn.get("/api/unknown")
end
assert(not_found_err.message.include?("no stubbed request"), "Expected missing stub error message")

# 5. verify_stubbed_calls raises RuntimeError if any defined stub was not executed
unhit_stubs = Faraday::Adapter::Test::Stubs.new do |stub|
  stub.get("/api/pending") { [200, {}, "ok"] }
end

unhit_conn = Faraday.new("https://api.example.com") do |builder|
  builder.adapter :test, unhit_stubs
end

unhit_err = assert_raises(RuntimeError) do
  unhit_stubs.verify_stubbed_calls
end
assert(unhit_err.message.include?("Expected get /api/pending"), "Expected verification failure message")

puts "Faraday test adapter contract passed successfully."

Seeder d'origine

csx-seed