Module: FunctionsFramework::Testing

Extended by:
Testing
Included in:
Testing
Defined in:
lib/functions_framework/testing.rb

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

Instance Method Details

#call_event(name, event) ⇒ nil

Call the given event function for testing. The underlying function must be of type :cloud_event`.

Parameters:

  • name (String)

    The name of the function to call

  • event (::CloudEvents::Event)

    The event to send

Returns:

  • (nil)


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.

Parameters:

  • name (String)

    The name of the function to call

  • request (Rack::Request)

    The Rack request to send

Returns:

  • (Rack::Response)


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.

Parameters:

  • path (String)

    File path to load



73
74
75
76
# File 'lib/functions_framework/testing.rb', line 73

def load_temporary path, &block
  path = ::File.expand_path 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).

Parameters:

  • data (Object)

    The data

  • id (String) (defaults to: nil)

    Event ID (optional)

  • source (String, URI) (defaults to: nil)

    Event source (optional)

  • type (String) (defaults to: nil)

    Event type (optional)

  • spec_version (String) (defaults to: nil)

    Spec version (optional)

  • data_content_type (String, ::CloudEvents::ContentType) (defaults to: nil)

    Content type for the data (optional)

  • data_schema (String, URI) (defaults to: nil)

    Data schema (optional)

  • subject (String) (defaults to: nil)

    Subject (optional)

  • time (String, DateTime) (defaults to: nil)

    Event timestamp (optional)

Returns:

  • (::CloudEvents::Event)


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.

Parameters:

  • url (URI, String)

    The URL to get.

  • headers (Array, Hash) (defaults to: [])

    HTTP headers. May be given as a hash (of header names mapped to values), an array of strings (where each string is of the form Header-Name: Header value), or an array of two-element string arrays.

Returns:

  • (Rack::Request)


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.

Parameters:

  • url (URI, String)

    The URL to post to.

  • body (String)

    The body to post.

  • headers (Array, Hash) (defaults to: [])

    HTTP headers. May be given as a hash (of header names mapped to values), an array of strings (where each string is of the form Header-Name: Header value), or an array of two-element string arrays.

Returns:

  • (Rack::Request)


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.

Parameters:

  • url (URI, String)

    The URL to get, including query params.

  • method (String) (defaults to: ::Rack::GET)

    The HTTP method (defaults to "GET").

  • body (String) (defaults to: nil)

    The HTTP body, if any.

  • headers (Array, Hash) (defaults to: [])

    HTTP headers. May be given as a hash (of header names mapped to values), an array of strings (where each string is of the form Header-Name: Header value), or an array of two-element string arrays.

Returns:

  • (Rack::Request)


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