jira-ruby 2.3.0 → 3.2.0

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.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/workflows/CI.yml +30 -0
  6. data/.github/workflows/codeql.yml +96 -0
  7. data/.github/workflows/rubocop.yml +18 -0
  8. data/.gitignore +3 -1
  9. data/.rubocop.yml +123 -0
  10. data/.yardopts +4 -0
  11. data/Gemfile +11 -3
  12. data/Guardfile +2 -0
  13. data/README.md +94 -19
  14. data/Rakefile +3 -4
  15. data/jira-ruby.gemspec +12 -17
  16. data/lib/jira/atlassian/jwt.rb +76 -0
  17. data/lib/jira/base.rb +37 -36
  18. data/lib/jira/base_factory.rb +4 -1
  19. data/lib/jira/client.rb +132 -51
  20. data/lib/jira/has_many_proxy.rb +32 -28
  21. data/lib/jira/http_client.rb +80 -13
  22. data/lib/jira/http_error.rb +4 -0
  23. data/lib/jira/jwt_client.rb +19 -43
  24. data/lib/jira/oauth_client.rb +68 -3
  25. data/lib/jira/railtie.rb +2 -0
  26. data/lib/jira/request_client.rb +31 -2
  27. data/lib/jira/resource/agile.rb +7 -9
  28. data/lib/jira/resource/applinks.rb +5 -3
  29. data/lib/jira/resource/attachment.rb +144 -4
  30. data/lib/jira/resource/board.rb +5 -3
  31. data/lib/jira/resource/board_configuration.rb +2 -0
  32. data/lib/jira/resource/comment.rb +14 -0
  33. data/lib/jira/resource/component.rb +2 -0
  34. data/lib/jira/resource/createmeta.rb +7 -5
  35. data/lib/jira/resource/field.rb +13 -12
  36. data/lib/jira/resource/filter.rb +2 -0
  37. data/lib/jira/resource/issue.rb +148 -54
  38. data/lib/jira/resource/issue_picker_suggestions.rb +4 -1
  39. data/lib/jira/resource/issue_picker_suggestions_issue.rb +2 -0
  40. data/lib/jira/resource/issuelink.rb +6 -3
  41. data/lib/jira/resource/issuelinktype.rb +2 -0
  42. data/lib/jira/resource/issuetype.rb +2 -0
  43. data/lib/jira/resource/priority.rb +2 -0
  44. data/lib/jira/resource/project.rb +4 -2
  45. data/lib/jira/resource/properties.rb +56 -0
  46. data/lib/jira/resource/rapidview.rb +5 -3
  47. data/lib/jira/resource/remotelink.rb +2 -0
  48. data/lib/jira/resource/resolution.rb +2 -0
  49. data/lib/jira/resource/serverinfo.rb +2 -0
  50. data/lib/jira/resource/sprint.rb +14 -23
  51. data/lib/jira/resource/status.rb +7 -1
  52. data/lib/jira/resource/status_category.rb +10 -0
  53. data/lib/jira/resource/suggested_issue.rb +2 -0
  54. data/lib/jira/resource/transition.rb +2 -0
  55. data/lib/jira/resource/user.rb +3 -1
  56. data/lib/jira/resource/version.rb +2 -0
  57. data/lib/jira/resource/watcher.rb +3 -2
  58. data/lib/jira/resource/webhook.rb +9 -3
  59. data/lib/jira/resource/worklog.rb +15 -2
  60. data/lib/jira/version.rb +3 -1
  61. data/lib/jira-ruby.rb +6 -3
  62. data/lib/tasks/generate.rake +3 -1
  63. data/spec/data/files/jwt-signed-urls.json +317 -0
  64. data/spec/data/files/short.txt +1 -0
  65. data/spec/integration/attachment_spec.rb +3 -3
  66. data/spec/integration/comment_spec.rb +8 -8
  67. data/spec/integration/component_spec.rb +7 -7
  68. data/spec/integration/field_spec.rb +3 -3
  69. data/spec/integration/issue_spec.rb +21 -18
  70. data/spec/integration/issuelinktype_spec.rb +3 -3
  71. data/spec/integration/issuetype_spec.rb +3 -3
  72. data/spec/integration/priority_spec.rb +3 -3
  73. data/spec/integration/project_spec.rb +8 -8
  74. data/spec/integration/properties_spec.rb +45 -0
  75. data/spec/integration/rapidview_spec.rb +10 -10
  76. data/spec/integration/resolution_spec.rb +3 -3
  77. data/spec/integration/status_category_spec.rb +20 -0
  78. data/spec/integration/status_spec.rb +4 -8
  79. data/spec/integration/transition_spec.rb +5 -4
  80. data/spec/integration/user_spec.rb +34 -11
  81. data/spec/integration/version_spec.rb +7 -7
  82. data/spec/integration/watcher_spec.rb +21 -18
  83. data/spec/integration/webhook_spec.rb +35 -0
  84. data/spec/integration/worklog_spec.rb +8 -8
  85. data/spec/jira/atlassian/jwt_spec.rb +60 -0
  86. data/spec/jira/base_factory_spec.rb +13 -3
  87. data/spec/jira/base_spec.rb +135 -98
  88. data/spec/jira/client_spec.rb +72 -56
  89. data/spec/jira/has_many_proxy_spec.rb +3 -3
  90. data/spec/jira/http_client_spec.rb +94 -27
  91. data/spec/jira/http_error_spec.rb +2 -2
  92. data/spec/jira/oauth_client_spec.rb +14 -8
  93. data/spec/jira/request_client_spec.rb +4 -4
  94. data/spec/jira/resource/agile_spec.rb +32 -32
  95. data/spec/jira/resource/attachment_spec.rb +170 -57
  96. data/spec/jira/resource/board_spec.rb +24 -23
  97. data/spec/jira/resource/createmeta_spec.rb +48 -48
  98. data/spec/jira/resource/field_spec.rb +44 -27
  99. data/spec/jira/resource/filter_spec.rb +7 -6
  100. data/spec/jira/resource/issue_picker_suggestions_spec.rb +17 -17
  101. data/spec/jira/resource/issue_spec.rb +159 -93
  102. data/spec/jira/resource/jira_picker_suggestions_issue_spec.rb +3 -3
  103. data/spec/jira/resource/project_factory_spec.rb +3 -2
  104. data/spec/jira/resource/project_spec.rb +16 -16
  105. data/spec/jira/resource/sprint_spec.rb +88 -9
  106. data/spec/jira/resource/status_spec.rb +21 -0
  107. data/spec/jira/resource/user_factory_spec.rb +5 -5
  108. data/spec/jira/resource/worklog_spec.rb +4 -4
  109. data/spec/mock_responses/board/1_issues.json +2 -1
  110. data/spec/mock_responses/issue/10002/properties/foo.json +4 -0
  111. data/spec/mock_responses/issue/10002/properties/xyz.json +4 -0
  112. data/spec/mock_responses/issue/10002/properties/xyz.put.json +4 -0
  113. data/spec/mock_responses/issue/10002/properties.json +12 -0
  114. data/spec/mock_responses/issue.json +1 -0
  115. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.full.json +2 -1
  116. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.json +2 -1
  117. data/spec/mock_responses/sprint/1.json +13 -0
  118. data/spec/mock_responses/status/1.json +8 -1
  119. data/spec/mock_responses/status.json +40 -5
  120. data/spec/mock_responses/statuscategory/1.json +7 -0
  121. data/spec/mock_responses/statuscategory.json +30 -0
  122. data/spec/mock_responses/{user_username=admin.json → user_accountId=1234567890abcdef01234567.json} +2 -1
  123. data/spec/spec_helper.rb +1 -0
  124. data/spec/support/clients_helper.rb +5 -7
  125. data/spec/support/mock_client.rb +9 -0
  126. data/spec/support/mock_response.rb +8 -0
  127. data/spec/support/shared_examples/integration.rb +51 -58
  128. metadata +45 -257
  129. data/.travis.yml +0 -9
  130. data/example.rb +0 -232
  131. data/http-basic-example.rb +0 -113
  132. data/lib/jira/resource/sprint_report.rb +0 -8
  133. data/lib/jira/tasks.rb +0 -0
  134. data/spec/integration/webhook.rb +0 -25
  135. data/spec/jira/jwt_uri_builder_spec.rb +0 -59
  136. data/spec/mock_responses/jira/rest/webhooks/1.0/webhook.json +0 -11
  137. data/spec/mock_responses/webhook/webhook.json +0 -11
  138. /data/spec/mock_responses/{jira/rest/webhooks/1.0/webhook → webhook}/2.json +0 -0
@@ -0,0 +1,317 @@
1
+ {
2
+ "secret": "7512836e-9137-48ac-baaf-a1935b96e17a",
3
+ "tests": [{
4
+ "name": "Simple",
5
+ "canonicalUrl": "GET\u0026/test\u0026param\u003dvalue",
6
+ "signedUrl": "https://example.com/test?param\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiZTE2OTEwODU4YTQxZmQxOWVhNWMxYjRlOWRlY2NhOWE3ODRkMTAyNGNiMDBiMjE1OGRlZmUyZjI5ZGM4NmRkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.ssbmLUBemh6nQW3MH5o2fSdnOFTIKf2w0KASnnH8aXo"
7
+ }, {
8
+ "name": "Simple (uri)",
9
+ "canonicalUrl": "GET\u0026/test\u0026param\u003dvalue",
10
+ "signedUrl": "https://example.com/test?param\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiZTE2OTEwODU4YTQxZmQxOWVhNWMxYjRlOWRlY2NhOWE3ODRkMTAyNGNiMDBiMjE1OGRlZmUyZjI5ZGM4NmRkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.ssbmLUBemh6nQW3MH5o2fSdnOFTIKf2w0KASnnH8aXo"
11
+ }, {
12
+ "name": "Spaces",
13
+ "canonicalUrl": "GET\u0026/test\u0026param\u003dsome%20spaces%20in%20this%20parameter",
14
+ "signedUrl": "https://example.com/test?param\u003dsome+spaces+in+this+parameter\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJlZjQwOTdkMDUzOTVlYWYxYTEzMzk1NmYxNDAxMTZhOWM0MTFhZmFkNzY4ZDRmMDZkYWFjOWUzMDU3NjQyNjVkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.JGTIXMHEtxAmLlTjIUFR21IEs9b8-3QIt3VwyRB816M"
15
+ }, {
16
+ "name": "Spaces (uri)",
17
+ "canonicalUrl": "GET\u0026/test\u0026param\u003dsome%20spaces%20in%20this%20parameter",
18
+ "signedUrl": "https://example.com/test?param\u003dsome+spaces+in+this+parameter\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJlZjQwOTdkMDUzOTVlYWYxYTEzMzk1NmYxNDAxMTZhOWM0MTFhZmFkNzY4ZDRmMDZkYWFjOWUzMDU3NjQyNjVkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.JGTIXMHEtxAmLlTjIUFR21IEs9b8-3QIt3VwyRB816M"
19
+ }, {
20
+ "name": "Asterisk",
21
+ "canonicalUrl": "GET\u0026/test\u0026query\u003dconnect%2A",
22
+ "signedUrl": "https://example.com/test?query\u003dconnect*\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZDI4YmMxMGQxOTcyZDljYWI1OWUxMjNjZTE3OTc2ZWIzMmFhZDY5NTdhMTNjZmI4Yjk3Y2VkNmQzZmM4YTI5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.Lj8eCYfC3mYcnkdGtvGPXT763nPI2XYyxlIJjSgIF5k"
23
+ }, {
24
+ "name": "Asterisk (uri)",
25
+ "canonicalUrl": "GET\u0026/test\u0026query\u003dconnect%2A",
26
+ "signedUrl": "https://example.com/test?query\u003dconnect*\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZDI4YmMxMGQxOTcyZDljYWI1OWUxMjNjZTE3OTc2ZWIzMmFhZDY5NTdhMTNjZmI4Yjk3Y2VkNmQzZmM4YTI5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.Lj8eCYfC3mYcnkdGtvGPXT763nPI2XYyxlIJjSgIF5k"
27
+ }, {
28
+ "name": "Unicode",
29
+ "canonicalUrl": "GET\u0026/test\u0026director\u003d%E5%AE%AE%E5%B4%8E%20%E9%A7%BF",
30
+ "signedUrl": "https://example.com/test?director\u003d%E5%AE%AE%E5%B4%8E+%E9%A7%BF\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0NGQ2MzU0ZmZlOGY5NjM5NzJhN2ZjNTllOThiMmMzZGZlNGI0OTMyOTVjNWI4OWVkZDk3NGEzMzllNjFhYzg5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.oc618kGGWy6ZP6ZqDsy2Hj61OS1kqFghcaQdvCBMLhc"
31
+ }, {
32
+ "name": "Unicode (uri)",
33
+ "canonicalUrl": "GET\u0026/test\u0026director\u003d%E5%AE%AE%E5%B4%8E%20%E9%A7%BF",
34
+ "signedUrl": "https://example.com/test?director\u003d%E5%AE%AE%E5%B4%8E+%E9%A7%BF\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0NGQ2MzU0ZmZlOGY5NjM5NzJhN2ZjNTllOThiMmMzZGZlNGI0OTMyOTVjNWI4OWVkZDk3NGEzMzllNjFhYzg5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.oc618kGGWy6ZP6ZqDsy2Hj61OS1kqFghcaQdvCBMLhc"
35
+ }, {
36
+ "name": "Comma-delimited",
37
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d10%2C2%2C20%2C1",
38
+ "signedUrl": "https://example.com/test?ids\u003d10%2C2%2C20%2C1\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyZTYxN2I2NWY5NjY2NTA3ODk5OTBlNWNhYzhmZjI5NWVlNWI0NTM4MzRkMDQ3OThmNDY2ZmY2MDM1YmQ4ODI5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.fdIooLlQ22kaE0FA15_cS_LvOtwBj2r5y586US4WJiw"
39
+ }, {
40
+ "name": "Comma-delimited (uri)",
41
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d10%2C2%2C20%2C1",
42
+ "signedUrl": "https://example.com/test?ids\u003d10%2C2%2C20%2C1\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyZTYxN2I2NWY5NjY2NTA3ODk5OTBlNWNhYzhmZjI5NWVlNWI0NTM4MzRkMDQ3OThmNDY2ZmY2MDM1YmQ4ODI5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.fdIooLlQ22kaE0FA15_cS_LvOtwBj2r5y586US4WJiw"
43
+ }, {
44
+ "name": "Multi-value Comma-delimited",
45
+ "canonicalUrl": "GET\u0026/test\u0026tuples\u003d1%2C2%2C3,6%2C5%2C4,7%2C9%2C8",
46
+ "signedUrl": "https://example.com/test?tuples\u003d1%2C2%2C3\u0026tuples\u003d6%2C5%2C4\u0026tuples\u003d7%2C9%2C8\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJmOWY2MmJiNjExOTFkZmYxYjIxOWU5YWRlOGFjMzhmY2ZhNDYyNzJlYTc2ZDk1NDU0MTBkYjY1NTlmZDhlN2JkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.PXOWzUEk0Be2zCEzO5W_yTvYWDOhuEQbm7t8XXctXrE"
47
+ }, {
48
+ "name": "Multi-value Comma-delimited (uri)",
49
+ "canonicalUrl": "GET\u0026/test\u0026tuples\u003d1%2C2%2C3,6%2C5%2C4,7%2C9%2C8",
50
+ "signedUrl": "https://example.com/test?tuples\u003d1%2C2%2C3\u0026tuples\u003d6%2C5%2C4\u0026tuples\u003d7%2C9%2C8\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJmOWY2MmJiNjExOTFkZmYxYjIxOWU5YWRlOGFjMzhmY2ZhNDYyNzJlYTc2ZDk1NDU0MTBkYjY1NTlmZDhlN2JkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.PXOWzUEk0Be2zCEzO5W_yTvYWDOhuEQbm7t8XXctXrE"
51
+ }, {
52
+ "name": "Plus",
53
+ "canonicalUrl": "GET\u0026/test\u0026title\u003d1%20%2B%201%20equals%203",
54
+ "signedUrl": "https://example.com/test?title\u003d1+%2B+1+equals+3\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJjZTBhODY2Y2UwYzM0Y2JkZTcwZGViNjNmNjkxNTE5MmY1ODUwMGQyYjQ5YjEyZTFmZmM4Y2RmOTFlZGFiYzkxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.NKD1M6kVQ3YFsQb-W2AUzYyntKSNvE15r4_hL9OO6A4"
55
+ }, {
56
+ "name": "Plus (uri)",
57
+ "canonicalUrl": "GET\u0026/test\u0026title\u003d1%20%2B%201%20equals%203",
58
+ "signedUrl": "https://example.com/test?title\u003d1+%2B+1+equals+3\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJjZTBhODY2Y2UwYzM0Y2JkZTcwZGViNjNmNjkxNTE5MmY1ODUwMGQyYjQ5YjEyZTFmZmM4Y2RmOTFlZGFiYzkxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.NKD1M6kVQ3YFsQb-W2AUzYyntKSNvE15r4_hL9OO6A4"
59
+ }, {
60
+ "name": "JSON Object",
61
+ "canonicalUrl": "GET\u0026/test\u0026json\u003d%7B%22key%22%3A%22value%22%7D",
62
+ "signedUrl": "https://example.com/test?json\u003d%7B%22key%22%3A%22value%22%7D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIxZDc0YzVhMWYwYTZjNzJhM2NlMjg1NTcwY2JmZDhmZTczNjkxMDEyM2U2YWRhMjAzZDRjN2JhOWE2MTI4YTZmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.AFKN_CHERMJa-VYAEVfRFw-Hi53VbJ_Y3clKB3RDAfE"
63
+ }, {
64
+ "name": "JSON Object (uri)",
65
+ "canonicalUrl": "GET\u0026/test\u0026json\u003d%7B%22key%22%3A%22value%22%7D",
66
+ "signedUrl": "https://example.com/test?json\u003d%7B%22key%22%3A%22value%22%7D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIxZDc0YzVhMWYwYTZjNzJhM2NlMjg1NTcwY2JmZDhmZTczNjkxMDEyM2U2YWRhMjAzZDRjN2JhOWE2MTI4YTZmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.AFKN_CHERMJa-VYAEVfRFw-Hi53VbJ_Y3clKB3RDAfE"
67
+ }, {
68
+ "name": "JSON Array",
69
+ "canonicalUrl": "GET\u0026/test\u0026json\u003d%5B%22val1%22%2C%22val2%22%5D",
70
+ "signedUrl": "https://example.com/test?json\u003d%5B%22val1%22%2C%22val2%22%5D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1YTY5ZDM1ZjE2NTM0MjkwYTRlZDJmOWU1M2E0NWU2ODcyY2YwYzNhMTE2MzI5NWM0Mjk0N2Q0MjkzMWExZjczIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xO5VqtU8GL8CTr_wn0tHJAJ-r63PU-bJBTeuKF759dA"
71
+ }, {
72
+ "name": "JSON Array (uri)",
73
+ "canonicalUrl": "GET\u0026/test\u0026json\u003d%5B%22val1%22%2C%22val2%22%5D",
74
+ "signedUrl": "https://example.com/test?json\u003d%5B%22val1%22%2C%22val2%22%5D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1YTY5ZDM1ZjE2NTM0MjkwYTRlZDJmOWU1M2E0NWU2ODcyY2YwYzNhMTE2MzI5NWM0Mjk0N2Q0MjkzMWExZjczIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xO5VqtU8GL8CTr_wn0tHJAJ-r63PU-bJBTeuKF759dA"
75
+ }, {
76
+ "name": "Single Quotes",
77
+ "canonicalUrl": "GET\u0026/test\u0026quote\u003d%27quoted%27",
78
+ "signedUrl": "https://example.com/test?quote\u003d%27quoted%27\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyMDdhMzAzNzZjNTk0ZDVjZGU3YjZlODczYjk0M2Y4NDc5ODM3MWQzMjkzYjdlYWMyN2UyYzJhMmE1ZDExMWQ1IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.XsfJjmLIyIuX7_xfuj1JlNBiNQ_oSoh8KQVfEJHNJ0A"
79
+ }, {
80
+ "name": "Single Quotes (uri)",
81
+ "canonicalUrl": "GET\u0026/test\u0026quote\u003d%27quoted%27",
82
+ "signedUrl": "https://example.com/test?quote\u003d%27quoted%27\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyMDdhMzAzNzZjNTk0ZDVjZGU3YjZlODczYjk0M2Y4NDc5ODM3MWQzMjkzYjdlYWMyN2UyYzJhMmE1ZDExMWQ1IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.XsfJjmLIyIuX7_xfuj1JlNBiNQ_oSoh8KQVfEJHNJ0A"
83
+ }, {
84
+ "name": "Brackets",
85
+ "canonicalUrl": "GET\u0026/test\u0026param\u003d%28%29",
86
+ "signedUrl": "https://example.com/test?param\u003d%28%29\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0NmI5Nzg3YTg5ODM1NjBmNDQ2ZjgyZDYxNDMxMjJkOTllMTUzYWZmZDU2ODhmYTQ1MzQzMDc0YTA5MTU3M2ViIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.E7tLaNwK3c9HmDEoptDGWh2p6DZ2pd1R4sNBAPJ0L_A"
87
+ }, {
88
+ "name": "Brackets (uri)",
89
+ "canonicalUrl": "GET\u0026/test\u0026param\u003d%28%29",
90
+ "signedUrl": "https://example.com/test?param\u003d%28%29\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0NmI5Nzg3YTg5ODM1NjBmNDQ2ZjgyZDYxNDMxMjJkOTllMTUzYWZmZDU2ODhmYTQ1MzQzMDc0YTA5MTU3M2ViIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.E7tLaNwK3c9HmDEoptDGWh2p6DZ2pd1R4sNBAPJ0L_A"
91
+ }, {
92
+ "name": "Tilde",
93
+ "canonicalUrl": "GET\u0026/test\u0026eta\u003din%20~3%20days",
94
+ "signedUrl": "https://example.com/test?eta\u003din+%7E3+days\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1YzVmOTdjZGZlM2FiZDhmZWI0OGY2ZjAyNDBhNzFlZjVjMTExMjg5YTViZjc3ZGRmNjQ1MjUwYjM5NTFlYzYzIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.kc_ugGzgCHSyCk4DgUFNVb5dhC2TdTlFVKyQx1oBcDQ"
95
+ }, {
96
+ "name": "Tilde (uri)",
97
+ "canonicalUrl": "GET\u0026/test\u0026eta\u003din%20~3%20days",
98
+ "signedUrl": "https://example.com/test?eta\u003din+%7E3+days\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1YzVmOTdjZGZlM2FiZDhmZWI0OGY2ZjAyNDBhNzFlZjVjMTExMjg5YTViZjc3ZGRmNjQ1MjUwYjM5NTFlYzYzIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.kc_ugGzgCHSyCk4DgUFNVb5dhC2TdTlFVKyQx1oBcDQ"
99
+ }, {
100
+ "name": "RFC-1738 Unsafe",
101
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%20%3C%3E%22%23%25%7B%7D%7C%5C%5E~%5B%5D%60",
102
+ "signedUrl": "https://example.com/test?rfc\u003d+%3C%3E%22%23%25%7B%7D%7C%5C%5E%7E%5B%5D%60\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIzNmJhMzljNTM3OWQ3NTJiYmVmMTM0OWJhNThkZjk4ZWNhYTQ1NmI3OGM3YzJlMzI0NWUyZjMzZWFjNzEyYTQ5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.AHIN8GC3aWL6o8ZOxZZBW_fxTI-6CY78ucWh_kaXBAs"
103
+ }, {
104
+ "name": "RFC-1738 Unsafe (uri)",
105
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%20%3C%3E%22%23%25%7B%7D%7C%5C%5E~%5B%5D%60",
106
+ "signedUrl": "https://example.com/test?rfc\u003d+%3C%3E%22%23%25%7B%7D%7C%5C%5E%7E%5B%5D%60\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIzNmJhMzljNTM3OWQ3NTJiYmVmMTM0OWJhNThkZjk4ZWNhYTQ1NmI3OGM3YzJlMzI0NWUyZjMzZWFjNzEyYTQ5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.AHIN8GC3aWL6o8ZOxZZBW_fxTI-6CY78ucWh_kaXBAs"
107
+ }, {
108
+ "name": "RFC-1738 Reserved",
109
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%3B%2F%3F%3A%40%3D%26",
110
+ "signedUrl": "https://example.com/test?rfc\u003d%3B%2F%3F%3A%40%3D%26\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI2MzkzMzBiYzkyZDc5MzczYjE5OGRhNjk3ODczYjJmMDNmMWEzYTBjNWFmNzhjZjhlZWE1MTdmMTQ5NjBiMTUwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.a7vQvXIFT-sSJiHFcQKf3o8pTFA__O0X4EJOD_91iK0"
111
+ }, {
112
+ "name": "RFC-1738 Reserved (uri)",
113
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%3B%2F%3F%3A%40%3D%26",
114
+ "signedUrl": "https://example.com/test?rfc\u003d%3B%2F%3F%3A%40%3D%26\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI2MzkzMzBiYzkyZDc5MzczYjE5OGRhNjk3ODczYjJmMDNmMWEzYTBjNWFmNzhjZjhlZWE1MTdmMTQ5NjBiMTUwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.a7vQvXIFT-sSJiHFcQKf3o8pTFA__O0X4EJOD_91iK0"
115
+ }, {
116
+ "name": "RFC-1738 Special",
117
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%24-_.%2B%21%2A%27%28%29%2C",
118
+ "signedUrl": "https://example.com/test?rfc\u003d%24-_.%2B%21*%27%28%29%2C\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZTM2MjI5Y2M0NTlmZjhjY2I0ODQ1YzExNDMzY2ZiYmUyNWJmYTQ1ZThjMWVhMTRkMmExMjQyMzFjYjBhMmU5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.vUERQg8SGBRFZpB8d0DFOcaFdDfJjsHZBUDujLJ7LhQ"
119
+ }, {
120
+ "name": "RFC-1738 Special (uri)",
121
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%24-_.%2B%21%2A%27%28%29%2C",
122
+ "signedUrl": "https://example.com/test?rfc\u003d%24-_.%2B%21*%27%28%29%2C\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZTM2MjI5Y2M0NTlmZjhjY2I0ODQ1YzExNDMzY2ZiYmUyNWJmYTQ1ZThjMWVhMTRkMmExMjQyMzFjYjBhMmU5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.vUERQg8SGBRFZpB8d0DFOcaFdDfJjsHZBUDujLJ7LhQ"
123
+ }, {
124
+ "name": "RFC-3986 Unreserved",
125
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d-._~",
126
+ "signedUrl": "https://example.com/test?rfc\u003d-._%7E\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZGRmN2U2MzFjM2IxMWU3OTc1ODE0ZWU4NGZlYzI2ODA0ZGM3MmIwYTBlOTk3ODcxZDg0MTVjZWU2Yjc4YjMxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.tqAbSA8_iIe-nfjtqBrHpxUe3HI7D9ILxpXIf0EqUfA"
127
+ }, {
128
+ "name": "RFC-3986 Unreserved (uri)",
129
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d-._~",
130
+ "signedUrl": "https://example.com/test?rfc\u003d-._%7E\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwZGRmN2U2MzFjM2IxMWU3OTc1ODE0ZWU4NGZlYzI2ODA0ZGM3MmIwYTBlOTk3ODcxZDg0MTVjZWU2Yjc4YjMxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.tqAbSA8_iIe-nfjtqBrHpxUe3HI7D9ILxpXIf0EqUfA"
131
+ }, {
132
+ "name": "RFC-3986 gen-delims",
133
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%3A%2F%3F%23%5B%5D%40",
134
+ "signedUrl": "https://example.com/test?rfc\u003d%3A%2F%3F%23%5B%5D%40\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI5NjA0MWVlNDVhZDRiOGVhMjliY2U0MmYzZTI4MzU0OTA1OTFmNTVlODRiZGRiYmFiODIxNTFkNGExYWMxYTExIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.ChCEYkRpoqkZsyZ2ZtGAAntcb0KYHjmqI6to9p1KKJQ"
135
+ }, {
136
+ "name": "RFC-3986 gen-delims (uri)",
137
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%3A%2F%3F%23%5B%5D%40",
138
+ "signedUrl": "https://example.com/test?rfc\u003d%3A%2F%3F%23%5B%5D%40\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI5NjA0MWVlNDVhZDRiOGVhMjliY2U0MmYzZTI4MzU0OTA1OTFmNTVlODRiZGRiYmFiODIxNTFkNGExYWMxYTExIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.ChCEYkRpoqkZsyZ2ZtGAAntcb0KYHjmqI6to9p1KKJQ"
139
+ }, {
140
+ "name": "RFC-3986 sub-delims",
141
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%21%24%26%27%28%29%2A%2B%2C%3B%3D",
142
+ "signedUrl": "https://example.com/test?rfc\u003d%21%24%26%27%28%29*%2B%2C%3B%3D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiOGQwNDk4NzRmMWZlNWFiZTI3NGQyMGJkZWNlYmVlOGRhYWRhNDUzMTkxYTgyNzczOGVlYmNkNzU5ZWZkNGUxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.rvu_onWEK0PWM-w6K7JEShKHVplx9oCTdeKyhpJmSx4"
143
+ }, {
144
+ "name": "RFC-3986 sub-delims (uri)",
145
+ "canonicalUrl": "GET\u0026/test\u0026rfc\u003d%21%24%26%27%28%29%2A%2B%2C%3B%3D",
146
+ "signedUrl": "https://example.com/test?rfc\u003d%21%24%26%27%28%29*%2B%2C%3B%3D\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiOGQwNDk4NzRmMWZlNWFiZTI3NGQyMGJkZWNlYmVlOGRhYWRhNDUzMTkxYTgyNzczOGVlYmNkNzU5ZWZkNGUxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.rvu_onWEK0PWM-w6K7JEShKHVplx9oCTdeKyhpJmSx4"
147
+ }, {
148
+ "name": "Empty",
149
+ "canonicalUrl": "GET\u0026/test\u0026notmuch\u003d",
150
+ "signedUrl": "https://example.com/test?notmuch\u003d\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyMGZlY2RlZDk5NTE1MTZhMzQ0N2IxYjU1NmQwZWIzNTBkZTI5NzcwNTA1MjUzYTMwZGM3Mzk1MDJlMDVkZGM3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.P8btoE2iwXDoTpWr9eL64OcumNeFtRVVuNAg_vb5EwE"
151
+ }, {
152
+ "name": "Empty (uri)",
153
+ "canonicalUrl": "GET\u0026/test\u0026notmuch\u003d",
154
+ "signedUrl": "https://example.com/test?notmuch\u003d\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIyMGZlY2RlZDk5NTE1MTZhMzQ0N2IxYjU1NmQwZWIzNTBkZTI5NzcwNTA1MjUzYTMwZGM3Mzk1MDJlMDVkZGM3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.P8btoE2iwXDoTpWr9eL64OcumNeFtRVVuNAg_vb5EwE"
155
+ }, {
156
+ "name": "Encoded",
157
+ "canonicalUrl": "GET\u0026/test\u0026referrer\u003dhttp%3A%2F%2Ffrom.net%2Fp%3Fx%3DA%2B%252B%2BB%26y%3D%2524-_.%252B%2521%2A%2527%2528%2529%252C",
158
+ "signedUrl": "https://example.com/test?referrer\u003dhttp%3A%2F%2Ffrom.net%2Fp%3Fx%3DA%2B%252B%2BB%26y%3D%2524-_.%252B%2521*%2527%2528%2529%252C\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3Y2E4MWI4ZTRlODNjMjM3NWVlYTdiOGI1MGJkMzc4NmJhOGI0MzI2MTE5M2EzYmQzY2NkZmNhMDYxMjBlZTMzIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.OTKND114j4id2cHr_AdHLAK9GqhbxFE7ad0eT0DmEV8"
159
+ }, {
160
+ "name": "Encoded (uri)",
161
+ "canonicalUrl": "GET\u0026/test\u0026referrer\u003dhttp%3A%2F%2Ffrom.net%2Fp%3Fx%3DA%2B%252B%2BB%26y%3D%2524-_.%252B%2521%2A%2527%2528%2529%252C",
162
+ "signedUrl": "https://example.com/test?referrer\u003dhttp%3A%2F%2Ffrom.net%2Fp%3Fx%3DA%2B%252B%2BB%26y%3D%2524-_.%252B%2521*%2527%2528%2529%252C\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3Y2E4MWI4ZTRlODNjMjM3NWVlYTdiOGI1MGJkMzc4NmJhOGI0MzI2MTE5M2EzYmQzY2NkZmNhMDYxMjBlZTMzIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.OTKND114j4id2cHr_AdHLAK9GqhbxFE7ad0eT0DmEV8"
163
+ }, {
164
+ "name": "Multi-value",
165
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d-1,1,10,2,20",
166
+ "signedUrl": "https://example.com/test?ids\u003d-1\u0026ids\u003d1\u0026ids\u003d10\u0026ids\u003d2\u0026ids\u003d20\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhNjQ2YzQ4NzQxZmFhZWI2NDlmOWNhNzg4OGFlMDI5ZWFkNDMyZTM4MDZmNTZjNGE1N2I4MGIzZTJhYzYyOGE5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.gUepTNdB4HtYcabEZSiuXZrf2vU18ZGft5cvAT2W6FI"
167
+ }, {
168
+ "name": "Multi-value (uri)",
169
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d-1,1,10,2,20",
170
+ "signedUrl": "https://example.com/test?ids\u003d-1\u0026ids\u003d1\u0026ids\u003d10\u0026ids\u003d2\u0026ids\u003d20\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhNjQ2YzQ4NzQxZmFhZWI2NDlmOWNhNzg4OGFlMDI5ZWFkNDMyZTM4MDZmNTZjNGE1N2I4MGIzZTJhYzYyOGE5IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.gUepTNdB4HtYcabEZSiuXZrf2vU18ZGft5cvAT2W6FI"
171
+ }, {
172
+ "name": "Multi-value II",
173
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d.1,.2,%3A1,%3A2",
174
+ "signedUrl": "https://example.com/test?ids\u003d.1\u0026ids\u003d.2\u0026ids\u003d%3A1\u0026ids\u003d%3A2\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJmMDUyNGQ0MmUwZjg2NjE4NjJlMWYxZTlhZGQ4NzU3OTcyYTAwNDNiYjcxMzZkNjQxNzM1ZDIxODc0YzVhMDU2IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.bbmy58zcb675U8eE1NaDvtd85EcVsGjZfIcSLbgOwas"
175
+ }, {
176
+ "name": "Multi-value II (uri)",
177
+ "canonicalUrl": "GET\u0026/test\u0026ids\u003d.1,.2,%3A1,%3A2",
178
+ "signedUrl": "https://example.com/test?ids\u003d.1\u0026ids\u003d.2\u0026ids\u003d%3A1\u0026ids\u003d%3A2\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJmMDUyNGQ0MmUwZjg2NjE4NjJlMWYxZTlhZGQ4NzU3OTcyYTAwNDNiYjcxMzZkNjQxNzM1ZDIxODc0YzVhMDU2IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.bbmy58zcb675U8eE1NaDvtd85EcVsGjZfIcSLbgOwas"
179
+ }, {
180
+ "name": "Multi-value Unicode",
181
+ "canonicalUrl": "GET\u0026/test\u0026chars\u003d%E5%AE%AE,%E5%B4%8E,%E9%A7%BF",
182
+ "signedUrl": "https://example.com/test?chars\u003d%E5%AE%AE\u0026chars\u003d%E5%B4%8E\u0026chars\u003d%E9%A7%BF\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3MmE3ZjdjZTlmOTMxNTdmMjk2Yjg2MzM4MzE1NDIzZDZmM2I2YWJhNTA4MWYwNGJiZGI2YmIxODIxOGI2NWVlIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.K8dOEK17rBCjHS_sNj58CO4_rB4IM-JeRoUYVv2osbc"
183
+ }, {
184
+ "name": "Multi-value Unicode (uri)",
185
+ "canonicalUrl": "GET\u0026/test\u0026chars\u003d%E5%AE%AE,%E5%B4%8E,%E9%A7%BF",
186
+ "signedUrl": "https://example.com/test?chars\u003d%E5%AE%AE\u0026chars\u003d%E5%B4%8E\u0026chars\u003d%E9%A7%BF\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3MmE3ZjdjZTlmOTMxNTdmMjk2Yjg2MzM4MzE1NDIzZDZmM2I2YWJhNTA4MWYwNGJiZGI2YmIxODIxOGI2NWVlIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.K8dOEK17rBCjHS_sNj58CO4_rB4IM-JeRoUYVv2osbc"
187
+ }, {
188
+ "name": "Multi-value Empty",
189
+ "canonicalUrl": "GET\u0026/test\u0026c\u003d,%20,%2520,%2B",
190
+ "signedUrl": "https://example.com/test?c\u003d\u0026c\u003d+\u0026c\u003d%2520\u0026c\u003d%2B\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJjYmJjYWM5YTZhMDJmM2FkOTZjNWFiNWJmODc2ZGQ5Zjc5YjJjNjFjZWVjNTY2MGExYzlkNzNhM2IxMDJlYzJjIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.R_DWbzp9IZbL9lutC4eRBf-NcN4sllakpx5H59F329A"
191
+ }, {
192
+ "name": "Multi-value Empty (uri)",
193
+ "canonicalUrl": "GET\u0026/test\u0026c\u003d,%20,%2520,%2B",
194
+ "signedUrl": "https://example.com/test?c\u003d\u0026c\u003d+\u0026c\u003d%2520\u0026c\u003d%2B\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJjYmJjYWM5YTZhMDJmM2FkOTZjNWFiNWJmODc2ZGQ5Zjc5YjJjNjFjZWVjNTY2MGExYzlkNzNhM2IxMDJlYzJjIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.R_DWbzp9IZbL9lutC4eRBf-NcN4sllakpx5H59F329A"
195
+ }, {
196
+ "name": "Key RFC-1738 Unsafe",
197
+ "canonicalUrl": "GET\u0026/test\u0026%231\u003dvalue",
198
+ "signedUrl": "https://example.com/test?%231\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJlY2NiNGEyMzJkNTBjYTQxYWM0MDM5ODY3NWI2NDg3YTcxMWQ5ZTk3MjkxN2Q4YTYxY2JjMTIwZjlmYmRhNTk3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.OLjm-tHtgDfOwTtBQ50-JGJM4zIP-yZcsDRAuJn0P7s"
199
+ }, {
200
+ "name": "Key RFC-1738 Unsafe (uri)",
201
+ "canonicalUrl": "GET\u0026/test\u0026%231\u003dvalue",
202
+ "signedUrl": "https://example.com/test?%231\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJlY2NiNGEyMzJkNTBjYTQxYWM0MDM5ODY3NWI2NDg3YTcxMWQ5ZTk3MjkxN2Q4YTYxY2JjMTIwZjlmYmRhNTk3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.OLjm-tHtgDfOwTtBQ50-JGJM4zIP-yZcsDRAuJn0P7s"
203
+ }, {
204
+ "name": "Key RFC-1738 Reserved",
205
+ "canonicalUrl": "GET\u0026/test\u0026%3A1\u003dvalue",
206
+ "signedUrl": "https://example.com/test?%3A1\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI2ZDgyMzE4MWE2OGE0OTUyYzc1ZTRiNTFhZDBiOGQ1OWU4Nzk4NTljZGY5NzdlNzI1NDU0NTIwMWJjYTg0NjVkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.lqRCsE131cmicAXf2BoCtLiV4g7D50piFnSzJoE0rCk"
207
+ }, {
208
+ "name": "Key RFC-1738 Reserved (uri)",
209
+ "canonicalUrl": "GET\u0026/test\u0026%3A1\u003dvalue",
210
+ "signedUrl": "https://example.com/test?%3A1\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI2ZDgyMzE4MWE2OGE0OTUyYzc1ZTRiNTFhZDBiOGQ1OWU4Nzk4NTljZGY5NzdlNzI1NDU0NTIwMWJjYTg0NjVkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.lqRCsE131cmicAXf2BoCtLiV4g7D50piFnSzJoE0rCk"
211
+ }, {
212
+ "name": "Key RFC-1738 Special",
213
+ "canonicalUrl": "GET\u0026/test\u0026%241\u003dvalue",
214
+ "signedUrl": "https://example.com/test?%241\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhOWY2MWYxYzgyNTBlYmZiOTIzNDY1NGU3MWRlYzIzM2M5M2MxNmE1NGZlMzBhNjQ5ZGZkNjViYWRmM2MwMTcxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xSvBJ10iVN7_Y97j1qApcYXUVq8JoXkCLnYf0Fwj0mY"
215
+ }, {
216
+ "name": "Key RFC-1738 Special (uri)",
217
+ "canonicalUrl": "GET\u0026/test\u0026%241\u003dvalue",
218
+ "signedUrl": "https://example.com/test?%241\u003dvalue\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhOWY2MWYxYzgyNTBlYmZiOTIzNDY1NGU3MWRlYzIzM2M5M2MxNmE1NGZlMzBhNjQ5ZGZkNjViYWRmM2MwMTcxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xSvBJ10iVN7_Y97j1qApcYXUVq8JoXkCLnYf0Fwj0mY"
219
+ }, {
220
+ "name": "Multiple Parameters Simple",
221
+ "canonicalUrl": "GET\u0026/test\u0026a\u003dx\u0026b\u003dy",
222
+ "signedUrl": "https://example.com/test?a\u003dx\u0026b\u003dy\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhYmQ1ZGU2MDRiOWQzY2RhNDRkM2M3YTlkZDY5OGEyMTI1OTY1NTM5NDY1OGE2NjQyZjg3YjlkODI1ODY5NDYwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.1jFYZh4FjFNsGo62Qj9E7xzGCVVunqj5vtXoz7a8bCo"
223
+ }, {
224
+ "name": "Multiple Parameters Simple (uri)",
225
+ "canonicalUrl": "GET\u0026/test\u0026a\u003dx\u0026b\u003dy",
226
+ "signedUrl": "https://example.com/test?a\u003dx\u0026b\u003dy\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJhYmQ1ZGU2MDRiOWQzY2RhNDRkM2M3YTlkZDY5OGEyMTI1OTY1NTM5NDY1OGE2NjQyZjg3YjlkODI1ODY5NDYwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.1jFYZh4FjFNsGo62Qj9E7xzGCVVunqj5vtXoz7a8bCo"
227
+ }, {
228
+ "name": "Multiple Multi-value Parameters",
229
+ "canonicalUrl": "GET\u0026/test\u0026a\u003dx1,x10\u0026b\u003dy1,y10",
230
+ "signedUrl": "https://example.com/test?a\u003dx1\u0026a\u003dx10\u0026b\u003dy1\u0026b\u003dy10\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIzMTBiYTNmZjdlMWU5YThjYWNkMzNkZDYxNzI1MDEzMDRiZjMyNTA5NmQ4MWNjYWQ0NDk0NjU0MjdlNThhOWM0IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.7OJXrJdQpPUni7Qm0IrFz9KHxTgCMeE1WbVC1unQJ3g"
231
+ }, {
232
+ "name": "Multiple Multi-value Parameters (uri)",
233
+ "canonicalUrl": "GET\u0026/test\u0026a\u003dx1,x10\u0026b\u003dy1,y10",
234
+ "signedUrl": "https://example.com/test?a\u003dx1\u0026a\u003dx10\u0026b\u003dy1\u0026b\u003dy10\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIzMTBiYTNmZjdlMWU5YThjYWNkMzNkZDYxNzI1MDEzMDRiZjMyNTA5NmQ4MWNjYWQ0NDk0NjU0MjdlNThhOWM0IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.7OJXrJdQpPUni7Qm0IrFz9KHxTgCMeE1WbVC1unQJ3g"
235
+ }, {
236
+ "name": "Multiple Parameters Spaces",
237
+ "canonicalUrl": "GET\u0026/test\u0026a\u003danother%20one,one%20string\u0026b\u003dand%20yet%20more,more%20here",
238
+ "signedUrl": "https://example.com/test?a\u003danother+one\u0026a\u003done+string\u0026b\u003dand+yet+more\u0026b\u003dmore+here\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3MDA3MjFlNjUzODU3ODFmYzFmYTI0ODIyMGM3NTQwMGYxZThhMTk3YzgzOGVmMTc3OWYwMGI2OWJmYTRhNmZmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.g5YMPR92qU3hw2uPmdWVztIIl25QKF5QlqsvCNZ7TDE"
239
+ }, {
240
+ "name": "Multiple Parameters Spaces (uri)",
241
+ "canonicalUrl": "GET\u0026/test\u0026a\u003danother%20one,one%20string\u0026b\u003dand%20yet%20more,more%20here",
242
+ "signedUrl": "https://example.com/test?a\u003danother+one\u0026a\u003done+string\u0026b\u003dand+yet+more\u0026b\u003dmore+here\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI3MDA3MjFlNjUzODU3ODFmYzFmYTI0ODIyMGM3NTQwMGYxZThhMTk3YzgzOGVmMTc3OWYwMGI2OWJmYTRhNmZmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.g5YMPR92qU3hw2uPmdWVztIIl25QKF5QlqsvCNZ7TDE"
243
+ }, {
244
+ "name": "Multiple Parameters Comma-delimited",
245
+ "canonicalUrl": "GET\u0026/test\u0026a\u003d1%2C2%2C3,4%2C5%2C6\u0026b\u003da%2Cb%2Cc,d%2Ce%2Cf",
246
+ "signedUrl": "https://example.com/test?a\u003d1%2C2%2C3\u0026a\u003d4%2C5%2C6\u0026b\u003da%2Cb%2Cc\u0026b\u003dd%2Ce%2Cf\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwNmI3NmViNjNhY2NjY2UyMzU2Y2RmYzY2ZjRhYmQxZTNhMDYxYzAzMDVjOWZjNzZiNjE2YWU3MWZlM2I2YWI1IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.6skGpsaWS3sR1ft8hdnJL5EvgFDlyUYmmjcziQrIK1s"
247
+ }, {
248
+ "name": "Multiple Parameters Comma-delimited (uri)",
249
+ "canonicalUrl": "GET\u0026/test\u0026a\u003d1%2C2%2C3,4%2C5%2C6\u0026b\u003da%2Cb%2Cc,d%2Ce%2Cf",
250
+ "signedUrl": "https://example.com/test?a\u003d1%2C2%2C3\u0026a\u003d4%2C5%2C6\u0026b\u003da%2Cb%2Cc\u0026b\u003dd%2Ce%2Cf\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwNmI3NmViNjNhY2NjY2UyMzU2Y2RmYzY2ZjRhYmQxZTNhMDYxYzAzMDVjOWZjNzZiNjE2YWU3MWZlM2I2YWI1IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.6skGpsaWS3sR1ft8hdnJL5EvgFDlyUYmmjcziQrIK1s"
251
+ }, {
252
+ "name": "Parameter Order",
253
+ "canonicalUrl": "GET\u0026/test\u0026a1\u003d2\u0026a10\u003d1\u0026b1\u003d3\u0026b10\u003d4",
254
+ "signedUrl": "https://example.com/test?a10\u003d1\u0026a1\u003d2\u0026b1\u003d3\u0026b10\u003d4\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIxNTljYzNkMzAwM2YwNjdjM2FlMjYzZDE5ZGVkNDJkZWRkMjgyMjFjY2U0ZDQ3NTdiMTNmYzc3MjJhMjQ0MDhmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.CEfY2ck1VpaOVlfNi9iXiF03lowoqm_WgHvtgf5Xfps"
255
+ }, {
256
+ "name": "Parameter Order (uri)",
257
+ "canonicalUrl": "GET\u0026/test\u0026a1\u003d2\u0026a10\u003d1\u0026b1\u003d3\u0026b10\u003d4",
258
+ "signedUrl": "https://example.com/test?a10\u003d1\u0026a1\u003d2\u0026b1\u003d3\u0026b10\u003d4\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIxNTljYzNkMzAwM2YwNjdjM2FlMjYzZDE5ZGVkNDJkZWRkMjgyMjFjY2U0ZDQ3NTdiMTNmYzc3MjJhMjQ0MDhmIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.CEfY2ck1VpaOVlfNi9iXiF03lowoqm_WgHvtgf5Xfps"
259
+ }, {
260
+ "name": "Upper- and Lower-case Parameters",
261
+ "canonicalUrl": "GET\u0026/test\u0026A\u003dA\u0026B\u003dB\u0026a\u003da\u0026b\u003db",
262
+ "signedUrl": "https://example.com/test?A\u003dA\u0026a\u003da\u0026b\u003db\u0026B\u003dB\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1MzlhZGMyYjBhZWYyZWM4NjU5ODI1ODkzYjhiOTJlNmE1M2M5NDgzZTIxNTBiODE4NWIwODQ5MGQ4YjZkZTYwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.wOC7mInLeAu_mQpoHlGW2DIlEeEfiqFvn32sea8vDvc"
263
+ }, {
264
+ "name": "Upper- and Lower-case Parameters (uri)",
265
+ "canonicalUrl": "GET\u0026/test\u0026A\u003dA\u0026B\u003dB\u0026a\u003da\u0026b\u003db",
266
+ "signedUrl": "https://example.com/test?A\u003dA\u0026a\u003da\u0026b\u003db\u0026B\u003dB\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1MzlhZGMyYjBhZWYyZWM4NjU5ODI1ODkzYjhiOTJlNmE1M2M5NDgzZTIxNTBiODE4NWIwODQ5MGQ4YjZkZTYwIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.wOC7mInLeAu_mQpoHlGW2DIlEeEfiqFvn32sea8vDvc"
267
+ }, {
268
+ "name": "Search Request View",
269
+ "canonicalUrl": "GET\u0026/search-view\u0026cp\u003djira\u0026endIssue\u003d2\u0026issues\u003dissues%3DTEST-2%2CTEST-1\u0026lic\u003dnone\u0026link\u003dhttp%3A%2F%2Fion%3A2990%2Fjira%2Fsecure%2FIssueNavigator.jspa%3Freset%3Dtrue%26jqlQuery%3Dissuetype%2B%253D%2BBug\u0026loc\u003den-US\u0026startIssue\u003d0\u0026totalIssues\u003d2\u0026tz\u003dAustralia%2FSydney\u0026user_id\u003dadmin\u0026user_key\u003dadmin\u0026xdm_c\u003dchannel-acmodule-1564427223927602208\u0026xdm_e\u003dhttp%3A%2F%2Fion.local%3A2990",
270
+ "signedUrl": "https://example.com/search-view?link\u003dhttp%3A%2F%2Fion%3A2990%2Fjira%2Fsecure%2FIssueNavigator.jspa%3Freset%3Dtrue%26jqlQuery%3Dissuetype%2B%253D%2BBug\u0026startIssue\u003d0\u0026totalIssues\u003d2\u0026endIssue\u003d2\u0026issues\u003dissues%3DTEST-2%2CTEST-1\u0026tz\u003dAustralia%2FSydney\u0026loc\u003den-US\u0026user_id\u003dadmin\u0026user_key\u003dadmin\u0026xdm_e\u003dhttp%3A%2F%2Fion.local%3A2990\u0026xdm_c\u003dchannel-acmodule-1564427223927602208\u0026cp\u003djira\u0026lic\u003dnone\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwY2I3NGI4MGRkN2Y3NzkzODQ5ODY3Mjk4Y2EyZDg4OWU0ZDhiNjYxMTFiNjg5NjIyN2JkYmI0OTBkYzQ0YWUxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.UXWVrjqrCcjX6Mt6gIap4nK7o3aTLRz0ab1fMwwSJqo"
271
+ }, {
272
+ "name": "Search Request View (uri)",
273
+ "canonicalUrl": "GET\u0026/search-view\u0026cp\u003djira\u0026endIssue\u003d2\u0026issues\u003dissues%3DTEST-2%2CTEST-1\u0026lic\u003dnone\u0026link\u003dhttp%3A%2F%2Fion%3A2990%2Fjira%2Fsecure%2FIssueNavigator.jspa%3Freset%3Dtrue%26jqlQuery%3Dissuetype%2B%253D%2BBug\u0026loc\u003den-US\u0026startIssue\u003d0\u0026totalIssues\u003d2\u0026tz\u003dAustralia%2FSydney\u0026user_id\u003dadmin\u0026user_key\u003dadmin\u0026xdm_c\u003dchannel-acmodule-1564427223927602208\u0026xdm_e\u003dhttp%3A%2F%2Fion.local%3A2990",
274
+ "signedUrl": "https://example.com/search-view?link\u003dhttp%3A%2F%2Fion%3A2990%2Fjira%2Fsecure%2FIssueNavigator.jspa%3Freset%3Dtrue%26jqlQuery%3Dissuetype%2B%253D%2BBug\u0026startIssue\u003d0\u0026totalIssues\u003d2\u0026endIssue\u003d2\u0026issues\u003dissues%3DTEST-2%2CTEST-1\u0026tz\u003dAustralia%2FSydney\u0026loc\u003den-US\u0026user_id\u003dadmin\u0026user_key\u003dadmin\u0026xdm_e\u003dhttp%3A%2F%2Fion.local%3A2990\u0026xdm_c\u003dchannel-acmodule-1564427223927602208\u0026cp\u003djira\u0026lic\u003dnone\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiIwY2I3NGI4MGRkN2Y3NzkzODQ5ODY3Mjk4Y2EyZDg4OWU0ZDhiNjYxMTFiNjg5NjIyN2JkYmI0OTBkYzQ0YWUxIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.UXWVrjqrCcjX6Mt6gIap4nK7o3aTLRz0ab1fMwwSJqo"
275
+ }, {
276
+ "name": "BasePath only",
277
+ "canonicalUrl": "GET\u0026/test\u0026",
278
+ "signedUrl": "https://example.com/test?jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiYWQzMjhmYWM5OTAzNDlhOGM4ODM5M2MxNzU1YmM0Zjk4NGE5YzM4NzIwMjIyOWI4ZWQ1MmUwNGZmN2U5ZmVjIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.1LHKcYMbSI-xGystYrcpniFDmOkA45g-aJ7NhfyB-wY"
279
+ }, {
280
+ "name": "BasePath only (uri)",
281
+ "canonicalUrl": "GET\u0026/test\u0026",
282
+ "signedUrl": "https://example.com/test?jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiJiYWQzMjhmYWM5OTAzNDlhOGM4ODM5M2MxNzU1YmM0Zjk4NGE5YzM4NzIwMjIyOWI4ZWQ1MmUwNGZmN2U5ZmVjIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.1LHKcYMbSI-xGystYrcpniFDmOkA45g-aJ7NhfyB-wY"
283
+ }, {
284
+ "name": "BasePath with Delimiter",
285
+ "canonicalUrl": "GET\u0026/endsWithDelimiter\u0026a\u003db",
286
+ "signedUrl": "https://example.com/endsWithDelimiter/?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI4Zjc3YzZhMGU2YmYyNTA0MTEyMWVlNDQ0ODBkM2M5N2FlOWNjYTRiN2EwMDdlYTZlMWQ2NDhkOWEyNmU1ZDFkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.Lssm_JCVXZ7Qh-FEMJZx-eblxAa13MlzkReNLvARJI8"
287
+ }, {
288
+ "name": "BasePath with Delimiter (uri)",
289
+ "canonicalUrl": "GET\u0026/endsWithDelimiter\u0026a\u003db",
290
+ "signedUrl": "https://example.com/endsWithDelimiter/?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI4Zjc3YzZhMGU2YmYyNTA0MTEyMWVlNDQ0ODBkM2M5N2FlOWNjYTRiN2EwMDdlYTZlMWQ2NDhkOWEyNmU1ZDFkIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.Lssm_JCVXZ7Qh-FEMJZx-eblxAa13MlzkReNLvARJI8"
291
+ }, {
292
+ "name": "BasePath with Delimiter Only",
293
+ "canonicalUrl": "GET\u0026/endsWithDelimiter\u0026",
294
+ "signedUrl": "https://example.com/endsWithDelimiter/?jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0Yzc5OWU5MWZjOGUxYmU5YjFmMDM0ZjIxOTFhZTgwY2IyMDgwYjU0YTg1ZTlhMjQ2NGFkMmYyMTE1ZjhkOTg3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.wqBRfpzUg79FTLQZiUqNIk9qGEBFXhrZmQ5GvicOFY8"
295
+ }, {
296
+ "name": "BasePath with Delimiter Only (uri)",
297
+ "canonicalUrl": "GET\u0026/endsWithDelimiter\u0026",
298
+ "signedUrl": "https://example.com/endsWithDelimiter/?jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI0Yzc5OWU5MWZjOGUxYmU5YjFmMDM0ZjIxOTFhZTgwY2IyMDgwYjU0YTg1ZTlhMjQ2NGFkMmYyMTE1ZjhkOTg3IiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.wqBRfpzUg79FTLQZiUqNIk9qGEBFXhrZmQ5GvicOFY8"
299
+ }, {
300
+ "name": "BasePath RFC3986 Unreserved",
301
+ "canonicalUrl": "GET\u0026/path-._~\u0026a\u003db",
302
+ "signedUrl": "https://example.com/path-._~?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1ZDE1NzRlYTBmZDg5NzRmYTQzMjZkODdiM2VmZWM3NDAwNGJmMTNkMzUzOTU1OTlkZTQyNTMyNzE3OGMxNzNiIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.oWGLh5OdI0tw1i6FL6CDOm-qGpGJQnru9rk5B37O2T8"
303
+ }, {
304
+ "name": "BasePath RFC3986 Unreserved (uri)",
305
+ "canonicalUrl": "GET\u0026/path-._~\u0026a\u003db",
306
+ "signedUrl": "https://example.com/path-._~?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI1ZDE1NzRlYTBmZDg5NzRmYTQzMjZkODdiM2VmZWM3NDAwNGJmMTNkMzUzOTU1OTlkZTQyNTMyNzE3OGMxNzNiIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.oWGLh5OdI0tw1i6FL6CDOm-qGpGJQnru9rk5B37O2T8"
307
+ }, {
308
+ "name": "BasePath RFC3986 Subdelimiters",
309
+ "canonicalUrl": "GET\u0026/path!$%26\u0027()*+,;\u003d\u0026a\u003db",
310
+ "signedUrl": "https://example.com/path!$\u0026\u0027()*+,;\u003d?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI5ZWY4MDNmOWNiOGRlYTRmN2Y4NzVjYWZmOGQzMWU5NTk2MmM2ZThiZDQ0ZDY0YTg0OGQ2ZWJiMDU1YjIxNDRiIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xT24PP9ialy7yso14IaFYO9c5dV2oJ1OMTrPon7yRF4"
311
+ }, {
312
+ "name": "BasePath RFC3986 Subdelimiters (uri)",
313
+ "canonicalUrl": "GET\u0026/path!$%26\u0027()*+,;\u003d\u0026a\u003db",
314
+ "signedUrl": "https://example.com/path!$\u0026\u0027()*+,;\u003d?a\u003db\u0026jwt\u003deyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJxc2giOiI5ZWY4MDNmOWNiOGRlYTRmN2Y4NzVjYWZmOGQzMWU5NTk2MmM2ZThiZDQ0ZDY0YTg0OGQ2ZWJiMDU1YjIxNDRiIiwiY29udGV4dCI6e30sImlzcyI6ImppcmE6MTIzNC01Njc4LTkwMDAiLCJleHAiOjE0NjY3MzEyNTUsImlhdCI6MTQ2NjczMTA3NX0.xT24PP9ialy7yso14IaFYO9c5dV2oJ1OMTrPon7yRF4"
315
+ }],
316
+ "comment": "Generated by com.atlassian.plugin.connect.plugin.auth.jwt.JwtSigningInteroperabilityTest.SigningTests on Fri Jun 24 11:17:55 AEST 2016"
317
+ }
@@ -0,0 +1 @@
1
+ short text
@@ -7,7 +7,7 @@ describe JIRA::Resource::Attachment do
7
7
 
8
8
  let(:key) { '10000' }
9
9
 
10
- let(:target) { JIRA::Resource::Attachment.new(client, attrs: { 'id' => '99999' }, issue_id: '10002') }
10
+ let(:target) { described_class.new(client, attrs: { 'id' => '99999' }, issue_id: '10002') }
11
11
 
12
12
  let(:expected_attributes) do
13
13
  {
@@ -26,7 +26,7 @@ describe JIRA::Resource::Attachment do
26
26
  })
27
27
  end
28
28
 
29
- it_should_behave_like 'a resource with a singular GET endpoint'
30
- it_should_behave_like 'a resource with a DELETE endpoint'
29
+ it_behaves_like 'a resource with a singular GET endpoint'
30
+ it_behaves_like 'a resource with a DELETE endpoint'
31
31
  end
32
32
  end
@@ -7,7 +7,7 @@ describe JIRA::Resource::Comment do
7
7
 
8
8
  let(:key) { '10000' }
9
9
 
10
- let(:target) { JIRA::Resource::Comment.new(client, attrs: { 'id' => '99999' }, issue_id: '54321') }
10
+ let(:target) { described_class.new(client, attrs: { 'id' => '99999' }, issue_id: '54321') }
11
11
 
12
12
  let(:expected_collection_length) { 2 }
13
13
 
@@ -23,7 +23,7 @@ describe JIRA::Resource::Comment do
23
23
  let(:expected_attributes) do
24
24
  {
25
25
  'self' => 'http://localhost:2990/jira/rest/api/2/issue/10002/comment/10000',
26
- 'id' => key,
26
+ 'id' => key,
27
27
  'body' => 'This is a comment. Creative.'
28
28
  }
29
29
  end
@@ -42,11 +42,11 @@ describe JIRA::Resource::Comment do
42
42
  { 'id' => '10000', 'body' => 'new body' }
43
43
  end
44
44
 
45
- it_should_behave_like 'a resource'
46
- it_should_behave_like 'a resource with a collection GET endpoint'
47
- it_should_behave_like 'a resource with a singular GET endpoint'
48
- it_should_behave_like 'a resource with a DELETE endpoint'
49
- it_should_behave_like 'a resource with a POST endpoint'
50
- it_should_behave_like 'a resource with a PUT endpoint'
45
+ it_behaves_like 'a resource'
46
+ it_behaves_like 'a resource with a collection GET endpoint'
47
+ it_behaves_like 'a resource with a singular GET endpoint'
48
+ it_behaves_like 'a resource with a DELETE endpoint'
49
+ it_behaves_like 'a resource with a POST endpoint'
50
+ it_behaves_like 'a resource with a PUT endpoint'
51
51
  end
52
52
  end
@@ -10,7 +10,7 @@ describe JIRA::Resource::Component do
10
10
  let(:expected_attributes) do
11
11
  {
12
12
  'self' => 'http://localhost:2990/jira/rest/api/2/component/10000',
13
- 'id' => key,
13
+ 'id' => key,
14
14
  'name' => 'Cheesecake'
15
15
  }
16
16
  end
@@ -29,11 +29,11 @@ describe JIRA::Resource::Component do
29
29
  { 'id' => '10000', 'name' => 'Jammy' }
30
30
  end
31
31
 
32
- it_should_behave_like 'a resource'
33
- it_should_behave_like 'a resource with a singular GET endpoint'
34
- it_should_behave_like 'a resource with a DELETE endpoint'
35
- it_should_behave_like 'a resource with a POST endpoint'
36
- it_should_behave_like 'a resource with a PUT endpoint'
37
- it_should_behave_like 'a resource with a PUT endpoint that rejects invalid fields'
32
+ it_behaves_like 'a resource'
33
+ it_behaves_like 'a resource with a singular GET endpoint'
34
+ it_behaves_like 'a resource with a DELETE endpoint'
35
+ it_behaves_like 'a resource with a POST endpoint'
36
+ it_behaves_like 'a resource with a PUT endpoint'
37
+ it_behaves_like 'a resource with a PUT endpoint that rejects invalid fields'
38
38
  end
39
39
  end
@@ -25,8 +25,8 @@ describe JIRA::Resource::Field do
25
25
 
26
26
  let(:expected_collection_length) { 2 }
27
27
 
28
- it_should_behave_like 'a resource'
29
- it_should_behave_like 'a resource with a collection GET endpoint'
30
- it_should_behave_like 'a resource with a singular GET endpoint'
28
+ it_behaves_like 'a resource'
29
+ it_behaves_like 'a resource with a collection GET endpoint'
30
+ it_behaves_like 'a resource with a singular GET endpoint'
31
31
  end
32
32
  end
@@ -9,8 +9,8 @@ describe JIRA::Resource::Issue do
9
9
 
10
10
  let(:expected_attributes) do
11
11
  {
12
- 'self' => 'http://localhost:2990/jira/rest/api/2/issue/10002',
13
- 'key' => 'SAMPLEPROJECT-1',
12
+ 'self' => 'http://localhost:2990/jira/rest/api/2/issue/10002',
13
+ 'key' => 'SAMPLEPROJECT-1',
14
14
  'expand' => 'renderedFields,names,schema,transitions,editmeta,changelog'
15
15
  }
16
16
  end
@@ -30,8 +30,8 @@ describe JIRA::Resource::Issue do
30
30
  end
31
31
  let(:expected_collection_length) { 11 }
32
32
 
33
- it_should_behave_like 'a resource'
34
- it_should_behave_like 'a resource with a singular GET endpoint'
33
+ it_behaves_like 'a resource'
34
+ it_behaves_like 'a resource with a singular GET endpoint'
35
35
  describe 'GET all issues' do # JIRA::Resource::Issue.all uses the search endpoint
36
36
  let(:client) { client }
37
37
  let(:site_url) { site_url }
@@ -43,26 +43,29 @@ describe JIRA::Resource::Issue do
43
43
  'key' => 'SAMPLEPROJECT-13'
44
44
  }
45
45
  end
46
- before(:each) do
47
- stub_request(:get, site_url + '/jira/rest/api/2/search?expand=transitions.fields&maxResults=1000&startAt=0')
46
+
47
+ before do
48
+ stub_request(:get, "#{site_url}/jira/rest/api/2/search/jql?expand=transitions.fields&maxResults=1000&startAt=0")
48
49
  .to_return(status: 200, body: get_mock_response('issue.json'))
49
50
 
50
- stub_request(:get, site_url + '/jira/rest/api/2/search?expand=transitions.fields&maxResults=1000&startAt=11')
51
+ stub_request(:get, "#{site_url}/jira/rest/api/2/search/jql?expand=transitions.fields&maxResults=1000&startAt=11")
51
52
  .to_return(status: 200, body: get_mock_response('empty_issues.json'))
52
53
  end
53
- it_should_behave_like 'a resource with a collection GET endpoint'
54
+
55
+ it_behaves_like 'a resource with a collection GET endpoint'
54
56
  end
55
- it_should_behave_like 'a resource with a DELETE endpoint'
56
- it_should_behave_like 'a resource with a POST endpoint'
57
- it_should_behave_like 'a resource with a PUT endpoint'
58
- it_should_behave_like 'a resource with a PUT endpoint that rejects invalid fields'
57
+
58
+ it_behaves_like 'a resource with a DELETE endpoint'
59
+ it_behaves_like 'a resource with a POST endpoint'
60
+ it_behaves_like 'a resource with a PUT endpoint'
61
+ it_behaves_like 'a resource with a PUT endpoint that rejects invalid fields'
59
62
 
60
63
  describe 'errors' do
61
- before(:each) do
64
+ before do
62
65
  stub_request(:get,
63
- site_url + '/jira/rest/api/2/issue/10002')
66
+ "#{site_url}/jira/rest/api/2/issue/10002")
64
67
  .to_return(status: 200, body: get_mock_response('issue/10002.json'))
65
- stub_request(:put, site_url + '/jira/rest/api/2/issue/10002')
68
+ stub_request(:put, "#{site_url}/jira/rest/api/2/issue/10002")
66
69
  .with(body: '{"missing":"fields and update"}')
67
70
  .to_return(status: 400, body: get_mock_response('issue/10002.put.missing_field_update.json'))
68
71
  end
@@ -75,10 +78,9 @@ describe JIRA::Resource::Issue do
75
78
  end
76
79
 
77
80
  describe 'GET jql issues' do # JIRA::Resource::Issue.jql uses the search endpoint
78
- jql_query_string = "PROJECT = 'SAMPLEPROJECT'"
79
81
  let(:client) { client }
80
82
  let(:site_url) { site_url }
81
- let(:jql_query_string) { jql_query_string }
83
+ let(:jql_query_string) { "PROJECT = 'SAMPLEPROJECT'" }
82
84
 
83
85
  let(:expected_attributes) do
84
86
  {
@@ -87,7 +89,8 @@ describe JIRA::Resource::Issue do
87
89
  'key' => 'SAMPLEPROJECT-13'
88
90
  }
89
91
  end
90
- it_should_behave_like 'a resource with JQL inputs and a collection GET endpoint'
92
+
93
+ it_behaves_like 'a resource with JQL inputs and a collection GET endpoint'
91
94
  end
92
95
  end
93
96
  end
@@ -19,8 +19,8 @@ describe JIRA::Resource::Issuelinktype do
19
19
 
20
20
  let(:expected_collection_length) { 3 }
21
21
 
22
- it_should_behave_like 'a resource'
23
- it_should_behave_like 'a resource with a collection GET endpoint'
24
- it_should_behave_like 'a resource with a singular GET endpoint'
22
+ it_behaves_like 'a resource'
23
+ it_behaves_like 'a resource with a collection GET endpoint'
24
+ it_behaves_like 'a resource with a singular GET endpoint'
25
25
  end
26
26
  end
@@ -17,8 +17,8 @@ describe JIRA::Resource::Issuetype do
17
17
 
18
18
  let(:expected_collection_length) { 5 }
19
19
 
20
- it_should_behave_like 'a resource'
21
- it_should_behave_like 'a resource with a collection GET endpoint'
22
- it_should_behave_like 'a resource with a singular GET endpoint'
20
+ it_behaves_like 'a resource'
21
+ it_behaves_like 'a resource with a collection GET endpoint'
22
+ it_behaves_like 'a resource with a singular GET endpoint'
23
23
  end
24
24
  end
@@ -17,8 +17,8 @@ describe JIRA::Resource::Priority do
17
17
 
18
18
  let(:expected_collection_length) { 5 }
19
19
 
20
- it_should_behave_like 'a resource'
21
- it_should_behave_like 'a resource with a collection GET endpoint'
22
- it_should_behave_like 'a resource with a singular GET endpoint'
20
+ it_behaves_like 'a resource'
21
+ it_behaves_like 'a resource with a collection GET endpoint'
22
+ it_behaves_like 'a resource with a singular GET endpoint'
23
23
  end
24
24
  end
@@ -9,28 +9,28 @@ describe JIRA::Resource::Project do
9
9
 
10
10
  let(:expected_attributes) do
11
11
  {
12
- 'self' => 'http://localhost:2990/jira/rest/api/2/project/SAMPLEPROJECT',
13
- 'key' => key,
14
- 'name' => 'Sample Project for Developing RoR RESTful API'
12
+ 'self' => 'http://localhost:2990/jira/rest/api/2/project/SAMPLEPROJECT',
13
+ 'key' => key,
14
+ 'name' => 'Sample Project for Developing RoR RESTful API'
15
15
  }
16
16
  end
17
17
 
18
18
  let(:expected_collection_length) { 1 }
19
19
 
20
- it_should_behave_like 'a resource'
21
- it_should_behave_like 'a resource with a collection GET endpoint'
22
- it_should_behave_like 'a resource with a singular GET endpoint'
20
+ it_behaves_like 'a resource'
21
+ it_behaves_like 'a resource with a collection GET endpoint'
22
+ it_behaves_like 'a resource with a singular GET endpoint'
23
23
 
24
24
  describe 'issues' do
25
25
  it 'returns all the issues' do
26
- stub_request(:get, site_url + '/jira/rest/api/2/search?jql=project="SAMPLEPROJECT"')
26
+ stub_request(:get, "#{site_url}/jira/rest/api/2/search/jql?jql=project=\"SAMPLEPROJECT\"")
27
27
  .to_return(status: 200, body: get_mock_response('project/SAMPLEPROJECT.issues.json'))
28
28
  subject = client.Project.build('key' => key)
29
29
  issues = subject.issues
30
30
  expect(issues.length).to eq(11)
31
31
  issues.each do |issue|
32
32
  expect(issue.class).to eq(JIRA::Resource::Issue)
33
- expect(issue.expanded?).to be_falsey
33
+ expect(issue).not_to be_expanded
34
34
  end
35
35
  end
36
36
  end