NotionRubyMapping のアップデート(16) : hkob の雑記録 (174)

はじめに

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_coverPayload#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

covericon と同じように実装します。

    # @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 と実装が同じでした。

hkob.notion.site