はじめに
hkob の雑記録の第169回目は、ファイルプロパティへの File Upload object の更新のテストを追加します。
update_page_set_file_property_file_upload
昨日、FilesProperty にファイルを設定する files= メソッドをテスト・実装しました。今日はその結果として、page.save した時にプロパティの値が更新されることをテスト・実装します。
describe "update_page_set_file_property_file_upload" do let(:target) { Page.find TestConnection::FILE_UPLOAD_PAGE_ID } let(:file_upload_object) do instance_double FileUploadObject, id: TestConnection::FILE_UPLOAD_IMAGE_ID, fname: "test.png" end before do allow(file_upload_object).to receive(:is_a?).with(FileUploadObject).and_return(true) target.properties[:files].files = file_upload_object end describe "dry_run" do let(:dry_run) { target.save dry_run: true } it_behaves_like "dry run", :patch, :page_path, use_id: true, json_method: :property_values_json end describe "save" do before { target.save } subject { target.properties[:files].files.first.property_values_json } it "update files property with file upload object" do expect(subject).to eq( { "type": "file", "file": { "url": "https://prod-files-secure.s3.us-west-2.amazonaws.com/2b7b01f0-67a8-40f8-acd4-88dd2805f216/bf91dfb5-72e5-4c22-bab7-f4b9f343610f/ErSxuLeq.png-medium.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466VJRYGJCE%2F20250616%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250616T114259Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHQaCXVzLXdlc3QtMiJHMEUCIQD0E8dP%2F%2BzS5z7cq265pOJ2TCwtWcsI18R9LixNBgcSkwIgQqbS2KaIxR45oN4MT3EFiWmLk5KMcE1o2ZEGrP0JVKUq%2FwMIXRAAGgw2Mzc0MjMxODM4MDUiDFrW4E3yE1A5P6rtTyrcA%2FyvZ3E46Ow%2BafVD3xtUBD7Bue6jwaklkp0tMZ%2BlTGGbMuIOOD3U%2F3d0%2F5QNz7dP3VcG7Wz9uOxBlgiwNQ8YQ4w%2FLWzgxpyJsKaknGqb%2BlF0tli6lVVyZGP6HjxUVUs3wK%2FMVMMUqmouGdXSB%2BoakInlRs6zXQfbn0%2BIk7M65Tglom0apy%2B3EBRC6mAT83zj29Xee%2BY8XBlhBY7LOEDgCgpayXfaGvxxW6DozoPs9ff1LJgt6Zm6mhMFGGEy3qj%2BnQl%2BEyx7EOyRjl7HEX3BpGX5wX2fBEzjGlP%2Fa66IXS9xV363gWZJSxIR98TDmYCS2sNJ88rlJxfUQdyf4nX5miouy7cJi%2BC3K5jBCnCBU3jY99m1ht6xfKkAi7JmsPhSZNa%2FIL8tCUKfv64kxtq%2FHINoRvVJVfsysg5uzMUwNeFqxnECTQ0EpjygWjziBtUZQSvA%2FCkdQ3M4tu0hiXEf1dOjKzwhqHa0YiW8QluFeUI7TxdC6ubdEceCJo1zDSG7zToM0ynHVpjsdUeE%2FqGembHkBmVC8ZyfFV9nWC7fFFYmLp8uwmxOPf5Nxx79ig69Bzc1jQM46ev%2FwdmLL%2B3CNJcJZ8v%2F9bgpz8fEx4MA7cpqKvzHyWQUoEWaRcufMMv%2Fv8IGOqUBqS8jCM3xIg%2F79eDsSgHLpcgpGlYozBf2mKOxn321b8JP2sUUO%2B8q2JLbaBy6%2BoLAeAWjkjgiQxgS967fdr3XjYMTYyorrXiON4yrnTdZs4AWB4QWDCtmkbpDR1nca%2BU20M7nONNXwYJ%2F3bZXrXAM%2FEEXBeOMqIwQQgA4UdLNyXY0KF6cKoPOU3r8idGi83tm7a9Tkvurc2X1TaGKzhqnZ4YLPdyz&X-Amz-Signature=c7eac743bb0ce89b2755c4e381f21ebd6e4c6f7802462b274eb1d5c8570a5dfc&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject", "expiry_time": "2025-06-16T12:42:59.075Z", }, }, ) end end end
dry_run の結果については、基本的に shell スクリプトが正しく作成されているかを確認するものです。仕様の表示では一部が省略されてしまっていますが、正しく payload が作成されていることがわかります。
update_page_set_file_property_file_upload
dry_run
behaves like dry run
is expected to eq "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/pages/20bd8e4e98ab80c79576dcf6f6e5ee4a' \\\n -H...load\":{\"id\":\"20cd8e4e98ab81aa973b00b23083c115\"},\"name\":\"test.png\"}],\"type\":\"files\"}}}'"
save の方は WebMock の stub が存在しないので、以下のようなエラーになりました。
1) NotionRubyMapping::FilesProperty update_page_set_file_property_file_upload save update files property with file upload object Failure/Error: response = @client.send(method) do |request| request.headers["Authorization"] = "Bearer #{@notion_token}" case method when :get, :delete request.url path, options when :post, :put, :patch request.headers["Content-Type"] = "application/json" request.path = path request.body = options.to_json unless options.empty? else WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. Please stub: PATCH https://api.notion.com/v1/pages/20bd8e4e98ab80c79576dcf6f6e5ee4a with body '{"properties":{"files":{"files":[{"type":"file_upload","file_upload":{"id":"20cd8e4e98ab81aa973b00b23083c115"},"name":"test.png"}],"type":"files"}}}' with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Authorization'=>'Bearer secret_J08RBf9SlofiMhuIeJZc6AnI5qHXwDOaq4RolJFaaZ0', 'Content-Type'=>'application/json', 'Notion-Version'=>'2022-06-28', 'User-Agent'=>'Faraday v2.13.1'}
dry_run で送られる payload に対する stub が必要となります。これは spec_helper にて登録を行います。upload_page の下に stubs を一括作成するメソッドを用意しているので、そこに payload を追加します。FILE_UPLOAD_PAGE_ID のページに、{} 以下の payload を入れた時に、200 の response code を返し、update_page_set_file_property_file_upload.json を返すという stub が追加されます。
def update_page generate_stubs_sub :patch, __method__, :page_path, { (中略) set_file_property_file_upload: [ FILE_UPLOAD_PAGE_ID, 200, { properties: { files: { files: [ { type: "file_upload", file_upload: { id: TestConnection::FILE_UPLOAD_IMAGE_ID, }, name: "test.png", }, ], type: "files", }, }, } ], } end
この stub を登録したことで、以下のように file_property のテストが全て通過しました。
save
update files property with file upload object
Finished in 0.09852 seconds (files took 0.77606 seconds to load)
63 examples, 0 failures
おわりに
これでページの FilesProperty の更新処理までが完了しました。明日は FileBlock のテスト・実装を記載してみます。