Module: FunctionsFramework::Testing
Overview
Helpers for writing unit tests.
Methods on this module can be called as module methods, or this module can be included in a test class.
Example
Suppose we have the following app that uses the functions framework:
# app.rb
require "functions_framework"
FunctionsFramework.http "my-function" do |request|
"Hello, world!"
end
The following is a test that could be run against that app:
# test_app.rb
require "minitest/autorun"
require "functions_framework/testing"
class MyTest < Minitest::Test
# Make the testing methods available.
include FunctionsFramework::Testing
def test_my_function
# Load app.rb and apply its functions within this block
load_temporary "app.rb" do
# Create a mock http (rack) request
request = make_get_request "http://example.com"
# Call the function and get a rack response
response = call_http "my-function", request
# Assert against the response
assert_equal "Hello, world!", response.body.join
end
end
end
Instance Method Summary collapse
-
#call_event(name, event) ⇒ nil
Call the given event function for testing.
-
#call_http(name, request) ⇒ Rack::Response
Call the given HTTP function for testing.
-
#load_temporary(path, &block) ⇒ Object
Load the given functions source for the duration of the given block, and restore the previous status afterward.
-
#make_cloud_event(data, id: nil, source: nil, type: nil, spec_version: nil, data_content_type: nil, data_schema: nil, subject: nil, time: nil) ⇒ ::CloudEvents::Event
Make a simple CloudEvent, for passing to a function test.
-
#make_get_request(url, headers = []) ⇒ Rack::Request
Make a simple GET request, for passing to a function test.
-
#make_post_request(url, body, headers = []) ⇒ Rack::Request
Make a simple POST request, for passing to a function test.
-
#make_request(url, method: ::Rack::GET, body: nil, headers: []) ⇒ Rack::Request
Make a Rack request, for passing to a function test.
Instance Method Details
#call_event(name, event) ⇒ nil
Call the given event function for testing. The underlying function must be of type :cloud_event`.
106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/functions_framework/testing.rb', line 106 def call_event name, event function = ::FunctionsFramework.global_registry[name] case function&.type when :cloud_event function.new_call.call event nil when nil raise "Unknown function name #{name}" else raise "Function #{name} is not a CloudEvent function" end end |
#call_http(name, request) ⇒ Rack::Response
Call the given HTTP function for testing. The underlying function must
be of type :http
.
86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/functions_framework/testing.rb', line 86 def call_http name, request function = ::FunctionsFramework.global_registry[name] case function&.type when :http Testing.interpret_response { function.new_call.call request } when nil raise "Unknown function name #{name}" else raise "Function #{name} is not an HTTP function" end end |
#load_temporary(path, &block) ⇒ Object
Load the given functions source for the duration of the given block, and restore the previous status afterward.
73 74 75 76 |
# File 'lib/functions_framework/testing.rb', line 73 def load_temporary path, &block path = ::File. path Testing.load_for_testing path, &block end |
#make_cloud_event(data, id: nil, source: nil, type: nil, spec_version: nil, data_content_type: nil, data_schema: nil, subject: nil, time: nil) ⇒ ::CloudEvents::Event
Make a simple CloudEvent, for passing to a function test. The event data is required, but all other parameters are optional (i.e. a reasonable or random value will be generated if not provided).
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/functions_framework/testing.rb', line 184 def make_cloud_event data, id: nil, source: nil, type: nil, spec_version: nil, data_content_type: nil, data_schema: nil, subject: nil, time: nil id ||= "random-id-#{rand 100_000_000}" source ||= "functions-framework-testing" type ||= "com.example.test" spec_version ||= "1.0" ::CloudEvents::Event.new id: id, source: source, type: type, spec_version: spec_version, data_content_type: data_content_type, data_schema: data_schema, subject: subject, time: time, data: data end |
#make_get_request(url, headers = []) ⇒ Rack::Request
Make a simple GET request, for passing to a function test.
148 149 150 |
# File 'lib/functions_framework/testing.rb', line 148 def make_get_request url, headers = [] make_request url, headers: headers end |
#make_post_request(url, body, headers = []) ⇒ Rack::Request
Make a simple POST request, for passing to a function test.
163 164 165 |
# File 'lib/functions_framework/testing.rb', line 163 def make_post_request url, body, headers = [] make_request url, method: ::Rack::POST, body: body, headers: headers end |
#make_request(url, method: ::Rack::GET, body: nil, headers: []) ⇒ Rack::Request
Make a Rack request, for passing to a function test.
131 132 133 134 135 136 |
# File 'lib/functions_framework/testing.rb', line 131 def make_request url, method: ::Rack::GET, body: nil, headers: [] env = Testing.build_standard_env URI(url), headers env[::Rack::REQUEST_METHOD] = method env[::Rack::RACK_INPUT] = ::StringIO.new body if body ::Rack::Request.new env end |