はじめに
hkob の雑記録の第174回目は、カバー画像への File Upload object の更新のテスト・実装を追加します。
external url の cover 更新 JSON の取得
これまで icon の設定は実装していましたが、cover 画像の実装はしていませんでした。せっかくなので、今回 File upload object の更新 JSON を取得していたので、外部 URL に対するものも取得しておきます。 update_page_set_cover_link.sh は以下のようになります。 update_page_set_icon_link.sh の "icon": の部分を "cover": に変更しただけです。make して update_page_set_cover_link.json を作成しました(今回掲載は省略します)。
curl https://api.notion.com/v1/pages/c01166c613ae45cbb96818b4ef2f5a77 \
-H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
-H "Content-Type: application/json" \
-H "Notion-Version: 2022-06-28" \
-X PATCH \
--data '{
"cover": {
"type": "external",
"external": {
"url": "https://cdn.profile-image.st-hatena.com/users/hkob/profile.png"
}
}
}'
set_cover のテスト追加
set_icon のテストを丸ごとコピーして、cover に修正しました。icon と異なり、emoji の設定はないので、その部分だけテストを抜いています。あとは icon と書かれている部分を cover に文字列置換しました。
describe "set_cover" do
let(:target) { Page.new id: TestConnection::TOP_PAGE_ID }
before do
target.set_cover(**params)
end
subject { target.cover }
context "with cover link" do
let(:url) { "https://cdn.profile-image.st-hatena.com/users/hkob/profile.png" }
let(:params) { {url: url} }
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 }
it "update cover (link)" do
expect(subject).to eq({type: "external", external: {url: url}})
end
end
end
context "with file upload object" do
let(:id) { TestConnection::FILE_UPLOAD_IMAGE_ID }
let(:file_upload_object) { instance_double(FileUploadObject, id: id) }
let(:params) { {file_upload_object: file_upload_object} }
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 }
it "update cover (file upload object)" do
expect(subject).to eq(
{
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=ASIAZI2LB466SCWC6OQZ%2F20250608%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250608T113828Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELD%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJHMEUCIQDe03nZgmH7Wn6IuW2LJ8zusL56DWxSXVuL4fCn7m%2FX7wIgPQUVMnT7H7AlHkOMYF24RP6syOfRN9TDtbFA%2BHv06coqiAQIif%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDKbsbrsELLC9IAkAjyrcA51TQ0z5zUWBamgsA6Teq1kJYyjzsvpHmAoZYpHS7HeAAVwP%2BTcphLXbV8tMPH9JV1lcmDgPflGUZIbamcFPGHSzC%2F22be1cRRh5aDb0vSNqRr63rWGYthiXnJ8ynK4TXhQyfaNpKDLGm%2BdkVkMabCK2JpWvvDoBW4BUJGLC7S6Lt09QWTZT9P1YuyILW%2BnZvd4%2BRZd%2F3UVPwwhh%2FJtCIVcAon8APIlEZ%2B0YkhD8F95eMBRrvkbGzVQEv0SpAWcVwLOiISBlR4e0h9tlZoeG5%2Ff8Fhj92WypusgyDLH1F4Mmn74kXeK5WwwTxxOCkdexLOh4Rpd%2F84bkiSHVvtSk7UdyNvMaFp7vAmmAI%2Bis7FNA3z%2FcZ8D4z%2BHcXjgwB8lLSdEPU1pZw4mE2MWyuP8SKNiTIWHAcVkEPHOiB2Kd3ZP0B2r8%2BOc1%2FIPRr%2BynDYSOxbhBqlZElC77gjuBe2byLyHm67Ru2qVeDtSLSFCXEgFv0SlMFYwUb4n16cJbqPNKoLvV7ZeaJQIbdclSruAQPkj%2BAA%2FPJgTZQLOl%2Fg6PkEWJt6BoBULPNhnwzLfIqbyrmHci67%2F8RcfQlBVVkbYLL%2B94V%2Fr0xdn0ZQdA73nVnnpN85FxIJ0y%2BmppKuUHMPaJlcIGOqUB656TNrFS4EUM2b%2F4N%2F3CiBPAjL266ada7GcGy6dMEA1hkMKJnqBQI%2FX41gvrDLgMhuunoOIvRmj46fXQT8iYWgrBsO8jkIFE6YRT5PhsnxBfqhVfm1sJ0mIhg3p75JPVTgGqBdSkqoFifHrr0Nvp9ILsfu1qAJAHezeSdFEc%2BDbq%2BLFelG8jAy9qW3JAsM%2BoVYOlz%2BsTJIOSw9v3iGkOpeicieJT&X-Amz-Signature=43148ab23f35a6aad7e20f2cb910dc4382bfac5568fcd6b4481ab8eb91ef0234&X-Amz-SignedHeaders=host&x-id=GetObject",
expiry_time: "2025-06-08T12:38:28.886Z",
},
type: "file",
},
)
end
end
end
end
set_cover の実装
当然これまで set_cover を実装していなかったので、以下のようなエラーになりました。
NoMethodError: undefined method 'set_cover' for an instance of NotionRubyMapping::Page
set_icon は base.rb に実装していました。 set_cover も同じ場所に作成します。コピーして emoji 引数を取り除けばよさそうです。
# @param [String, nil] url # @param [String, nil] file_upload_object # @return [NotionRubyMapping::Base] def set_cover(url: nil, file_upload_object: nil) @payload.set_cover(url: url, file_upload_object: file_upload_object) if page? || database? self end
単に @payload に丸投げしただけなので、まだ NoMethodError が続くのは変わりません。
NoMethodError: undefined method 'set_cover' for an instance of NotionRubyMapping::Payload
Payload#set_cover も Payload#set_icon を emoji を除いてほぼそのままです。
# @param [String, nil] url # @param [String, nil] file_upload_object # @return [NotionRubyMapping::Payload] def set_cover(url: nil, file_upload_object: nil) payload = if url {type: "external", external: {url: url}} elsif file_upload_object {type: "file_upload", file_upload: {id: file_upload_object.id}} else {} end @json[:cover] = payload self end
そもそも page#cover メソッドが存在していませんでした。
NoMethodError: undefined method 'cover' for an instance of NotionRubyMapping::Page
cover も icon と同じように実装します。
# @return [Hash, nil] obtained Hash def cover self[:cover] end
これで無事に全てのテストが通過しました。
set_cover
with cover link
dry_run
behaves like dry run
is expected to eq "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/pages/c01166c613ae45cbb96818b4ef2f5a77' \\\n -H...rnal\",\"external\":{\"url\":\"https://cdn.profile-image.st-hatena.com/users/hkob/profile.png\"}}}'"
save
update cover (link)
with file upload object
dry_run
behaves like dry run
is expected to eq "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/pages/c01166c613ae45cbb96818b4ef2f5a77' \\\n -H..."cover\":{\"type\":\"file_upload\",\"file_upload\":{\"id\":\"20cd8e4e98ab81aa973b00b23083c115\"}}}'"
save
update cover (file upload object)
おわりに
2回ほどスキップしてしまいましたが、cover 画像の設定をテスト・実装しました。中身は emoji がないだけで、icon と実装が同じでした。