ハウツーガイド - ストリーミングトリガー/アクションのテストの記述
このセグメントでは、汎用的なURLへのファイルアップロードコネクターの例を参考に、Workatoのファイルストリーミング機能を利用するアクションのテストの記述について説明します。
テストの生成
アクションごとに個別のspecファイルを作成することも、workato generate testコマンドを使用してconnectorに基づいてテストを生成することもできます。 これにより、テストの作成を開始するために必要なスタブの大半を含むspecファイルが生成されます。
サンプルRSpecコンテンツ
RSpec.describe 'actions/upload_file_to_url', :vcr do
let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }
let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }
before do
stub_const('Workato::Connector::Sdk::Stream::Reader::DEFAULT_FRAME_SIZE', 5.kilobytes)
end
let(:action) { connector.actions.upload_file_to_url }
describe 'execute' do
subject(:output) { action.execute(settings, input) }
let(:input) do
{
"file_name": "sample_file",
"file": {
"__stream__": true,
"chunks": {
"0": "abcd",
"4": "efgh",
"8": "ijkl",
"12": "mn"
}
},
"url": "https://www.friendly_s3_url.com/upload"
}
end
it 'given simple stream' do
it 'produces a file' do
is_expected.to include(:file_size)
expect(output.file_size).to eq(13)
is_expected.to include(:file_path)
is_expected.to include(:file_name)
end
end
end
endステップ1 - コネクターインスタンスの定義
テストを開始するには、Workato SDK Gemを使用してコネクターのインスタンスを作成する必要があります。
let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }ステップ2 - 設定インスタンスの定義
次に、Workato SDK Gemを使用してsettingsのインスタンスを作成する必要があります。 これはWorkato上のコネクションと同義です。 前に定義したコネクターインスタンスでも、この設定インスタンスが使用されることに注意してください。
let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }ステップ3 - アクションの定義
関連するインスタンスを作成したら、残りのテストで参照しやすいようにactionをインスタンス化します。
let(:action) { connector.actions.upload_file_to_url }ステップ3 - テストの説明、subjectと入力の定義
ここでは、実行するテストの"family"を記述します。 この場合、キーワードexecuteを使用します。 次に、subjectをアクションの実行結果である出力にします。 最後に、シンプルなストリームであるinputを宣言します。
describe 'execute' do
subject(:output) { action.execute(settings, input) }
let(:input) do
{
"file_name": "sample_file",
"file": {
# this hash simulates a file stream which is
# the output of a download file object
"__stream__": true,
"chunks": {
"0": "abcd",
"4": "efgh",
"8": "ijkl",
"12": "mn"
}
},
"url": "https://www.friendly_s3_url.com/upload"
}
endステップ4 - 個々のテストのアサーションの宣言
テストが成功または失敗するには、宣言された比較が必要です。
ここでは、executeラムダの出力にキーfile_size、file_path、file_nameが含まれることを"expect"すると宣言しています。 さらに、file_sizeの値が13であることを期待します。
it 'given simple stream' do
it 'produces a file' do
is_expected.to include(:file_size)
expect(output.file_size).to eq(13)
is_expected.to include(:file_path)
is_expected.to include(:file_name)
end
endRSpecでストリームをモックするバリエーション
RSpecテスト内でシンプルなストリームをモックするだけでなく、他のバリエーションもモックできます。
各チャンクを明示的に指定してストリームをモックする
let(:input) do
{
file_name: 'sample_file',
file: {
__stream__: true,
chunks: {
0 => 'abcd',
4 => 'efgh',
8 => 'ijkl',
12 => 'mn'
}
},
url: 'https://www.friendly_s3_url.com/upload'
}
end同じコネクター内のダウンロードファイルアクション/トリガー用に実装されたストリームを利用してストリームをモックする
let(:input) do
{
file_name: 'sample_file',
file: {
__stream__: true,
name: 'global_stream',
input: {
file_path: '/path/to/sample/file'
}
},
url: 'https://www.friendly_s3_url.com/upload'
}
end独自の認証を持つストリームのインライン定義を指定して、ストリームをモックします
TIP
このような高度なモックは、RSpecテストでのみ使用でき、CLI実行では使用できません。
let(:input) do
{
file_name: 'sample_file',
file: {
__stream__: true,
name: 'mock_advanced_stream',
input: {
file_path: '/path/to/sample/file'
},
settings: {
# optional
# A connection settings for stream mock application
# if the mock makes authorized requests to external apps
# Also can use Workato::Connector::Sdk::Settings.from_file
domain: 'acme.egnyte.com',
api_key: 'api_key'
},
connection: {
# optional
# A connection definition for stream source applications
# if the mock makes authorized requests to external apps
# It supports the same blocks as connector's connection definition
authorization: {
type: 'api_key',
apply: lambda do |connection|
headers(api_key: connection['api_key'])
end
},
},
chunks: lambda do |input, _first_byte, last_byte, size|
chunk = get("/pubapi/v1/fs-content/#{file_path}").
headers("Range": "bytes=#{starting_byte_range}-#{ending_byte_range}").
response_format_raw
[chunk, chunk.size < requested_byte_size]
end
},
url: 'https://www.friendly_s3_url.com/upload'
}
end静的ストリームを指定してストリームをモックする
let(:input) do
{
file_name: 'sample_file',
file: {
data: '1234567890',
oef: true
},
url: 'https://www.friendly_s3_url.com/upload'
}
end文字列を指定してストリームをモックする
let(:input) do
{
file_name: 'sample_file',
file: 'qwertyuiop[]',
url: 'https://www.friendly_s3_url.com/upload'
}
endLast updated: