# How-toガイド - ストリーミングトリガー/アクションのテストの書き方

このセグメントでは、Workatoのファイルストリーミング機能を利用するアクションのテストの書き方について説明します。これを行うために、ジェネリックなファイルをURLにアップロードするコネクタの例を使用します。こちらを参照してください。

# テストの生成

各アクションごとに別々のspecファイルを作成するか、workato generate testコマンドを使用してコネクタに基づいてテストを生成することができます。これにより、必要なスタブのほとんどが含まれた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を使用して設定のインスタンスを作成する必要があります。これはWorkato上の接続と同義です。前述のコネクタのインスタンスもこの設定のインスタンスを使用します。

  let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }

# ステップ3 - アクションを定義する

関連するインスタンスを作成した後、actionをインスタンス化して、テストの残りの部分で簡単に参照できるようにします。

  let(:action) { connector.actions.upload_file_to_url }

# ステップ3 - テストを記述し、subjectとinputを定義する

ここでは、実行したいテストの「グループ」を記述します。この場合、キーワードexecuteを使用します。次に、subjectを実行の結果である出力にします。最後に、inputを定義します。これは単純なストリームです。

  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

# ステップ4 - 各テストのアサーションを宣言する

テストが合格または不合格になるためには、比較が宣言される必要があります。

ここでは、executeラムダの出力がfile_sizefile_pathfile_nameのキーを含むことを「期待」しています。さらに、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
  end

# rSpecでストリームをモックするバリエーション

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
          # ストリームモックアプリケーションへの認証リクエストを行う場合の接続設定
          # Workato::Connector::Sdk::Settings.from_fileも使用できます
          domain: 'acme.egnyte.com',
          api_key: 'api_key'
        },
        connection: {
          # optional
          # ストリームソースアプリケーションへの認証リクエストを行う場合の接続定義
          # コネクタの接続定義と同じブロックをサポートしています
          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'
  }
end


Last updated: 2024/2/13 16:59:53