govuk_content_models 6.0.2

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 (104) hide show
  1. data/.gitignore +17 -0
  2. data/.ruby-version +1 -0
  3. data/.travis.yml +14 -0
  4. data/CONTRIBUTING.md +22 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +20 -0
  7. data/README.md +5 -0
  8. data/Rakefile +46 -0
  9. data/app/models/action.rb +60 -0
  10. data/app/models/answer_edition.rb +13 -0
  11. data/app/models/artefact.rb +341 -0
  12. data/app/models/artefact_action.rb +27 -0
  13. data/app/models/artefact_external_link.rb +15 -0
  14. data/app/models/business_support/business_size.rb +14 -0
  15. data/app/models/business_support/business_type.rb +14 -0
  16. data/app/models/business_support/location.rb +14 -0
  17. data/app/models/business_support/purpose.rb +14 -0
  18. data/app/models/business_support/sector.rb +14 -0
  19. data/app/models/business_support/stage.rb +14 -0
  20. data/app/models/business_support/support_type.rb +14 -0
  21. data/app/models/business_support_edition.rb +69 -0
  22. data/app/models/campaign_edition.rb +72 -0
  23. data/app/models/completed_transaction_edition.rb +14 -0
  24. data/app/models/curated_list.rb +32 -0
  25. data/app/models/edition.rb +286 -0
  26. data/app/models/expectant.rb +21 -0
  27. data/app/models/expectation.rb +12 -0
  28. data/app/models/guide_edition.rb +19 -0
  29. data/app/models/help_page_edition.rb +13 -0
  30. data/app/models/licence_edition.rb +35 -0
  31. data/app/models/local_authority.rb +58 -0
  32. data/app/models/local_interaction.rb +20 -0
  33. data/app/models/local_service.rb +49 -0
  34. data/app/models/local_transaction_edition.rb +49 -0
  35. data/app/models/overview_dashboard.rb +25 -0
  36. data/app/models/part.rb +28 -0
  37. data/app/models/parted.rb +32 -0
  38. data/app/models/place_edition.rb +20 -0
  39. data/app/models/programme_edition.rb +26 -0
  40. data/app/models/simple_smart_answer_edition.rb +66 -0
  41. data/app/models/simple_smart_answer_edition/node.rb +40 -0
  42. data/app/models/simple_smart_answer_edition/node/option.rb +31 -0
  43. data/app/models/tag.rb +88 -0
  44. data/app/models/transaction_edition.rb +28 -0
  45. data/app/models/travel_advice_edition.rb +177 -0
  46. data/app/models/user.rb +54 -0
  47. data/app/models/video_edition.rb +24 -0
  48. data/app/models/workflow.rb +217 -0
  49. data/app/models/workflow_actor.rb +141 -0
  50. data/app/traits/attachable.rb +60 -0
  51. data/app/traits/govspeak_smart_quotes_fixer.rb +19 -0
  52. data/app/traits/taggable.rb +113 -0
  53. data/app/validators/safe_html.rb +33 -0
  54. data/app/validators/slug_validator.rb +53 -0
  55. data/config/mongoid.yml +5 -0
  56. data/govuk_content_models.gemspec +42 -0
  57. data/jenkins.sh +7 -0
  58. data/lib/fact_check_address.rb +36 -0
  59. data/lib/govuk_content_models.rb +12 -0
  60. data/lib/govuk_content_models/require_all.rb +14 -0
  61. data/lib/govuk_content_models/test_helpers/factories.rb +213 -0
  62. data/lib/govuk_content_models/test_helpers/local_services.rb +24 -0
  63. data/lib/govuk_content_models/version.rb +4 -0
  64. data/test/fixtures/contactotron_api_response.json +1 -0
  65. data/test/fixtures/uploads/image.jpg +0 -0
  66. data/test/models/artefact_action_test.rb +123 -0
  67. data/test/models/artefact_external_link_test.rb +32 -0
  68. data/test/models/artefact_tag_test.rb +52 -0
  69. data/test/models/artefact_test.rb +583 -0
  70. data/test/models/business_support/business_size_test.rb +25 -0
  71. data/test/models/business_support/business_type_test.rb +25 -0
  72. data/test/models/business_support/location_test.rb +25 -0
  73. data/test/models/business_support/purpose_test.rb +29 -0
  74. data/test/models/business_support/sector_test.rb +25 -0
  75. data/test/models/business_support/stage_test.rb +25 -0
  76. data/test/models/business_support/support_type_test.rb +25 -0
  77. data/test/models/business_support_edition_test.rb +186 -0
  78. data/test/models/campaign_edition_test.rb +90 -0
  79. data/test/models/curated_list_test.rb +32 -0
  80. data/test/models/edition_test.rb +826 -0
  81. data/test/models/fact_check_address_test.rb +36 -0
  82. data/test/models/help_page_edition_test.rb +38 -0
  83. data/test/models/licence_edition_test.rb +104 -0
  84. data/test/models/local_authority_test.rb +113 -0
  85. data/test/models/local_service_test.rb +199 -0
  86. data/test/models/local_transaction_edition_test.rb +78 -0
  87. data/test/models/overview_dashboard_test.rb +47 -0
  88. data/test/models/simple_smart_answer_edition_test.rb +169 -0
  89. data/test/models/simple_smart_answer_node_test.rb +134 -0
  90. data/test/models/simple_smart_answer_option_test.rb +90 -0
  91. data/test/models/tag_test.rb +92 -0
  92. data/test/models/time_zone_test.rb +48 -0
  93. data/test/models/transaction_edition_test.rb +20 -0
  94. data/test/models/travel_advice_edition_test.rb +480 -0
  95. data/test/models/user_test.rb +114 -0
  96. data/test/models/video_edition_test.rb +64 -0
  97. data/test/models/workflow_actor_test.rb +61 -0
  98. data/test/models/workflow_test.rb +307 -0
  99. data/test/test_helper.rb +47 -0
  100. data/test/traits/attachable_test.rb +143 -0
  101. data/test/traits/taggable_test.rb +114 -0
  102. data/test/validators/safe_html_validator_test.rb +86 -0
  103. data/test/validators/slug_validator_test.rb +42 -0
  104. metadata +511 -0
@@ -0,0 +1,36 @@
1
+ require "test_helper"
2
+ require "fact_check_address"
3
+
4
+ class FactCheckAddressTest < ActiveSupport::TestCase
5
+
6
+ setup do
7
+ dummy_plek = mock do
8
+ stubs(:find).with("publisher").returns("publisher.wibble.alphagov.co.uk")
9
+ end
10
+ Plek.stubs(:current).returns(dummy_plek)
11
+ end
12
+
13
+ test "can tell if an address is valid" do
14
+ service = FactCheckAddress.new
15
+ address = service.for_edition(Edition.new)
16
+ assert service.valid_address?(address), "Address should be valid but isn't"
17
+ end
18
+
19
+ test "can tell if an address is invalid" do
20
+ service = FactCheckAddress.new
21
+ address = "factcheck+notwibble-abde@alphagov.co.uk"
22
+ refute service.valid_address?(address), "Address should be invalid but isn't"
23
+ end
24
+
25
+ test "can extract edition ID from an address" do
26
+ service = FactCheckAddress.new
27
+ address = "factcheck+wibble-abde@alphagov.co.uk"
28
+ assert_equal "abde", service.edition_id_from_address(address)
29
+ end
30
+
31
+ test "can generate an address from an edition" do
32
+ service = FactCheckAddress.new
33
+ e = Edition.new
34
+ assert_match /#{e.id}/, service.for_edition(e)
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+
3
+ class HelpPageEditionTest < ActiveSupport::TestCase
4
+ setup do
5
+ @artefact = FactoryGirl.create(:artefact, :kind => 'help_page', :slug => "help/foo")
6
+ end
7
+
8
+ should "have correct extra fields" do
9
+ h = FactoryGirl.build(:help_page_edition, :panopticon_id => @artefact.id)
10
+ h.body = "I'm a help page."
11
+ h.safely.save!
12
+
13
+ h = HelpPageEdition.first
14
+ assert_equal "I'm a help page.", h.body
15
+ end
16
+
17
+ should "give a friendly (legacy supporting) description of its format" do
18
+ help_page = HelpPageEdition.new
19
+ assert_equal "HelpPage", help_page.format
20
+ end
21
+
22
+ should "return the body as whole_body" do
23
+ h = FactoryGirl.build(:help_page_edition,
24
+ :panopticon_id => @artefact.id,
25
+ :body => "Something")
26
+ assert_equal h.body, h.whole_body
27
+ end
28
+
29
+ should "clone extra fields when cloning edition" do
30
+ help_page = FactoryGirl.create(:help_page_edition,
31
+ :panopticon_id => @artefact.id,
32
+ :state => "published",
33
+ :body => "I'm very helpful")
34
+
35
+ new_help_page = help_page.build_clone
36
+ assert_equal help_page.body, new_help_page.body
37
+ end
38
+ end
@@ -0,0 +1,104 @@
1
+ require_relative '../test_helper'
2
+
3
+ class LicenceEditionTest < ActiveSupport::TestCase
4
+ def setup
5
+ @artefact = FactoryGirl.create(:artefact)
6
+ end
7
+
8
+ should "have correct extra fields" do
9
+ l = FactoryGirl.build(:licence_edition, panopticon_id: @artefact.id)
10
+ l.licence_identifier = "AB1234"
11
+ l.licence_short_description = "Short description of licence"
12
+ l.licence_overview = "Markdown overview of licence..."
13
+ l.will_continue_on = "The HMRC website"
14
+ l.continuation_link = "http://www.hmrc.gov.uk"
15
+ l.safely.save!
16
+
17
+ l = LicenceEdition.first
18
+ assert_equal "AB1234", l.licence_identifier
19
+ assert_equal "Short description of licence", l.licence_short_description
20
+ assert_equal "Markdown overview of licence...", l.licence_overview
21
+ assert_equal "The HMRC website", l.will_continue_on
22
+ assert_equal "http://www.hmrc.gov.uk", l.continuation_link
23
+ end
24
+
25
+ context "validations" do
26
+ setup do
27
+ @l = FactoryGirl.build(:licence_edition, panopticon_id: @artefact.id)
28
+ end
29
+
30
+ should "require a licence identifier" do
31
+ @l.licence_identifier = ''
32
+ assert_equal false, @l.valid?, "expected licence edition not to be valid"
33
+ end
34
+
35
+ context "licence identifier uniqueness" do
36
+ should "require a unique licence identifier" do
37
+ artefact2 = FactoryGirl.create(:artefact)
38
+ FactoryGirl.create(:licence_edition, :licence_identifier => "wibble", panopticon_id: artefact2.id)
39
+ @l.licence_identifier = "wibble"
40
+ assert ! @l.valid?, "expected licence edition not to be valid"
41
+ end
42
+
43
+ should "not consider archived editions when evaluating uniqueness" do
44
+ artefact2 = FactoryGirl.create(:artefact)
45
+ FactoryGirl.create(:licence_edition, :licence_identifier => "wibble", panopticon_id: artefact2.id, :state => "archived")
46
+ @l.licence_identifier = "wibble"
47
+ assert @l.valid?, "expected licence edition to be valid"
48
+ end
49
+ end
50
+
51
+ should "not require a unique licence identifier for different versions of the same licence edition" do
52
+ @l.state = 'published'
53
+ @l.licence_identifier = 'wibble'
54
+ @l.save!
55
+
56
+ new_version = @l.build_clone
57
+ assert_equal 'wibble', new_version.licence_identifier
58
+ assert new_version.valid?, "Expected clone to be valid"
59
+ end
60
+
61
+ should "not validate the continuation link when blank" do
62
+ @l.continuation_link = ""
63
+ assert @l.valid?, "continuation link validation should not be triggered when the field is blank"
64
+ end
65
+ should "fail validation when the continuation link has an invalid url" do
66
+ @l.continuation_link = "not&a+valid_url"
67
+ assert !@l.valid?, "continuation link validation should fail with a invalid url"
68
+ end
69
+ should "pass validation with a valid continuation link url" do
70
+ @l.continuation_link = "http://www.hmrc.gov.uk"
71
+ assert @l.valid?, "continuation_link validation should pass with a valid url"
72
+ end
73
+ end
74
+
75
+ should "clone extra fields when cloning edition" do
76
+ licence = FactoryGirl.create(:licence_edition,
77
+ :panopticon_id => @artefact.id,
78
+ :state => "published",
79
+ :licence_identifier => "1234",
80
+ :licence_short_description => "Short description of licence",
81
+ :licence_overview => "Overview to be cloned",
82
+ :will_continue_on => "Continuation text to be cloned",
83
+ :continuation_link => "http://www.gov.uk")
84
+ new_licence = licence.build_clone
85
+
86
+ assert_equal licence.licence_identifier, new_licence.licence_identifier
87
+ assert_equal licence.licence_short_description, new_licence.licence_short_description
88
+ assert_equal licence.licence_overview, new_licence.licence_overview
89
+ assert_equal licence.will_continue_on, new_licence.will_continue_on
90
+ assert_equal licence.continuation_link, new_licence.continuation_link
91
+ end
92
+
93
+ context "indexable_content" do
94
+ should "include the licence_overview, removing markup" do
95
+ licence = FactoryGirl.create(:licence_edition, licence_overview: "## Overview")
96
+ assert_equal "Overview", licence.indexable_content
97
+ end
98
+
99
+ should "include the licence_short_description" do
100
+ licence = FactoryGirl.create(:licence_edition, licence_short_description: "Short desc")
101
+ assert_equal "Short desc", licence.indexable_content
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,113 @@
1
+ require_relative "../test_helper"
2
+
3
+ describe LocalAuthority do
4
+ before :each do
5
+ LocalAuthority.delete_all
6
+ end
7
+
8
+ it "should create an authority with correct field types" do
9
+ # Although it may seem overboard, this test is helpful to confirm
10
+ # the correct field types are being used on the model
11
+ LocalAuthority.create!(
12
+ name: "Example",
13
+ snac: "AA00",
14
+ local_directgov_id: 1,
15
+ tier: "county",
16
+ contact_address: ["Line one", "line two", "line three"],
17
+ contact_url: "http://example.gov/contact",
18
+ contact_phone: "0000000000",
19
+ contact_email: "contact@example.gov")
20
+ authority = LocalAuthority.first
21
+ assert_equal "Example", authority.name
22
+ assert_equal "AA00", authority.snac
23
+ assert_equal 1, authority.local_directgov_id
24
+ assert_equal "county", authority.tier
25
+ assert_equal ["Line one", "line two", "line three"], authority.contact_address
26
+ assert_equal "http://example.gov/contact", authority.contact_url
27
+ assert_equal "0000000000", authority.contact_phone
28
+ assert_equal "contact@example.gov", authority.contact_email
29
+ end
30
+
31
+ describe "validating local_interactions" do
32
+ before :each do
33
+ @authority = FactoryGirl.create(:local_authority)
34
+ end
35
+
36
+ it "should require a lgsl_code and lgil_code" do
37
+ li = @authority.local_interactions.build
38
+ refute li.valid?
39
+ assert_equal ["can't be blank"], li.errors[:lgsl_code]
40
+ assert_equal ["can't be blank"], li.errors[:lgil_code]
41
+ end
42
+
43
+ it "should not allow duplicate lgsl/lgil pairs" do
44
+ li1 = @authority.local_interactions.create!(:lgsl_code => 42, :lgil_code => 8, :url => "http://www.example.com/one")
45
+ li2 = @authority.local_interactions.build(:lgsl_code => 42, :lgil_code => 8, :url => "http://www.example.com/two")
46
+
47
+ refute li2.valid?
48
+ assert_equal ["is already taken"], li2.errors[:lgil_code]
49
+
50
+ li2.lgil_code = 3
51
+ assert li2.valid?
52
+ end
53
+
54
+ it "should only validate uniqueness within the authority" do
55
+ authority2 = FactoryGirl.create(:local_authority)
56
+ li1 = @authority.local_interactions.create!(:lgsl_code => 42, :lgil_code => 8, :url => "http://www.example.com/one")
57
+ li2 = authority2.local_interactions.build(:lgsl_code => 42, :lgil_code => 8, :url => "http://www.example.com/two")
58
+
59
+ assert li2.valid?
60
+ end
61
+ end
62
+
63
+ describe "preferred_interaction_for" do
64
+ before :each do
65
+ @authority = FactoryGirl.create(:local_authority)
66
+ @lgsl_code = "142"
67
+ end
68
+
69
+ describe "with no LIGL specified" do
70
+ it "should return the lowest LGIL that's not 8" do
71
+ @interaction1 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
72
+ :lgil_code => 12)
73
+ @interaction2 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
74
+ :lgil_code => LocalInteraction::LGIL_CODE_PROVIDING_INFORMATION)
75
+ @interaction3 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
76
+ :lgil_code => 9)
77
+
78
+ assert_equal @interaction3, @authority.preferred_interaction_for(@lgsl_code)
79
+ end
80
+
81
+ it "should return LGIL 8 if there are no others" do
82
+ @interaction2 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
83
+ :lgil_code => LocalInteraction::LGIL_CODE_PROVIDING_INFORMATION)
84
+
85
+ assert_equal @interaction2, @authority.preferred_interaction_for(@lgsl_code)
86
+ end
87
+ end
88
+
89
+ describe "with an LGIL specified" do
90
+ it "should return the interaction for the specified LGIL" do
91
+ @interaction1 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
92
+ :lgil_code => 12)
93
+ @interaction2 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
94
+ :lgil_code => LocalInteraction::LGIL_CODE_PROVIDING_INFORMATION)
95
+ @interaction3 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
96
+ :lgil_code => 9)
97
+
98
+ assert_equal @interaction2, @authority.preferred_interaction_for(@lgsl_code, 8)
99
+ end
100
+
101
+ it "should return nil if there is no interaction with the specified LGIL" do
102
+ @interaction1 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
103
+ :lgil_code => 12)
104
+ @interaction2 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
105
+ :lgil_code => LocalInteraction::LGIL_CODE_PROVIDING_INFORMATION)
106
+ @interaction3 = FactoryGirl.create(:local_interaction, :local_authority => @authority, :lgsl_code => @lgsl_code,
107
+ :lgil_code => 9)
108
+
109
+ assert_equal nil, @authority.preferred_interaction_for(@lgsl_code, 3)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,199 @@
1
+ require "test_helper"
2
+ require "govuk_content_models/test_helpers/local_services"
3
+
4
+ class LocalServiceTest < ActiveSupport::TestCase
5
+ include LocalServicesHelper
6
+
7
+ def create_service_for_tiers(*tiers)
8
+ @service = LocalService.create!(
9
+ lgsl_code: @lgsl_code,
10
+ providing_tier: tiers.map(&:to_s)
11
+ )
12
+ end
13
+
14
+ def setup
15
+ LocalAuthority.delete_all
16
+ @lgsl_code = 123
17
+ @snac_code = "AA00"
18
+ @county_council = FactoryGirl.create(
19
+ :local_authority,
20
+ tier: "county",
21
+ snac: "AA00"
22
+ )
23
+ FactoryGirl.create(
24
+ :local_interaction,
25
+ local_authority: @county_council,
26
+ lgsl_code: @lgsl_code,
27
+ url: "http://some.county.council.gov/do-123.html"
28
+ )
29
+ @district_council = FactoryGirl.create(
30
+ :local_authority,
31
+ tier: "district",
32
+ snac: "AA"
33
+ )
34
+ FactoryGirl.create(
35
+ :local_interaction,
36
+ local_authority: @district_council,
37
+ lgsl_code: @lgsl_code,
38
+ url: "http://some.district.council.gov/do-123.html"
39
+ )
40
+ @unitary_authority = FactoryGirl.create(
41
+ :local_authority,
42
+ tier: "unitary",
43
+ snac: "BB00"
44
+ )
45
+ FactoryGirl.create(
46
+ :local_interaction,
47
+ local_authority: @unitary_authority,
48
+ lgsl_code: @lgsl_code,
49
+ url: "http://some.unitary.council.gov/do-123.html"
50
+ )
51
+ end
52
+
53
+ test "should return county URL for county/UA service in county" do
54
+ service = create_service_for_tiers(:county, :unitary)
55
+ councils = [@county_council.snac, @district_council.snac]
56
+ assert_equal "http://some.county.council.gov/do-123.html",
57
+ service.preferred_interaction(councils).url
58
+ end
59
+
60
+ test "should return UA URL for county/UA service in UA" do
61
+ service = create_service_for_tiers(:county, :unitary)
62
+ councils = [@unitary_authority.snac]
63
+ assert_equal "http://some.unitary.council.gov/do-123.html",
64
+ service.preferred_interaction(councils).url
65
+ end
66
+
67
+ test "should return nil for county/UA service in district" do
68
+ service = create_service_for_tiers(:county, :unitary)
69
+ councils = [@district_council.snac]
70
+ assert_nil service.preferred_interaction(councils)
71
+ end
72
+
73
+ test "should allow overriding returned LGIL" do
74
+ FactoryGirl.create(:local_interaction,
75
+ local_authority: @county_council,
76
+ lgsl_code: @lgsl_code,
77
+ lgil_code: 12,
78
+ url: "http://some.county.council.gov/do-456.html"
79
+ )
80
+ service = create_service_for_tiers(:county, :unitary)
81
+ councils = [@county_council.snac, @district_council.snac]
82
+ assert_equal "http://some.county.council.gov/do-456.html",
83
+ service.preferred_interaction(councils, 12).url
84
+ end
85
+
86
+ test "should not list a county (in a UA) as providing a service it does not provide" do
87
+ service = create_service_for_tiers(:county, :unitary)
88
+ other_service = service.lgsl_code.to_i + 1
89
+ FactoryGirl.create(
90
+ :local_interaction,
91
+ local_authority: @county_council,
92
+ lgsl_code: other_service
93
+ )
94
+ authority = FactoryGirl.create(
95
+ :local_authority,
96
+ tier: "county",
97
+ snac: "CC00"
98
+ )
99
+ FactoryGirl.create(
100
+ :local_interaction,
101
+ local_authority: authority,
102
+ lgsl_code: other_service
103
+ )
104
+
105
+ refute_includes service.provided_by.map(&:snac), "CC00"
106
+ end
107
+
108
+ test "should not list a UA as providing a service it does not provide" do
109
+ service = create_service_for_tiers(:county, :unitary)
110
+ other_service = service.lgsl_code.to_i + 1
111
+ FactoryGirl.create(
112
+ :local_interaction,
113
+ local_authority: @county_council,
114
+ lgsl_code: other_service
115
+ )
116
+ authority = FactoryGirl.create(
117
+ :local_authority,
118
+ tier: "unitary",
119
+ snac: "CC01"
120
+ )
121
+ FactoryGirl.create(
122
+ :local_interaction,
123
+ local_authority: authority,
124
+ lgsl_code: other_service
125
+ )
126
+
127
+ refute_includes service.provided_by.map(&:snac), "CC01"
128
+ end
129
+
130
+ test "should list a county (in a UA) that provides a service" do
131
+ service = create_service_for_tiers(:county, :unitary)
132
+ assert_includes service.provided_by.map(&:snac), @county_council.snac
133
+ end
134
+
135
+ test "should list a UA that provides a service" do
136
+ service = create_service_for_tiers(:county, :unitary)
137
+ assert_includes service.provided_by.map(&:snac), @unitary_authority.snac
138
+ end
139
+
140
+ test "should return district URL for district/UA service in county/district" do
141
+ service = create_service_for_tiers(:district, :unitary)
142
+ councils = [@county_council.snac, @district_council.snac]
143
+ assert_equal "http://some.district.council.gov/do-123.html",
144
+ service.preferred_interaction(councils).url
145
+ end
146
+
147
+ test "should return UA URL for district/UA service in UA" do
148
+ service = create_service_for_tiers(:district, :unitary)
149
+ councils = [@unitary_authority.snac]
150
+ assert_match "http://some.unitary.council.gov/do-123.html",
151
+ service.preferred_interaction(councils).url
152
+ end
153
+
154
+ test "should return nil for district/UA service in county" do
155
+ service = create_service_for_tiers(:district, :unitary)
156
+ councils = [@county_council.snac]
157
+ assert_nil service.preferred_interaction(councils)
158
+ end
159
+
160
+ test "should list only districts and UAs as providers" do
161
+ service = create_service_for_tiers(:district, :unitary)
162
+ providers = service.provided_by
163
+ assert_equal 2, providers.length
164
+ assert_includes providers.map(&:snac), @district_council.snac
165
+ assert_includes providers.map(&:snac), @unitary_authority.snac
166
+ end
167
+
168
+ test "should return district URL for both-tier service in county/district" do
169
+ service = create_service_for_tiers("district", "unitary", "county")
170
+ councils = [@county_council.snac, @district_council.snac]
171
+ url = service.preferred_interaction(councils).url
172
+ assert_equal "http://some.district.council.gov/do-123.html", url
173
+ end
174
+
175
+ test "should return UA URL for both-tier service in UA" do
176
+ service = create_service_for_tiers("district", "unitary", "county")
177
+ councils = [@unitary_authority.snac]
178
+ url = service.preferred_interaction(councils).url
179
+ assert_equal "http://some.unitary.council.gov/do-123.html", url
180
+ end
181
+
182
+ # This shouldn't really ever happen and suggests that the data
183
+ # is incorrect somehow, but we might as well fall back to county council
184
+ test "should return county URL for both-tier service in county" do
185
+ service = create_service_for_tiers("district", "unitary", "county")
186
+ councils = [@county_council.snac]
187
+ url = service.preferred_interaction(councils).url
188
+ assert_equal "http://some.county.council.gov/do-123.html", url
189
+ end
190
+
191
+ test "should list all authorities providing a both-tier service" do
192
+ service = create_service_for_tiers("district", "unitary", "county")
193
+ make_authority("county", snac: "CC00", lgsl: 124)
194
+ providers = service.provided_by
195
+ assert_includes providers.map(&:snac), @district_council.snac
196
+ assert_includes providers.map(&:snac), @unitary_authority.snac
197
+ assert_includes providers.map(&:snac), @county_council.snac
198
+ end
199
+ end