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) ⇒ FunctionsFramework::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) ⇒ FunctionsFramework::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 |
# 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 |