cronofy 0.37.1 → 0.37.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/README.md +10 -1
- data/lib/cronofy/client.rb +31 -11
- data/lib/cronofy/version.rb +1 -1
- data/spec/lib/cronofy/client_spec.rb +224 -2
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1338eaab0825a963c74f2c5fd3c434d01185a4bbc36fa57504b0e1edd539fe9e
         | 
| 4 | 
            +
              data.tar.gz: 55a045316dbb1545ee7e4f14284ebbbc0aa7b91848ba28d165968125d2221bb3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 38ee7c99226bfe70c6e970a22477de0130e93fe07130b9d2c0a596e17178f66435ec58a97be5f18e9b6ac5624eefef7dde96443a8cc91c85f02818016ed64f7d
         | 
| 7 | 
            +
              data.tar.gz: 8d0d1641e57b0751988ac5f7978571d2dbd6d6ea12b96ff2314a33d0d9b87c7a11eb5e16775c55b070a312c2efb6b8b353dc3c3f7a8cbe9b3f42c943d6afa21a
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,15 @@ | |
| 1 | 
            +
            ## [0.37.4]
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Support client_secret only clients being able to authorize `#availability` calls. [#97]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## [0.37.3]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             * Support `hmac_valid` as well as the original `hmac_match` for Client to verify a HMAC from a push notification using the client's secret.[#95] 
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ## [0.37.2]
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             * Support `query_periods` as well as the original `available_periods` for Availability Query and Sequenced Availability [#91] 
         | 
| 12 | 
            +
             | 
| 1 13 | 
             
            ## [0.37.1]
         | 
| 2 14 |  | 
| 3 15 | 
             
             * Rename `data_centre` to `data_centre` (with aliases for backwards compatibility) [#90] 
         | 
| @@ -182,6 +194,9 @@ | |
| 182 194 | 
             
            [0.36.1]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.36.1
         | 
| 183 195 | 
             
            [0.37.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.0
         | 
| 184 196 | 
             
            [0.37.1]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.1
         | 
| 197 | 
            +
            [0.37.2]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.2
         | 
| 198 | 
            +
            [0.37.3]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.3
         | 
| 199 | 
            +
            [0.37.4]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.37.4
         | 
| 185 200 |  | 
| 186 201 | 
             
            [#13]: https://github.com/cronofy/cronofy-ruby/pull/13
         | 
| 187 202 | 
             
            [#16]: https://github.com/cronofy/cronofy-ruby/pull/16
         | 
| @@ -225,3 +240,6 @@ | |
| 225 240 | 
             
            [#85]: https://github.com/cronofy/cronofy-ruby/pull/85
         | 
| 226 241 | 
             
            [#86]: https://github.com/cronofy/cronofy-ruby/pull/86
         | 
| 227 242 | 
             
            [#90]: https://github.com/cronofy/cronofy-ruby/pull/90
         | 
| 243 | 
            +
            [#91]: https://github.com/cronofy/cronofy-ruby/pull/91
         | 
| 244 | 
            +
            [#95]: https://github.com/cronofy/cronofy-ruby/pull/95
         | 
| 245 | 
            +
            [#97]: https://github.com/cronofy/cronofy-ruby/pull/97
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # Cronofy
         | 
| 2 2 |  | 
| 3 | 
            -
            [](https://github.com/cronofy/cronofy-ruby/actions/workflows/ci.yml)
         | 
| 4 4 | 
             
            [](http://badge.fury.io/rb/cronofy)
         | 
| 5 5 |  | 
| 6 6 | 
             
            [Cronofy](https://www.cronofy.com) - the scheduling platform for business
         | 
| @@ -134,6 +134,15 @@ To delete an event from user's calendar: | |
| 134 134 | 
             
            cronofy.delete_event(calendar_id, 'uniq-id')
         | 
| 135 135 | 
             
            ```
         | 
| 136 136 |  | 
| 137 | 
            +
            ## A feature I want is not in the SDK, how do I get it?
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            We add features to this SDK as they are requested, to focus on developing the Cronofy API.
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            If you're comfortable contributing support for an endpoint or attribute, then we love to receive pull requests!
         | 
| 142 | 
            +
            Please create a PR mentioning the feature/API endpoint you’ve added and we’ll review it as soon as we can.
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            If you would like to request a feature is added by our team then please let us know by getting in touch via [support@cronofy.com](mailto:support@cronofy.com).
         | 
| 145 | 
            +
             | 
| 137 146 | 
             
            ## Links
         | 
| 138 147 |  | 
| 139 148 | 
             
             * [API documentation](https://www.cronofy.com/developers/api)
         | 
    
        data/lib/cronofy/client.rb
    CHANGED
    
    | @@ -471,24 +471,33 @@ module Cronofy | |
| 471 471 | 
             
                  parse_json(Channel, "channel", response)
         | 
| 472 472 | 
             
                end
         | 
| 473 473 |  | 
| 474 | 
            +
                # DEPRECATED: Please use hmac_valid instead.
         | 
| 475 | 
            +
                def hmac_match?(args)
         | 
| 476 | 
            +
                  warn "[DEPRECATION] `hmac_match?` is deprecated. Please use `hmac_valid?` instead."
         | 
| 477 | 
            +
                  hmac_valid?(args)
         | 
| 478 | 
            +
                end
         | 
| 479 | 
            +
             | 
| 474 480 | 
             
                # Public: Verifies a HMAC from a push notification using the client secret.
         | 
| 475 481 | 
             
                #
         | 
| 476 482 | 
             
                # args - A Hash containing the details of the push notification:
         | 
| 477 483 | 
             
                #        :body - A String of the body of the notification.
         | 
| 478 | 
            -
                #        :hmac - A String  | 
| 484 | 
            +
                #        :hmac - A String containing comma-separated values describing HMACs of the notification taken from the
         | 
| 479 485 | 
             
                #                Cronofy-HMAC-SHA256 header.
         | 
| 480 486 | 
             
                #
         | 
| 481 | 
            -
                # Returns true if the HMAC provided matches the one calculated using the
         | 
| 487 | 
            +
                # Returns true if one of the HMAC provided matches the one calculated using the
         | 
| 482 488 | 
             
                # client secret, otherwise false.
         | 
| 483 | 
            -
                def  | 
| 489 | 
            +
                def hmac_valid?(args)
         | 
| 484 490 | 
             
                  body = args[:body]
         | 
| 485 491 | 
             
                  hmac = args[:hmac]
         | 
| 486 492 |  | 
| 493 | 
            +
                  return false if hmac.nil? || hmac.empty?
         | 
| 494 | 
            +
             | 
| 487 495 | 
             
                  sha256 = OpenSSL::Digest.new('sha256')
         | 
| 488 496 | 
             
                  digest = OpenSSL::HMAC.digest(sha256, @client_secret, body)
         | 
| 489 497 | 
             
                  calculated = Base64.encode64(digest).strip
         | 
| 490 498 |  | 
| 491 | 
            -
                   | 
| 499 | 
            +
                  hmac_list = hmac.split(',')
         | 
| 500 | 
            +
                  hmac_list.include?(calculated)
         | 
| 492 501 | 
             
                end
         | 
| 493 502 |  | 
| 494 503 | 
             
                # Public: Lists all the notification channels for the account.
         | 
| @@ -803,7 +812,7 @@ module Cronofy | |
| 803 812 | 
             
                #                                for a single participant group.
         | 
| 804 813 | 
             
                #           :required_duration - An Integer representing the minimum number
         | 
| 805 814 | 
             
                #                                of minutes of availability required.
         | 
| 806 | 
            -
                #           : | 
| 815 | 
            +
                #           :query_periods     - An Array of available time periods Hashes,
         | 
| 807 816 | 
             
                #                                each must specify a start and end Time.
         | 
| 808 817 | 
             
                #           :start_interval    - An Integer representing the start interval
         | 
| 809 818 | 
             
                #                                of minutes for the availability query.
         | 
| @@ -833,9 +842,9 @@ module Cronofy | |
| 833 842 | 
             
                    options[:buffer] = map_availability_buffer(buffer)
         | 
| 834 843 | 
             
                  end
         | 
| 835 844 |  | 
| 836 | 
            -
                  translate_available_periods(options[:available_periods])
         | 
| 845 | 
            +
                  translate_available_periods(options[:query_periods] || options[:available_periods])
         | 
| 837 846 |  | 
| 838 | 
            -
                  response =  | 
| 847 | 
            +
                  response = availability_post("/v1/availability", options)
         | 
| 839 848 |  | 
| 840 849 | 
             
                  parse_collections(
         | 
| 841 850 | 
             
                    response,
         | 
| @@ -847,7 +856,7 @@ module Cronofy | |
| 847 856 | 
             
                # Public: Performs an sequenced availability query.
         | 
| 848 857 | 
             
                #
         | 
| 849 858 | 
             
                # options - The Hash options used to refine the selection (default: {}):
         | 
| 850 | 
            -
                # | 
| 859 | 
            +
                #             :sequence          - An Array of sequence defintions containing
         | 
| 851 860 | 
             
                #                                a Hash of:
         | 
| 852 861 | 
             
                #             :sequence_id       - A String to uniquely identify this part
         | 
| 853 862 | 
             
                #                                of the proposed sequence.
         | 
| @@ -861,7 +870,7 @@ module Cronofy | |
| 861 870 | 
             
                #                                of minutes for the availability query.
         | 
| 862 871 | 
             
                #             :buffer            - An Hash containing the buffer to apply to
         | 
| 863 872 | 
             
                #                                the availability query.
         | 
| 864 | 
            -
                # | 
| 873 | 
            +
                #             :query_periods     - An Array of available time periods Hashes,
         | 
| 865 874 | 
             
                #                                each must specify a start and end Time.
         | 
| 866 875 | 
             
                #
         | 
| 867 876 | 
             
                # Returns an Array of Sequences.
         | 
| @@ -878,9 +887,9 @@ module Cronofy | |
| 878 887 | 
             
                def sequenced_availability(options = {})
         | 
| 879 888 | 
             
                  options[:sequence] = map_availability_sequence(options[:sequence])
         | 
| 880 889 |  | 
| 881 | 
            -
                  translate_available_periods(options[:available_periods])
         | 
| 890 | 
            +
                  translate_available_periods(options[:query_periods] || options[:available_periods])
         | 
| 882 891 |  | 
| 883 | 
            -
                  response =  | 
| 892 | 
            +
                  response = availability_post("/v1/sequenced_availability", options)
         | 
| 884 893 | 
             
                  parse_collection(Sequence, "sequences", response)
         | 
| 885 894 | 
             
                end
         | 
| 886 895 |  | 
| @@ -1802,6 +1811,17 @@ module Cronofy | |
| 1802 1811 | 
             
                  wrapped_request { @auth.api_client.request(:post, url, json_request_args(body)) }
         | 
| 1803 1812 | 
             
                end
         | 
| 1804 1813 |  | 
| 1814 | 
            +
                # Availability Query could originally be authenticated via an access_token
         | 
| 1815 | 
            +
                # Whilst it should be authed via an API key now, we try access_token first
         | 
| 1816 | 
            +
                # for backward compatibility
         | 
| 1817 | 
            +
                def availability_post(url, body)
         | 
| 1818 | 
            +
                  if @auth.access_token
         | 
| 1819 | 
            +
                    post(url, body)
         | 
| 1820 | 
            +
                  else
         | 
| 1821 | 
            +
                    wrapped_request { api_key!.post(url, json_request_args(body)) }
         | 
| 1822 | 
            +
                  end
         | 
| 1823 | 
            +
                end
         | 
| 1824 | 
            +
             | 
| 1805 1825 | 
             
                def wrapped_request
         | 
| 1806 1826 | 
             
                  yield
         | 
| 1807 1827 | 
             
                rescue OAuth2::Error => e
         | 
    
        data/lib/cronofy/version.rb
    CHANGED
    
    
| @@ -266,6 +266,7 @@ describe Cronofy::Client do | |
| 266 266 | 
             
                      ],
         | 
| 267 267 | 
             
                    }
         | 
| 268 268 | 
             
                  end
         | 
| 269 | 
            +
             | 
| 269 270 | 
             
                  let(:request_body) do
         | 
| 270 271 | 
             
                    {
         | 
| 271 272 | 
             
                      :event_id => "qTtZdczOccgaPncGJaCiLg",
         | 
| @@ -1256,6 +1257,17 @@ describe Cronofy::Client do | |
| 1256 1257 | 
             
                  let(:request_url) { 'https://api.cronofy.com/v1/availability' }
         | 
| 1257 1258 | 
             
                  let(:request_headers) { json_request_headers }
         | 
| 1258 1259 |  | 
| 1260 | 
            +
                  let(:client_id) { 'example_id' }
         | 
| 1261 | 
            +
                  let(:client_secret) { 'example_secret' }
         | 
| 1262 | 
            +
                  let(:token) { client_secret }
         | 
| 1263 | 
            +
             | 
| 1264 | 
            +
                  let(:client) do
         | 
| 1265 | 
            +
                    Cronofy::Client.new(
         | 
| 1266 | 
            +
                      client_id: client_id,
         | 
| 1267 | 
            +
                      client_secret: client_secret,
         | 
| 1268 | 
            +
                    )
         | 
| 1269 | 
            +
                  end
         | 
| 1270 | 
            +
             | 
| 1259 1271 | 
             
                  let(:request_body) do
         | 
| 1260 1272 | 
             
                    {
         | 
| 1261 1273 | 
             
                      "participants" => [
         | 
| @@ -1718,6 +1730,138 @@ describe Cronofy::Client do | |
| 1718 1730 | 
             
                    it_behaves_like 'a Cronofy request'
         | 
| 1719 1731 | 
             
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 1720 1732 | 
             
                  end
         | 
| 1733 | 
            +
             | 
| 1734 | 
            +
                  context "when given query_periods instead of available_periods" do
         | 
| 1735 | 
            +
                    let(:participants) do
         | 
| 1736 | 
            +
                      { members: %w{acc_567236000909002 acc_678347111010113} }
         | 
| 1737 | 
            +
                    end
         | 
| 1738 | 
            +
             | 
| 1739 | 
            +
                    let(:required_duration) { 60 }
         | 
| 1740 | 
            +
             | 
| 1741 | 
            +
                    let(:query_periods) do
         | 
| 1742 | 
            +
                      [
         | 
| 1743 | 
            +
                        { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
         | 
| 1744 | 
            +
                        { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
         | 
| 1745 | 
            +
                      ]
         | 
| 1746 | 
            +
                    end
         | 
| 1747 | 
            +
             | 
| 1748 | 
            +
                    let(:request_body) do
         | 
| 1749 | 
            +
                      {
         | 
| 1750 | 
            +
                        "participants" => [
         | 
| 1751 | 
            +
                          {
         | 
| 1752 | 
            +
                            "members" => [
         | 
| 1753 | 
            +
                              { "sub" => "acc_567236000909002" },
         | 
| 1754 | 
            +
                              { "sub" => "acc_678347111010113" }
         | 
| 1755 | 
            +
                            ],
         | 
| 1756 | 
            +
                            "required" => "all"
         | 
| 1757 | 
            +
                          }
         | 
| 1758 | 
            +
                        ],
         | 
| 1759 | 
            +
                        "query_periods" => [
         | 
| 1760 | 
            +
                          {
         | 
| 1761 | 
            +
                            "start" => "2017-01-03T09:00:00Z",
         | 
| 1762 | 
            +
                            "end" => "2017-01-03T18:00:00Z"
         | 
| 1763 | 
            +
                          },
         | 
| 1764 | 
            +
                          {
         | 
| 1765 | 
            +
                            "start" => "2017-01-04T09:00:00Z",
         | 
| 1766 | 
            +
                            "end" => "2017-01-04T18:00:00Z"
         | 
| 1767 | 
            +
                          }
         | 
| 1768 | 
            +
                        ],
         | 
| 1769 | 
            +
                        "required_duration" => { "minutes" => 60 },
         | 
| 1770 | 
            +
                      }
         | 
| 1771 | 
            +
                    end
         | 
| 1772 | 
            +
             | 
| 1773 | 
            +
                    subject do
         | 
| 1774 | 
            +
                      client.availability(
         | 
| 1775 | 
            +
                        participants: participants,
         | 
| 1776 | 
            +
                        required_duration: required_duration,
         | 
| 1777 | 
            +
                        query_periods: query_periods
         | 
| 1778 | 
            +
                      )
         | 
| 1779 | 
            +
                    end
         | 
| 1780 | 
            +
             | 
| 1781 | 
            +
                    it_behaves_like 'a Cronofy request'
         | 
| 1782 | 
            +
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 1783 | 
            +
                  end
         | 
| 1784 | 
            +
             | 
| 1785 | 
            +
                  context "when trying to auth with only an access_token, as originally implemented" do
         | 
| 1786 | 
            +
                    let(:access_token) { "access_token_123"}
         | 
| 1787 | 
            +
                    let(:client) { Cronofy::Client.new(access_token: access_token) }
         | 
| 1788 | 
            +
                    let(:request_headers) do
         | 
| 1789 | 
            +
                      {
         | 
| 1790 | 
            +
                        "Authorization" => "Bearer #{access_token}",
         | 
| 1791 | 
            +
                        "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}",
         | 
| 1792 | 
            +
                        "Content-Type" => "application/json; charset=utf-8",
         | 
| 1793 | 
            +
                      }
         | 
| 1794 | 
            +
                    end
         | 
| 1795 | 
            +
             | 
| 1796 | 
            +
                    let(:participants) do
         | 
| 1797 | 
            +
                      { members: %w{acc_567236000909002 acc_678347111010113} }
         | 
| 1798 | 
            +
                    end
         | 
| 1799 | 
            +
             | 
| 1800 | 
            +
                    let(:required_duration) { 60 }
         | 
| 1801 | 
            +
             | 
| 1802 | 
            +
                    let(:available_periods) do
         | 
| 1803 | 
            +
                      [
         | 
| 1804 | 
            +
                        { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
         | 
| 1805 | 
            +
                        { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
         | 
| 1806 | 
            +
                      ]
         | 
| 1807 | 
            +
                    end
         | 
| 1808 | 
            +
             | 
| 1809 | 
            +
                    it_behaves_like 'a Cronofy request'
         | 
| 1810 | 
            +
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 1811 | 
            +
                  end
         | 
| 1812 | 
            +
             | 
| 1813 | 
            +
                  context "when trying to auth with both a client_secret and access_token" do
         | 
| 1814 | 
            +
                    let(:access_token) { "access_token_123" }
         | 
| 1815 | 
            +
                    let(:client_secret) { "client_secret_456" }
         | 
| 1816 | 
            +
                    let(:client) { Cronofy::Client.new(access_token: access_token, client_secret: client_secret) }
         | 
| 1817 | 
            +
                    let(:request_headers) do
         | 
| 1818 | 
            +
                      {
         | 
| 1819 | 
            +
                        "Authorization" => "Bearer #{access_token}",
         | 
| 1820 | 
            +
                        "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}",
         | 
| 1821 | 
            +
                        "Content-Type" => "application/json; charset=utf-8",
         | 
| 1822 | 
            +
                      }
         | 
| 1823 | 
            +
                    end
         | 
| 1824 | 
            +
             | 
| 1825 | 
            +
                    let(:participants) do
         | 
| 1826 | 
            +
                      { members: %w{acc_567236000909002 acc_678347111010113} }
         | 
| 1827 | 
            +
                    end
         | 
| 1828 | 
            +
             | 
| 1829 | 
            +
                    let(:required_duration) { 60 }
         | 
| 1830 | 
            +
             | 
| 1831 | 
            +
                    let(:available_periods) do
         | 
| 1832 | 
            +
                      [
         | 
| 1833 | 
            +
                        { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
         | 
| 1834 | 
            +
                        { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
         | 
| 1835 | 
            +
                      ]
         | 
| 1836 | 
            +
                    end
         | 
| 1837 | 
            +
             | 
| 1838 | 
            +
                    describe "it prefers the access_token for backward compatibility" do
         | 
| 1839 | 
            +
                      it_behaves_like 'a Cronofy request'
         | 
| 1840 | 
            +
                      it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 1841 | 
            +
                    end
         | 
| 1842 | 
            +
                  end
         | 
| 1843 | 
            +
             | 
| 1844 | 
            +
                  context "when trying to auth without a client_secret or access_token" do
         | 
| 1845 | 
            +
                    let(:client) { Cronofy::Client.new }
         | 
| 1846 | 
            +
             | 
| 1847 | 
            +
                    let(:participants) do
         | 
| 1848 | 
            +
                      { members: %w{acc_567236000909002 acc_678347111010113} }
         | 
| 1849 | 
            +
                    end
         | 
| 1850 | 
            +
             | 
| 1851 | 
            +
                    let(:required_duration) { 60 }
         | 
| 1852 | 
            +
             | 
| 1853 | 
            +
                    let(:available_periods) do
         | 
| 1854 | 
            +
                      [
         | 
| 1855 | 
            +
                        { start: Time.parse("2017-01-03T09:00:00Z"), end: Time.parse("2017-01-03T18:00:00Z") },
         | 
| 1856 | 
            +
                        { start: Time.parse("2017-01-04T09:00:00Z"), end: Time.parse("2017-01-04T18:00:00Z") },
         | 
| 1857 | 
            +
                      ]
         | 
| 1858 | 
            +
                    end
         | 
| 1859 | 
            +
             | 
| 1860 | 
            +
             | 
| 1861 | 
            +
                    it "raises an API Key error" do
         | 
| 1862 | 
            +
                      expect{ subject }.to raise_error(Cronofy::CredentialsMissingError)
         | 
| 1863 | 
            +
                    end
         | 
| 1864 | 
            +
                  end
         | 
| 1721 1865 | 
             
                end
         | 
| 1722 1866 | 
             
              end
         | 
| 1723 1867 |  | 
| @@ -1727,6 +1871,17 @@ describe Cronofy::Client do | |
| 1727 1871 | 
             
                  let(:request_url) { 'https://api.cronofy.com/v1/sequenced_availability' }
         | 
| 1728 1872 | 
             
                  let(:request_headers) { json_request_headers }
         | 
| 1729 1873 |  | 
| 1874 | 
            +
                  let(:client_id) { 'example_id' }
         | 
| 1875 | 
            +
                  let(:client_secret) { 'example_secret' }
         | 
| 1876 | 
            +
                  let(:token) { client_secret }
         | 
| 1877 | 
            +
             | 
| 1878 | 
            +
                  let(:client) do
         | 
| 1879 | 
            +
                    Cronofy::Client.new(
         | 
| 1880 | 
            +
                      client_id: client_id,
         | 
| 1881 | 
            +
                      client_secret: client_secret,
         | 
| 1882 | 
            +
                    )
         | 
| 1883 | 
            +
                  end
         | 
| 1884 | 
            +
             | 
| 1730 1885 | 
             
                  let(:request_body) do
         | 
| 1731 1886 | 
             
                    {
         | 
| 1732 1887 | 
             
                      "sequence" => [
         | 
| @@ -1873,6 +2028,57 @@ describe Cronofy::Client do | |
| 1873 2028 |  | 
| 1874 2029 | 
             
                  it_behaves_like 'a Cronofy request'
         | 
| 1875 2030 | 
             
                  it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 2031 | 
            +
             | 
| 2032 | 
            +
                  context "when passing query_periods instead" do
         | 
| 2033 | 
            +
                    before do
         | 
| 2034 | 
            +
                      args[:query_periods] = args[:available_periods]
         | 
| 2035 | 
            +
                      args.delete(:available_periods)
         | 
| 2036 | 
            +
                      request_body["query_periods"] = request_body["available_periods"]
         | 
| 2037 | 
            +
                      request_body.delete("available_periods")
         | 
| 2038 | 
            +
                    end
         | 
| 2039 | 
            +
             | 
| 2040 | 
            +
                    it_behaves_like 'a Cronofy request'
         | 
| 2041 | 
            +
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 2042 | 
            +
                  end
         | 
| 2043 | 
            +
             | 
| 2044 | 
            +
                  context "when trying to auth with access_token only" do
         | 
| 2045 | 
            +
                    let(:access_token) { "access_token_123"}
         | 
| 2046 | 
            +
                    let(:client) { Cronofy::Client.new(access_token: access_token) }
         | 
| 2047 | 
            +
                    let(:request_headers) do
         | 
| 2048 | 
            +
                      {
         | 
| 2049 | 
            +
                        "Authorization" => "Bearer #{access_token}",
         | 
| 2050 | 
            +
                        "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}",
         | 
| 2051 | 
            +
                        "Content-Type" => "application/json; charset=utf-8",
         | 
| 2052 | 
            +
                      }
         | 
| 2053 | 
            +
                    end
         | 
| 2054 | 
            +
             | 
| 2055 | 
            +
                    it_behaves_like 'a Cronofy request'
         | 
| 2056 | 
            +
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 2057 | 
            +
                  end
         | 
| 2058 | 
            +
             | 
| 2059 | 
            +
                  context "when trying to auth with both access_token and client_secret provided" do
         | 
| 2060 | 
            +
                    let(:client_id) { 'example_id' }
         | 
| 2061 | 
            +
                    let(:client_secret) { 'example_secret' }
         | 
| 2062 | 
            +
                    let(:access_token) { "access_token_123"}
         | 
| 2063 | 
            +
             | 
| 2064 | 
            +
                    let(:client) do
         | 
| 2065 | 
            +
                      Cronofy::Client.new(
         | 
| 2066 | 
            +
                        client_id: client_id,
         | 
| 2067 | 
            +
                        client_secret: client_secret,
         | 
| 2068 | 
            +
                        access_token: access_token,
         | 
| 2069 | 
            +
                      )
         | 
| 2070 | 
            +
                    end
         | 
| 2071 | 
            +
                    let(:request_headers) do
         | 
| 2072 | 
            +
                      {
         | 
| 2073 | 
            +
                        "Authorization" => "Bearer #{access_token}",
         | 
| 2074 | 
            +
                        "User-Agent" => "Cronofy Ruby #{::Cronofy::VERSION}",
         | 
| 2075 | 
            +
                        "Content-Type" => "application/json; charset=utf-8",
         | 
| 2076 | 
            +
                      }
         | 
| 2077 | 
            +
                    end
         | 
| 2078 | 
            +
             | 
| 2079 | 
            +
                    it_behaves_like 'a Cronofy request'
         | 
| 2080 | 
            +
                    it_behaves_like 'a Cronofy request with mapped return value'
         | 
| 2081 | 
            +
                  end
         | 
| 1876 2082 | 
             
                end
         | 
| 1877 2083 | 
             
              end
         | 
| 1878 2084 |  | 
| @@ -2417,11 +2623,27 @@ describe Cronofy::Client do | |
| 2417 2623 | 
             
                let(:body) { "{\"example\":\"well-known\"}" }
         | 
| 2418 2624 |  | 
| 2419 2625 | 
             
                it "verifies the correct HMAC" do
         | 
| 2420 | 
            -
                  expect(client. | 
| 2626 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: "6r2/HjBkqymGegX0wOfifieeUXbbHwtV/LohHS+jv6c=")).to be true
         | 
| 2421 2627 | 
             
                end
         | 
| 2422 2628 |  | 
| 2423 2629 | 
             
                it "rejects an incorrect HMAC" do
         | 
| 2424 | 
            -
                  expect(client. | 
| 2630 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: "something-else")).to be false
         | 
| 2631 | 
            +
                end
         | 
| 2632 | 
            +
             | 
| 2633 | 
            +
                it "verifies the correct HMAC when one of the multiple HMACs splitted by ',' match" do
         | 
| 2634 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: "6r2/HjBkqymGegX0wOfifieeUXbbHwtV/LohHS+jv6c=,something-else")).to be true
         | 
| 2635 | 
            +
                end
         | 
| 2636 | 
            +
             | 
| 2637 | 
            +
                it "rejects incorrect when multiple HMACs splitted by ',' don't match" do
         | 
| 2638 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: "something-else,something-else2")).to be false
         | 
| 2639 | 
            +
                end
         | 
| 2640 | 
            +
             | 
| 2641 | 
            +
                it "rejects if empty HMAC" do
         | 
| 2642 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: "")).to be false
         | 
| 2643 | 
            +
                end
         | 
| 2644 | 
            +
             | 
| 2645 | 
            +
                it "rejects if nil HMAC" do
         | 
| 2646 | 
            +
                  expect(client.hmac_valid?(body: body, hmac: nil)).to be false
         | 
| 2425 2647 | 
             
                end
         | 
| 2426 2648 | 
             
              end
         | 
| 2427 2649 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cronofy
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.37. | 
| 4 | 
            +
              version: 0.37.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sergii Paryzhskyi
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire:
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2022-03-10 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: hashie
         | 
| @@ -156,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 156 156 | 
             
                - !ruby/object:Gem::Version
         | 
| 157 157 | 
             
                  version: '0'
         | 
| 158 158 | 
             
            requirements: []
         | 
| 159 | 
            -
            rubygems_version: 3.2. | 
| 159 | 
            +
            rubygems_version: 3.2.32
         | 
| 160 160 | 
             
            signing_key:
         | 
| 161 161 | 
             
            specification_version: 4
         | 
| 162 162 | 
             
            summary: Cronofy - the scheduling platform for business
         |