Module: GdsApi::TestHelpers::PublishingApi

Includes:
ContentItemHelpers
Defined in:
lib/gds_api/test_helpers/publishing_api.rb

Constant Summary collapse

PUBLISHING_API_V2_ENDPOINT =
"#{Plek.find('publishing-api')}/v2".freeze
PUBLISHING_API_ENDPOINT =
Plek.find("publishing-api")

Instance Method Summary collapse

Methods included from ContentItemHelpers

#content_item_for_base_path, #gone_content_item_for_base_path, #titleize_base_path

Instance Method Details

#assert_publishing_api(verb, url, attributes_or_matcher = nil, times = 1) ⇒ Object

Assert that a request was made to the publishing API

Parameters:

  • verb (String)
  • url (String)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 292

def assert_publishing_api(verb, url, attributes_or_matcher = nil, times = 1)
  matcher = if attributes_or_matcher.is_a?(Hash)
              request_json_matches(attributes_or_matcher)
            else
              attributes_or_matcher
            end

  if matcher
    assert_requested(verb, url, times:, &matcher)
  else
    assert_requested(verb, url, times:)
  end
end

#assert_publishing_api_discard_draft(content_id, attributes_or_matcher = nil, times = 1) ⇒ Object

Assert that a draft was discarded (POST /v2/content/:content_id/discard-draft)

Parameters:

  • content_id (UUID)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


281
282
283
284
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 281

def assert_publishing_api_discard_draft(content_id, attributes_or_matcher = nil, times = 1)
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/discard-draft"
  assert_publishing_api(:post, url, attributes_or_matcher, times)
end

Assert that links were updated (PATCH /v2/links/:content_id)

Parameters:

  • content_id (UUID)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


271
272
273
274
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 271

def assert_publishing_api_patch_links(content_id, attributes_or_matcher = nil, times = 1)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/links/#{content_id}"
  assert_publishing_api(:patch, url, attributes_or_matcher, times)
end

#assert_publishing_api_publish(content_id, attributes_or_matcher = nil, times = 1) ⇒ Object

Assert that content was published (POST /v2/content/:content_id/publish)

Parameters:

  • content_id (UUID)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


251
252
253
254
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 251

def assert_publishing_api_publish(content_id, attributes_or_matcher = nil, times = 1)
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/publish"
  assert_publishing_api(:post, url, attributes_or_matcher, times)
end

#assert_publishing_api_put(url, attributes_or_matcher = {}, times = 1) ⇒ Object



795
796
797
798
799
800
801
802
803
804
805
806
807
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 795

def assert_publishing_api_put(url, attributes_or_matcher = {}, times = 1)
  matcher = if attributes_or_matcher.is_a?(Hash)
              attributes_or_matcher.empty? ? nil : request_json_matching(attributes_or_matcher)
            else
              attributes_or_matcher
            end

  if matcher
    assert_requested(:put, url, times:, &matcher)
  else
    assert_requested(:put, url, times:)
  end
end

#assert_publishing_api_put_content(content_id, attributes_or_matcher = nil, times = 1) ⇒ Object

Assert that content was saved (PUT /v2/content/:content_id)

Parameters:

  • content_id (UUID)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


241
242
243
244
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 241

def assert_publishing_api_put_content(content_id, attributes_or_matcher = nil, times = 1)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content/#{content_id}"
  assert_publishing_api(:put, url, attributes_or_matcher, times)
end

Assert that a draft was saved and published, and links were updated.

  • PUT /v2/content/:content_id

  • POST /v2/content/:content_id/publish

  • PATCH /v2/links/:content_id

Parameters:

  • body (String)
  • content_id (UUID) (defaults to: nil)
  • publish_body (Hash) (defaults to: nil)


225
226
227
228
229
230
231
232
233
234
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 225

def assert_publishing_api_put_content_links_and_publish(body, content_id = nil, publish_body = nil)
  content_id ||= body[:content_id]
  if publish_body.nil?
    publish_body = { update_type: body.fetch(:update_type) }
    publish_body[:locale] = body[:locale] if body[:locale]
  end
  assert_publishing_api_put_content(content_id, body.except(:links))
  assert_publishing_api_patch_links(content_id, body.slice(:links)) unless body.slice(:links).empty?
  assert_publishing_api_publish(content_id, publish_body)
end

#assert_publishing_api_put_intent(base_path, attributes_or_matcher = {}, times = 1) ⇒ Object



790
791
792
793
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 790

def assert_publishing_api_put_intent(base_path, attributes_or_matcher = {}, times = 1)
  url = "#{PUBLISHING_API_ENDPOINT}/publish-intent#{base_path}"
  assert_publishing_api_put(url, attributes_or_matcher, times)
end

#assert_publishing_api_unpublish(content_id, attributes_or_matcher = nil, times = 1) ⇒ Object

Assert that content was unpublished (POST /v2/content/:content_id/unpublish)

Parameters:

  • content_id (UUID)
  • attributes_or_matcher (Object) (defaults to: nil)
  • times (Integer) (defaults to: 1)


261
262
263
264
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 261

def assert_publishing_api_unpublish(content_id, attributes_or_matcher = nil, times = 1)
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/unpublish"
  assert_publishing_api(:post, url, attributes_or_matcher, times)
end

#request_json_includes(required_attributes) ⇒ Object

Get a request matcher that checks if a JSON request includes a set of attributes



307
308
309
310
311
312
313
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 307

def request_json_includes(required_attributes)
  lambda do |request|
    data = JSON.parse(request.body)
    deep_stringify_keys(required_attributes)
      .to_a.all? { |key, value| data[key] == value }
  end
end

#request_json_including(required_attributes) ⇒ Object



816
817
818
819
820
821
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 816

def request_json_including(required_attributes)
  lambda do |request|
    data = JSON.parse(request.body)
    values_match_recursively(required_attributes, data)
  end
end

#request_json_matches(required_attributes) ⇒ Object

Get a request matcher that checks if a JSON request matches a hash



316
317
318
319
320
321
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 316

def request_json_matches(required_attributes)
  lambda do |request|
    data = JSON.parse(request.body)
    deep_stringify_keys(required_attributes) == data
  end
end

#request_json_matching(required_attributes) ⇒ Object



809
810
811
812
813
814
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 809

def request_json_matching(required_attributes)
  lambda do |request|
    data = JSON.parse(request.body)
    required_attributes.to_a.all? { |key, value| data[key.to_s] == value }
  end
end

#stub_any_publishing_api_callObject

Stub any request to the publishing API



176
177
178
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 176

def stub_any_publishing_api_call
  stub_request(:any, %r{\A#{PUBLISHING_API_ENDPOINT}})
end

#stub_any_publishing_api_call_to_return_not_foundObject

Stub any request to the publishing API to return a 404 response



181
182
183
184
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 181

def stub_any_publishing_api_call_to_return_not_found
  stub_request(:any, %r{\A#{PUBLISHING_API_ENDPOINT}})
    .to_return(status: 404, headers: { "Content-Type" => "application/json; charset=utf-8" })
end

#stub_any_publishing_api_discard_draftObject

Stub any POST /v2/content/*/discard-draft request



171
172
173
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 171

def stub_any_publishing_api_discard_draft
  stub_request(:post, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/.*/discard-draft})
end

Stub any PATCH /v2/links/* request



151
152
153
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 151

def stub_any_publishing_api_patch_links
  stub_request(:patch, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/links/})
end

#stub_any_publishing_api_path_reservationObject

Stub all PUT /paths/:base_path requests

Examples:

stub_any_publishing_api_path_reservation


850
851
852
853
854
855
856
857
858
859
860
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 850

def stub_any_publishing_api_path_reservation
  stub_request(:put, %r{\A#{PUBLISHING_API_ENDPOINT}/paths/}).to_return do |request|
    base_path = request.uri.path.sub(%r{\A/paths}, "")
    body = JSON.parse(request.body).merge(base_path:)
    {
      status: 200,
      headers: { content_type: "application/json" },
      body: body.to_json,
    }
  end
end

#stub_any_publishing_api_publishObject

Stub any POST /v2/content/*/publish request



156
157
158
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 156

def stub_any_publishing_api_publish
  stub_request(:post, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/.*/publish})
end

#stub_any_publishing_api_put_contentObject

Stub any PUT /v2/content/* request



146
147
148
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 146

def stub_any_publishing_api_put_content
  stub_request(:put, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/})
end

#stub_any_publishing_api_put_intentObject



786
787
788
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 786

def stub_any_publishing_api_put_intent
  stub_request(:put, %r{\A#{PUBLISHING_API_ENDPOINT}/publish-intent})
end

#stub_any_publishing_api_republishObject

Stub any POST /v2/content/*/publish request



161
162
163
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 161

def stub_any_publishing_api_republish
  stub_request(:post, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/.*/republish})
end

#stub_any_publishing_api_unpublishObject

Stub any POST /v2/content/*/unpublish request



166
167
168
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 166

def stub_any_publishing_api_unpublish
  stub_request(:post, %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/.*/unpublish})
end

#stub_any_publishing_api_unreserve_pathObject



752
753
754
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 752

def stub_any_publishing_api_unreserve_path
  stub_request(:delete, %r{\A#{PUBLISHING_API_ENDPOINT}/paths/})
end

#stub_publishing_api_destroy_intent(base_path) ⇒ Object



781
782
783
784
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 781

def stub_publishing_api_destroy_intent(base_path)
  url = "#{PUBLISHING_API_ENDPOINT}/publish-intent#{base_path}"
  stub_request(:delete, url).to_return(status: 200, body: "{}", headers: { "Content-Type" => "application/json; charset=utf-8" })
end

#stub_publishing_api_discard_draft(content_id) ⇒ Object

Stub a POST /v2/content/:content_id/discard-draft request

Parameters:

  • content_id (UUID)


119
120
121
122
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 119

def stub_publishing_api_discard_draft(content_id)
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/discard-draft"
  stub_request(:post, url).to_return(status: 200, headers: { "Content-Type" => "application/json; charset=utf-8" })
end

#stub_publishing_api_does_not_have_item(content_id, params = {}) ⇒ Object

Stub GET /v2/content/:content_id to return a 404 response

Parameters:

  • content_id (UUID)


506
507
508
509
510
511
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 506

def stub_publishing_api_does_not_have_item(content_id, params = {})
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content/#{content_id}"
  stub_request(:get, url)
    .with(query: hash_including(params))
    .to_return(status: 404, body: resource_not_found(content_id, "content item").to_json, headers: {})
end

Stub GET /v2/links/:content_id to return a 404 response

Parameters:

  • content_id (UUID)


647
648
649
650
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 647

def stub_publishing_api_does_not_have_links(content_id)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/links/#{content_id}"
  stub_request(:get, url).to_return(status: 404, body: resource_not_found(content_id, "link set").to_json, headers: {})
end

#stub_publishing_api_get_editions(editions, params = {}) ⇒ Object

Stub GET /v2/editions to return a set of editions

Examples:


stub_publishing_api_get_editions(
  vehicle_recalls_and_faults,   # this is a variable containing an array of editions
  fields: fields,   #example: let(:fields) { %i[base_path content_id public_updated_at title publication_state] }
  per_page: 50
)

Parameters:

  • items (Array)
  • params (Hash) (defaults to: {})


716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 716

def stub_publishing_api_get_editions(editions, params = {})
  url = "#{PUBLISHING_API_V2_ENDPOINT}/editions"

  results = editions.map do |edition|
    next edition unless params[:fields]

    edition.select { |k| params[:fields].include?(k) }
  end

  per_page = (params[:per_page] || 100).to_i
  results = results.take(per_page)

  body = {
    results:,
    links: [
      { rel: "self", href: "#{PUBLISHING_API_V2_ENDPOINT}/editions" },
    ],
  }

  stub_request(:get, url)
    .with(query: params)
    .to_return(status: 200, body: body.to_json, headers: {})
end

#stub_publishing_api_graphql_content_item(query, response_hash = {}) ⇒ Object

Stub a POST /graphql content item request

Parameters:

  • query (String)


207
208
209
210
211
212
213
214
215
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 207

def stub_publishing_api_graphql_content_item(query, response_hash = {})
  url = "#{PUBLISHING_API_ENDPOINT}/graphql"
  response = {
    status: 200,
    body: response_hash.to_json,
    headers: { "Content-Type" => "application/json; charset=utf-8" },
  }
  stub_request(:post, url).with(body: { query: }).to_return(response)
end

#stub_publishing_api_graphql_query(query, response_hash = {}) ⇒ Object

Stub a POST /graphql request

Parameters:

  • query (String)


194
195
196
197
198
199
200
201
202
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 194

def stub_publishing_api_graphql_query(query, response_hash = {})
  url = "#{PUBLISHING_API_ENDPOINT}/graphql"
  response = {
    status: 200,
    body: response_hash.to_json,
    headers: { "Content-Type" => "application/json; charset=utf-8" },
  }
  stub_request(:post, url).with(body: { query: }).to_return(response)
end

#stub_publishing_api_has_content(items, params = {}) ⇒ Object

Stub GET /v2/content/ to return a set of content items

Examples:


stub_publishing_api_has_content(
  vehicle_recalls_and_faults,   # this is a variable containing an array of content items
  document_type: described_class.publishing_api_document_type,   #example of a document_type: "vehicle_recalls_and_faults_alert"
  fields: fields,   #example: let(:fields) { %i[base_path content_id public_updated_at title publication_state] }
  page: 1,
  per_page: 50
)

Parameters:

  • items (Array)
  • params (Hash) (defaults to: {})


336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 336

def stub_publishing_api_has_content(items, params = {})
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content"

  if params.respond_to? :fetch
    per_page = params.fetch(:per_page, 50)
    page = params.fetch(:page, 1)
  else
    per_page = 50
    page = 1
  end

  start_position = (page - 1) * per_page
  page_items = items.slice(start_position, per_page) || []

  number_of_pages =
    if items.count < per_page
      1
    else
      (items.count / per_page.to_f).ceil
    end

  body = {
    results: page_items,
    total: items.count,
    pages: number_of_pages,
    current_page: page,
  }

  stub_request(:get, url)
    .with(query: params)
    .to_return(status: 200, body: body.to_json, headers: {})
end

#stub_publishing_api_has_embedded_content(content_id:, total: 0, total_pages: 0, results: [], page_number: nil, order: nil, rollup: {}) ⇒ Object

Stub GET /v2/content/:content_id/embedded to return a list of content items that embed the target content_id

Examples:


stub_publishing_api_has_content_(
  content_id: "9faacf5c-f4e6-4bf9-ba90-413e997c1f22" # this is the content_id for a reusable edition
  total: 1 # the number of results returned
  results: [{
    "title" => "foo",
    "document_type" => "document",
    "base_path" => "/foo",
    "content_id" => "e60fae2a-5490-4e2f-9e80-2093c47608d4",
    "primary_publishing_organisation" => {
      "content_id" => "7662e1e7-79f9-4d0a-b754-6232186851f6",
      "title" => "bar",
      "base_path" => "/organisation/bar",
    },
  }] # an array of content items that embed the target content_id
  rollup: {
    "views" => 1
    "locations" => 1
    "instances" => 1
    "organisations" => 1
  } # metadata with the total counts across all pages
)

Parameters:

  • content_id (UUID)
  • total (defaults to: 0)

    Integer

  • total_pages (defaults to: 0)

    Integer

  • results (Array) (defaults to: [])
  • rollup (Hash) (defaults to: {})


399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 399

def stub_publishing_api_has_embedded_content(
  content_id:,
  total: 0,
  total_pages: 0,
  results: [],
  page_number: nil,
  order: nil,
  rollup: {}
)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content/#{content_id}/host-content"

  query = {
    "page" => page_number,
    "order" => order,
  }.compact

  stub_request(:get, url)
    .with(query:)
    .to_return(body: {
      "content_id" => content_id,
      "total" => total,
      "total_pages" => total_pages,
      "rollup" => rollup,
      "results" => results,
    }.to_json)
end

#stub_publishing_api_has_embedded_content_for_any_content_id(total: 0, total_pages: 0, results: [], page_number: nil, order: nil, rollup: {}) ⇒ Object



426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 426

def stub_publishing_api_has_embedded_content_for_any_content_id(
  total: 0,
  total_pages: 0,
  results: [],
  page_number: nil,
  order: nil,
  rollup: {}
)
  url = %r{\A#{PUBLISHING_API_V2_ENDPOINT}/content/[0-9a-fA-F-]{36}/host-content}

  query = {
    "page" => page_number,
    "order" => order,
  }.compact

  stub_request(:get, url)
    .with { |request| WebMock::Util::QueryMapper.query_to_values(request.uri.query) == query }
    .to_return(body: {
      "content_id" => SecureRandom.uuid,
      "total" => total,
      "total_pages" => total_pages,
      "rollup" => rollup,
      "results" => results,
    }.to_json)
end

Stub a request to the expanded links endpoint

Examples:

stub_publishing_api_has_expanded_links(
  {
    "content_id" => "64aadc14-9bca-40d9-abb4-4f21f9792a05",
    "expanded_links" => {
      "mainstream_browse_pages" => [
        {
          "content_id" => "df2e7a3e-2078-45de-a76a-fd37d027427a",
          "base_path" => "/a/base/path",
          "document_type" => "mainstream_browse_page",
          "locale" => "en",
          "links" => {},
          # ...
        }
      ],
      "parent" => [
        {
          "content_id" => "df2e7a3e-2028-45de-a75a-fd37d027427e",
          "document_type" => "mainstream_browse_page",
          # ...
        },
      ]
    }
  }
)
Services.publishing_api.expanded_links("64aadc14-9bca-40d9-abb4-4f21f9792a05")
=>  {
      "content_id" => "64aadc14-9bca-40d9-abb4-4f21f9792a05",
      "expanded_links" => {
        "mainstream_browse_pages" => [
          {
            "content_id" => "df2e7a3e-2078-45de-a76a-fd37d027427a",
            "base_path" => "/a/base/path",
            "document_type" => "mainstream_browse_page",
            "locale" => "en",
            "links" => {},
            ...
          }
        ],
        "parent" => [
          {
            "content_id" => "df2e7a3e-2028-45de-a75a-fd37d027427e",
            "document_type" => "mainstream_browse_page",
            ...
          },
        ]
      }
    }

Parameters:

  • links (Hash)

    the structure of the links hash



603
604
605
606
607
608
609
610
611
612
613
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 603

def stub_publishing_api_has_expanded_links(links, with_drafts: true, generate: false)
  links = deep_transform_keys(links, &:to_sym)
  request_params = {}
  request_params["with_drafts"] = false unless with_drafts
  request_params["generate"] = true if generate

  url = "#{PUBLISHING_API_V2_ENDPOINT}/expanded-links/#{links[:content_id]}"
  stub_request(:get, url)
    .with(query: request_params)
    .to_return(status: 200, body: links.to_json, headers: {})
end

#stub_publishing_api_has_fields_for_document(document_type, items, fields) ⇒ Object

This method has been refactored into publishing_api_has_content (above) publishing_api_has_content allows for flexible passing in of arguments, please use instead



454
455
456
457
458
459
460
461
462
463
464
465
466
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 454

def stub_publishing_api_has_fields_for_document(document_type, items, fields)
  body = Array(items).map do |item|
    deep_stringify_keys(item).slice(*fields)
  end

  query_params = fields.map do |f|
    "&fields%5B%5D=#{f}"
  end

  url = PUBLISHING_API_V2_ENDPOINT + "/content?document_type=#{document_type}#{query_params.join('')}"

  stub_request(:get, url).to_return(status: 200, body: { results: body }.to_json, headers: {})
end

#stub_publishing_api_has_item(item, params = {}) ⇒ Object

Stub GET /v2/content/:content_id to return a specific content item hash

Parameters:

  • item (Hash)


479
480
481
482
483
484
485
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 479

def stub_publishing_api_has_item(item, params = {})
  item = deep_transform_keys(item, &:to_sym)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content/#{item[:content_id]}"
  stub_request(:get, url)
    .with(query: hash_including(params))
    .to_return(status: 200, body: item.to_json, headers: {})
end

#stub_publishing_api_has_item_in_sequence(content_id, items) ⇒ Object

Stub GET /v2/content/:content_id to progress through a series of responses.

Parameters:

  • items (Array)


490
491
492
493
494
495
496
497
498
499
500
501
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 490

def stub_publishing_api_has_item_in_sequence(content_id, items)
  items = items.each { |item| deep_transform_keys(item, &:to_sym) }
  url = "#{PUBLISHING_API_V2_ENDPOINT}/content/#{content_id}"
  calls = -1

  stub_request(:get, url).to_return do |_request|
    calls += 1
    item = items[calls] || items.last

    { status: 200, body: item.to_json, headers: {} }
  end
end

#stub_publishing_api_has_linkables(linkables, document_type:) ⇒ Object

Stub GET /v2/linkables to return a set of content items with a specific document type

Parameters:

  • linkables (Array)


471
472
473
474
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 471

def stub_publishing_api_has_linkables(linkables, document_type:)
  url = PUBLISHING_API_V2_ENDPOINT + "/linkables?document_type=#{document_type}"
  stub_request(:get, url).to_return(status: 200, body: linkables.to_json, headers: {})
end

#stub_publishing_api_has_linked_items(items, params = {}) ⇒ Object

Stub calls to the get linked items endpoint

Examples:


stub_publishing_api_has_linked_items(
  [ item_1, item_2 ],
  {
    content_id: "51ac4247-fd92-470a-a207-6b852a97f2db",
    link_type: "taxons",
    fields: ["title", "description", "base_path"]
  }
)

Parameters:

  • items (Array)

    The linked items we wish to return

  • params (Hash) (defaults to: {})

    A hash of parameters



685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 685

def stub_publishing_api_has_linked_items(items, params = {})
  content_id = params.fetch(:content_id)
  link_type = params.fetch(:link_type)
  fields = params.fetch(:fields, %w[base_path content_id document_type title])

  url = PUBLISHING_API_V2_ENDPOINT + "/linked/#{content_id}"

  request_parmeters = {
    "fields" => fields,
    "link_type" => link_type,
  }

  stub_request(:get, url)
    .with(query: request_parmeters)
    .and_return(
      body: items.to_json,
      status: 200,
    )
end

Stub a request to links endpoint

Examples:


stub_publishing_api_has_links(
  {
    "content_id" => "64aadc14-9bca-40d9-abb6-4f21f9792a05",
    "links" => {
      "mainstream_browse_pages" => ["df2e7a3e-2078-45de-a75a-fd37d027427e"],
      "parent" => ["df2e7a3e-2078-45de-a75a-fd37d027427e"],
      "organisations" => ["569a9ee5-c195-4b7f-b9dc-edc17a09113f", "5c54ae52-341b-499e-a6dd-67f04633b8cf"]
    },
    "version" => 6
  }
)

Services.publishing_api.get_links("64aadc14-9bca-40d9-abb6-4f21f9792a05")
=> {
     "content_id" => "64aadc14-9bca-40d9-abb6-4f21f9792a05",
     "links" => {
       "mainstream_browse_pages" => ["df2e7a3e-2078-45de-a75a-fd37d027427e"],
       "parent" => ["df2e7a3e-2078-45de-a75a-fd37d027427e"],
       "organisations" => ["569a9ee5-c195-4b7f-b9dc-edc17a09113f", "5c54ae52-341b-499e-a6dd-67f04633b8cf"]
     },
     "version" => 6
   }

Parameters:

  • links (Hash)

    the structure of the links hash



543
544
545
546
547
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 543

def stub_publishing_api_has_links(links)
  links = deep_transform_keys(links, &:to_sym)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/links/#{links[:content_id]}"
  stub_request(:get, url).to_return(status: 200, body: links.to_json, headers: {})
end

Stub a request to get links for content ids

Examples:

stub_publishing_api_has_links_for_content_ids(
  { "2878337b-bed9-4e7f-85b6-10ed2cbcd504" => {
      "links" => { "taxons" => ["eb6965c7-3056-45d0-ae50-2f0a5e2e0854"] }
    },
    "eec13cea-219d-4896-9c97-60114da23559" => {
      "links" => {}
    }
  }
)
Services.publishing_api.get_links_for_content_ids(["2878337b-bed9-4e7f-85b6-10ed2cbcd504"])
=>  {
      "2878337b-bed9-4e7f-85b6-10ed2cbcd504" => {
        "links" => [
          "eb6965c7-3056-45d0-ae50-2f0a5e2e0854"
        ]
      }
    }

Parameters:

  • links (Hash)

    the links for each content id



639
640
641
642
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 639

def stub_publishing_api_has_links_for_content_ids(links)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/links/by-content-id"
  stub_request(:post, url).with(body: { content_ids: links.keys }).to_return(status: 200, body: links.to_json, headers: {})
end

#stub_publishing_api_has_lookups(lookup_hash) ⇒ Object

Stub calls to the lookups endpoint

Examples:


stub_publishing_api_has_lookups({
  "/foo" => "51ac4247-fd92-470a-a207-6b852a97f2db",
  "/bar" => "261bd281-f16c-48d5-82d2-9544019ad9ca"
})

Parameters:

  • lookup_hash (Hash)

    Hash with base_path as key, content_id as value.



663
664
665
666
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 663

def stub_publishing_api_has_lookups(lookup_hash)
  url = "#{PUBLISHING_API_ENDPOINT}/lookup-by-base-path"
  stub_request(:post, url).to_return(body: lookup_hash.to_json)
end

#stub_publishing_api_has_path_reservation_for(path, publishing_app) ⇒ Object

Stub a PUT /paths/:base_path request for a particular publishing application. Calling for a different publishing application will return a 422 response.

Examples:

stub_publishing_api_has_path_reservation_for("/foo", "content-publisher")

Parameters:

  • base_path (String)
  • publishing_app (String)


871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 871

def stub_publishing_api_has_path_reservation_for(path, publishing_app)
  message = "#{path} is already reserved by #{publishing_app}"
  error = { code: 422,
            message: "Base path #{message}",
            fields: { base_path: [message] } }

  stub_request(:put, "#{PUBLISHING_API_ENDPOINT}/paths#{path}")
            .to_return(status: 422,
                       headers: { content_type: "application/json" },
                       body: { error: }.to_json)

  stub_request(:put, "#{PUBLISHING_API_ENDPOINT}/paths#{path}")
    .with(body: { "publishing_app" => publishing_app })
    .to_return(status: 200,
               headers: { content_type: "application/json" },
               body: { publishing_app:, base_path: path }.to_json)
end

#stub_publishing_api_has_schemas(schemas) ⇒ Object

Stub a request to get all schemas

Examples:

stub_publishing_api_has_schemas(
  {
      "email_address" =>  {
        "type": "email_address",
        "required": ["email"],
        "properties": {
          "email": { "type" => "string" },
        },
      },
      "tax_bracket" => {
        "type": "tax_bracket",
        "required": ["code"],
        "properties": {
          "code": { "type" => "string" },
        },
      }
  }
)


962
963
964
965
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 962

def stub_publishing_api_has_schemas(schemas)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/schemas"
  stub_request(:get, url).to_return(status: 200, body: schemas.to_json, headers: {})
end

#stub_publishing_api_has_schemas_for_schema_name(schema_name, schema) ⇒ Object

Stub a request to get a schema by schema name

Examples:

stub_publishing_api_has_schemas_for_schema_name(
  "email_address",
  { "email_address" =>  {
      "type": "email_address",
      "required": ["email"],
      "properties": {
        "email": { "type" => "string" },
      },
    },
  }
)

Parameters:

  • schema (String)

    name



930
931
932
933
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 930

def stub_publishing_api_has_schemas_for_schema_name(schema_name, schema)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/schemas/#{schema_name}"
  stub_request(:get, url).to_return(status: 200, body: schema.to_json, headers: {})
end

#stub_publishing_api_isnt_availableObject

Stub any request to the publishing API to return a 503 response



187
188
189
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 187

def stub_publishing_api_isnt_available
  stub_request(:any, /#{PUBLISHING_API_ENDPOINT}\/.*/).to_return(status: 503)
end

Stub a PATCH /v2/links/:content_id request

Examples:

stub_publishing_api_patch_links(
  my_content_id,
  "links" => {
    "taxons" => %w(level_one_topic level_two_topic),
  },
  "previous_version" => 3,
)

Parameters:

  • content_id (UUID)
  • body (String)


48
49
50
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 48

def stub_publishing_api_patch_links(content_id, body)
  stub_publishing_api_patch(content_id, body, "/links")
end

Stub a PATCH /v2/links/:content_id request to return a 409 response

Examples:

stub_publishing_api_patch_links_conflict(
  my_content_id,
  "links" => {
    "taxons" => %w(level_one_topic level_two_topic),
  },
  "previous_version" => 3,
)

Parameters:

  • content_id (UUID)
  • body (String)


65
66
67
68
69
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 65

def stub_publishing_api_patch_links_conflict(content_id, body)
  previous_version = JSON.parse(body.to_json)["previous_version"]
  override_response_hash = { status: 409, body: version_conflict(previous_version) }
  stub_publishing_api_patch(content_id, body, "/links", override_response_hash)
end

#stub_publishing_api_path_reservation(base_path, params = {}) ⇒ Object

Stub a PUT /paths/:base_path request with the given base_path and request body.

Examples:

stub_publishing_api_path_reservation(
  "/path/to",
  publishing_app: "content-publisher",
  override_existing: true,
)

Parameters:

  • base_path (String)
  • params (Hash) (defaults to: {})


835
836
837
838
839
840
841
842
843
844
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 835

def stub_publishing_api_path_reservation(base_path, params = {})
  url = PUBLISHING_API_ENDPOINT + "/paths#{base_path}"
  response = {
    status: 200,
    headers: { content_type: "application/json" },
    body: params.merge(base_path:).to_json,
  }

  stub_request(:put, url).with(body: params).to_return(response)
end

#stub_publishing_api_publish(content_id, body, response_hash = {}) ⇒ Object

Stub a POST /v2/content/:content_id/publish request

Parameters:

  • content_id (UUID)
  • body (String)
  • response_hash (Hash) (defaults to: {})


76
77
78
79
80
81
82
83
84
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 76

def stub_publishing_api_publish(content_id, body, response_hash = {})
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/publish"
  response = {
    status: 200,
    body: "{}",
    headers: { "Content-Type" => "application/json; charset=utf-8" },
  }.merge(response_hash)
  stub_request(:post, url).with(body:).to_return(response)
end

#stub_publishing_api_put_content(content_id, body, response_hash = {}) ⇒ Object

Stub a PUT /v2/content/:content_id request with the given content id and request body. if no response_hash is given, a default response as follows is created: 200, body: ‘{’, headers: => “application/json; charset=utf-8”}

if a response is given, then it will be merged with the default response. if the given parameter for the response body is a Hash, it will be converted to JSON.

The following two examples are equivalent:

Examples:

stub_publishing_api_put_content(my_content_id, my_request_body, { status: 201, body: {version: 33}.to_json })
stub_publishing_api_put_content(my_content_id, my_request_body, { status: 201, body: {version: 33} })

Parameters:

  • content_id (UUID)
  • body (String)
  • response_hash (Hash) (defaults to: {})


31
32
33
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 31

def stub_publishing_api_put_content(content_id, body, response_hash = {})
  stub_publishing_api_put(content_id, body, "/content", response_hash)
end

Stub requests issued when publishing a new draft.

  • PUT /v2/content/:content_id

  • POST /v2/content/:content_id/publish

  • PATCH /v2/links/:content_id

Parameters:

  • body (String)
  • content_id (UUID) (defaults to: nil)
  • publish_body (Hash) (defaults to: nil)


132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 132

def stub_publishing_api_put_content_links_and_publish(body, content_id = nil, publish_body = nil)
  content_id ||= body[:content_id]
  if publish_body.nil?
    publish_body = { update_type: body.fetch(:update_type) }
    publish_body[:locale] = body[:locale] if body[:locale]
  end
  stubs = []
  stubs << stub_publishing_api_put_content(content_id, body.except(:links))
  stubs << stub_publishing_api_patch_links(content_id, body.slice(:links)) unless body.slice(:links).empty?
  stubs << stub_publishing_api_publish(content_id, publish_body)
  stubs
end

#stub_publishing_api_put_intent(base_path, params = {}) ⇒ Object

Stub a PUT /publish-intent/:base_path request with the given base_path and request body.

Examples:

stub_publishing_api_put_intent(
  "/path/to/content",
  publishing_app: "publisher",
  rendering_app: "frontend",
  publish_time: "2019-11-11T17:56:17+00:00",
)

Parameters:

  • base_path (String)
  • params (Hash) (defaults to: {})


769
770
771
772
773
774
775
776
777
778
779
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 769

def stub_publishing_api_put_intent(base_path, params = {})
  url = PUBLISHING_API_ENDPOINT + "/publish-intent#{base_path}"
  body = params.is_a?(String) ? params : params.to_json

  response = {
    status: 200,
    headers: { content_type: "application/json" },
    body:,
  }
  stub_request(:put, url).with(body: params).to_return(response)
end

#stub_publishing_api_republish(content_id, body = {}, response_hash = {}) ⇒ Object

Stub a POST /v2/content/:content_id/republish request

Parameters:

  • content_id (UUID)
  • body (String) (defaults to: {})
  • response_hash (Hash) (defaults to: {})


91
92
93
94
95
96
97
98
99
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 91

def stub_publishing_api_republish(content_id, body = {}, response_hash = {})
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/republish"
  response = {
    status: 200,
    body: "{}",
    headers: { "Content-Type" => "application/json; charset=utf-8" },
  }.merge(response_hash)
  stub_request(:post, url).with(body:).to_return(response)
end

#stub_publishing_api_returns_path_reservation_validation_error_for(base_path, error_fields = {}) ⇒ Object

Stub a PUT /paths/:base_path request for a particular publishing application. Calling for a different publishing application will return a 422 response.

Examples:

stub_publishing_api_returns_path_reservation_validation_error_for(
  "/foo",
  "field" => ["error 1", "error 2"]
)

Parameters:

  • base_path (String)
  • error_fields (Hash) (defaults to: {})


901
902
903
904
905
906
907
908
909
910
911
912
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 901

def stub_publishing_api_returns_path_reservation_validation_error_for(base_path, error_fields = {})
  error_fields = { "base_path" => ["Computer says no"] } if error_fields.empty?

  message = "#{error_fields.keys.first.to_s.capitalize.gsub(/_/, ' ')} #{error_fields.values.flatten.first}"

  error = { code: 422, message:, fields: error_fields }

  stub_request(:put, "#{PUBLISHING_API_ENDPOINT}/paths#{base_path}")
    .to_return(status: 422,
               headers: { content_type: "application/json" },
               body: { error: }.to_json)
end

#stub_publishing_api_schema_name_path_to_return_not_found(schema_name) ⇒ Object



935
936
937
938
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 935

def stub_publishing_api_schema_name_path_to_return_not_found(schema_name)
  url = "#{PUBLISHING_API_V2_ENDPOINT}/schemas/#{schema_name}"
  stub_request(:get, url).to_return(status: 404, headers: { "Content-Type" => "application/json; charset=utf-8" })
end

#stub_publishing_api_unpublish(content_id, params, response_hash = {}) ⇒ Object

Stub a POST /v2/content/:content_id/unpublish request

Parameters:

  • content_id (UUID)
  • params (Hash)
  • body (String)


106
107
108
109
110
111
112
113
114
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 106

def stub_publishing_api_unpublish(content_id, params, response_hash = {})
  url = PUBLISHING_API_V2_ENDPOINT + "/content/#{content_id}/unpublish"
  response = {
    status: 200,
    body: "{}",
    headers: { "Content-Type" => "application/json; charset=utf-8" },
  }.merge(response_hash)
  stub_request(:post, url).with(params).to_return(response)
end

#stub_publishing_api_unreserve_path(base_path, publishing_app = /.*/) ⇒ Object



740
741
742
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 740

def stub_publishing_api_unreserve_path(base_path, publishing_app = /.*/)
  stub_publishing_api_unreserve_path_with_code(base_path, publishing_app, 200)
end

#stub_publishing_api_unreserve_path_invalid(base_path, publishing_app = /.*/) ⇒ Object



748
749
750
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 748

def stub_publishing_api_unreserve_path_invalid(base_path, publishing_app = /.*/)
  stub_publishing_api_unreserve_path_with_code(base_path, publishing_app, 422)
end

#stub_publishing_api_unreserve_path_not_found(base_path, publishing_app = /.*/) ⇒ Object



744
745
746
# File 'lib/gds_api/test_helpers/publishing_api.rb', line 744

def stub_publishing_api_unreserve_path_not_found(base_path, publishing_app = /.*/)
  stub_publishing_api_unreserve_path_with_code(base_path, publishing_app, 404)
end