@ -1,8 +1,94 @@
require " rails_helper "
require " rails_helper "
RSpec . describe SchemesHelper do
RSpec . describe SchemesHelper do
describe " Active periods " do
let ( :scheme ) { FactoryBot . create ( :scheme ) }
before do
Timecop . freeze ( 2022 , 10 , 10 )
end
after do
Timecop . unfreeze
end
it " returns one active period without to date " do
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 1 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : nil )
end
it " ignores reactivations that were deactivated on the same day " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 4 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 6 , 4 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 1 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 5 , 5 ) )
end
it " returns sequential non reactivated active periods " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 4 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 7 , 6 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 2 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 5 , 5 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 6 , 4 ) , to : Time . zone . local ( 2022 , 7 , 6 ) )
end
it " returns sequential reactivated active periods " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 4 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 7 , 6 ) , reactivation_date : Time . zone . local ( 2022 , 8 , 5 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 3 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 5 , 5 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 6 , 4 ) , to : Time . zone . local ( 2022 , 7 , 6 ) )
expect ( scheme_active_periods ( scheme ) . third ) . to have_attributes ( from : Time . zone . local ( 2022 , 8 , 5 ) , to : nil )
end
it " returns non sequential non reactivated active periods " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 7 , 6 ) , reactivation_date : Time . zone . local ( 2022 , 8 , 5 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : nil , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 2 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 5 , 5 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 8 , 5 ) , to : nil )
end
it " returns non sequential reactivated active periods " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 7 , 6 ) , reactivation_date : Time . zone . local ( 2022 , 8 , 5 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 4 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 3 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 5 , 5 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 6 , 4 ) , to : Time . zone . local ( 2022 , 7 , 6 ) )
expect ( scheme_active_periods ( scheme ) . third ) . to have_attributes ( from : Time . zone . local ( 2022 , 8 , 5 ) , to : nil )
end
it " returns correct active periods when reactivation happends during a deactivated period " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 11 , 11 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 4 , 6 ) , reactivation_date : Time . zone . local ( 2022 , 7 , 7 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 2 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 4 , 6 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 11 , 11 ) , to : nil )
end
it " returns correct active periods when a full deactivation period happens during another deactivation period " do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 5 , 5 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 11 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 4 , 6 ) , reactivation_date : Time . zone . local ( 2022 , 7 , 7 ) , scheme : )
scheme . reload
expect ( scheme_active_periods ( scheme ) . count ) . to eq ( 2 )
expect ( scheme_active_periods ( scheme ) . first ) . to have_attributes ( from : Time . zone . local ( 2022 , 4 , 1 ) , to : Time . zone . local ( 2022 , 4 , 6 ) )
expect ( scheme_active_periods ( scheme ) . second ) . to have_attributes ( from : Time . zone . local ( 2022 , 7 , 7 ) , to : nil )
end
end
describe " display_scheme_attributes " do
describe " display_scheme_attributes " do
let! ( :scheme ) { FactoryBot . create ( :scheme , created_at : Time . zone . local ( 2022 , 8 , 8 ) ) }
let! ( :scheme ) { FactoryBot . create ( :scheme , created_at : Time . zone . local ( 2022 , 4 , 1 ) ) }
it " returns correct display attributes " do
it " returns correct display attributes " do
attributes = [
attributes = [
@ -18,32 +104,116 @@ RSpec.describe SchemesHelper do
{ name : " Secondary client group " , value : scheme . secondary_client_group } ,
{ name : " Secondary client group " , value : scheme . secondary_client_group } ,
{ name : " Level of support given " , value : scheme . support_type } ,
{ name : " Level of support given " , value : scheme . support_type } ,
{ name : " Intended length of stay " , value : scheme . intended_stay } ,
{ name : " Intended length of stay " , value : scheme . intended_stay } ,
{ name : " Availability " , value : " Active from 8 August 2022 " } ,
{ name : " Availability " , value : " Active from 1 April 2022 " } ,
{ name : " Status " , value : :active } ,
{ name : " Status " , value : :active } ,
]
]
expect ( display_scheme_attributes ( scheme ) ) . to eq ( attributes )
expect ( display_scheme_attributes ( scheme ) ) . to eq ( attributes )
end
end
context " when viewing availability " do
context " when viewing availability " do
context " with are no deactivations " do
context " with no deactivations " do
it " displays created_at as availability date " do
it " displays created_at as availability date " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from #{ scheme . created_at . to_formatted_s ( :govuk_date ) } " )
expect ( availability_attribute ) . to eq ( " Active from #{ scheme . created_at . to_formatted_s ( :govuk_date ) } " )
end
end
it " displays current collection start date as availability date if created_at is later than collection start date " do
scheme . update! ( created_at : Time . zone . local ( 2022 , 4 , 16 ) )
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 " )
end
end
end
context " with previous deactivations " do
context " with previous deactivations " do
context " and all reactivated deactivations " do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 8 , 10 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 1 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 15 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 28 ) , scheme : )
scheme . reload
end
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 9 August 2022 \n Deactivated on 10 August 2022 \n Active from 1 September 2022 to 14 September 2022 \n Deactivated on 15 September 2022 \n Active from 28 September 2022 " )
end
end
context " and non reactivated deactivation " do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 8 , 10 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 1 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 15 ) , reactivation_date : nil , scheme : )
scheme . reload
end
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 9 August 2022 \n Deactivated on 10 August 2022 \n Active from 1 September 2022 to 14 September 2022 \n Deactivated on 15 September 2022 " )
end
end
end
context " with out of order deactivations " do
context " and all reactivated deactivations " do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 24 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 28 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 6 , 15 ) , reactivation_date : Time . zone . local ( 2022 , 6 , 18 ) , scheme : )
scheme . reload
end
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 14 June 2022 \n Deactivated on 15 June 2022 \n Active from 18 June 2022 to 23 September 2022 \n Deactivated on 24 September 2022 \n Active from 28 September 2022 " )
end
end
context " and one non reactivated deactivation " do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 24 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 28 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 6 , 15 ) , reactivation_date : nil , scheme : )
scheme . reload
end
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 14 June 2022 \n Deactivated on 15 June 2022 \n Active from 28 September 2022 " )
end
end
end
context " with multiple out of order deactivations " do
context " and one non reactivated deactivation " do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 24 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 28 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 10 , 24 ) , reactivation_date : Time . zone . local ( 2022 , 10 , 28 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 6 , 15 ) , reactivation_date : nil , scheme : )
scheme . reload
end
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 14 June 2022 \n Deactivated on 15 June 2022 \n Active from 28 September 2022 to 23 October 2022 \n Deactivated on 24 October 2022 \n Active from 28 October 2022 " )
end
end
end
context " with intersecting deactivations " do
before do
before do
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 8 , 10 ) , reactivation_date : Time . zone . local ( 2022 , 9 , 1 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 10 , 10 ) , reactivation_date : Time . zone . local ( 2022 , 12 , 1 ) , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 9 , 15 ) , reactivation_date : nil , scheme : )
FactoryBot . create ( :scheme_deactivation_period , deactivation_date : Time . zone . local ( 2022 , 11 , 11 ) , reactivation_date : Time . zone . local ( 2022 , 12 , 11 ) , scheme : )
scheme . reload
scheme . reload
end
end
it " displays the timeline of availability " do
it " displays the timeline of availability " do
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
availability_attribute = display_scheme_attributes ( scheme ) . find { | x | x [ :name ] == " Availability " } [ :value ]
expect ( availability_attribute ) . to eq ( " Active from 8 August 2022 to 9 August 2022 \n Deactivated on 10 August 2022 \n Active from 1 September 2022 to 14 September 2022 \n Deactivated on 15 September 2022 " )
expect ( availability_attribute ) . to eq ( " Active from 1 April 2022 to 9 October 2022 \n Deactivated on 10 October 2022 \n Active from 11 December 2022 " )
end
end
end
end
end
end