ccls-ccls_engine 3.11.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.
- data/README.rdoc +182 -0
- data/app/models/abstract.rb +181 -0
- data/app/models/abstract_search.rb +50 -0
- data/app/models/abstract_validations.rb +324 -0
- data/app/models/address.rb +70 -0
- data/app/models/address_type.rb +15 -0
- data/app/models/addressing.rb +147 -0
- data/app/models/aliquot.rb +44 -0
- data/app/models/aliquot_sample_format.rb +13 -0
- data/app/models/analysis.rb +14 -0
- data/app/models/bc_request.rb +20 -0
- data/app/models/candidate_control.rb +101 -0
- data/app/models/context.rb +23 -0
- data/app/models/context_data_source.rb +4 -0
- data/app/models/county.rb +16 -0
- data/app/models/data_source.rb +24 -0
- data/app/models/diagnosis.rb +23 -0
- data/app/models/document_type.rb +16 -0
- data/app/models/document_version.rb +27 -0
- data/app/models/enrollment.rb +78 -0
- data/app/models/enrollment_validations.rb +167 -0
- data/app/models/follow_up.rb +16 -0
- data/app/models/follow_up_type.rb +18 -0
- data/app/models/gift_card.rb +22 -0
- data/app/models/gift_card_search.rb +137 -0
- data/app/models/home_exposure_response.rb +24 -0
- data/app/models/homex_outcome.rb +75 -0
- data/app/models/hospital.rb +22 -0
- data/app/models/icf_master_id.rb +30 -0
- data/app/models/icf_master_tracker.rb +217 -0
- data/app/models/icf_master_tracker_change.rb +9 -0
- data/app/models/icf_master_tracker_update.rb +50 -0
- data/app/models/ineligible_reason.rb +26 -0
- data/app/models/instrument.rb +26 -0
- data/app/models/instrument_type.rb +17 -0
- data/app/models/instrument_version.rb +28 -0
- data/app/models/interview.rb +122 -0
- data/app/models/interview_method.rb +17 -0
- data/app/models/interview_outcome.rb +16 -0
- data/app/models/language.rb +28 -0
- data/app/models/live_birth_data_update.rb +142 -0
- data/app/models/operational_event.rb +99 -0
- data/app/models/operational_event_type.rb +31 -0
- data/app/models/organization.rb +28 -0
- data/app/models/patient.rb +63 -0
- data/app/models/patient_validations.rb +118 -0
- data/app/models/person.rb +28 -0
- data/app/models/phone_number.rb +105 -0
- data/app/models/phone_type.rb +15 -0
- data/app/models/project.rb +39 -0
- data/app/models/project_outcome.rb +19 -0
- data/app/models/race.rb +31 -0
- data/app/models/refusal_reason.rb +23 -0
- data/app/models/sample.rb +168 -0
- data/app/models/sample_kit.rb +14 -0
- data/app/models/sample_outcome.rb +16 -0
- data/app/models/sample_temperature.rb +14 -0
- data/app/models/sample_type.rb +37 -0
- data/app/models/search.rb +195 -0
- data/app/models/section.rb +18 -0
- data/app/models/state.rb +25 -0
- data/app/models/study_subject.rb +237 -0
- data/app/models/study_subject_abstracts.rb +47 -0
- data/app/models/study_subject_addresses.rb +34 -0
- data/app/models/study_subject_associations.rb +38 -0
- data/app/models/study_subject_duplicates.rb +111 -0
- data/app/models/study_subject_enrollments.rb +17 -0
- data/app/models/study_subject_homex_outcome.rb +22 -0
- data/app/models/study_subject_identifier.rb +153 -0
- data/app/models/study_subject_interviews.rb +25 -0
- data/app/models/study_subject_languages.rb +21 -0
- data/app/models/study_subject_operational_events.rb +66 -0
- data/app/models/study_subject_patient.rb +177 -0
- data/app/models/study_subject_pii.rb +74 -0
- data/app/models/study_subject_races.rb +25 -0
- data/app/models/study_subject_search.rb +260 -0
- data/app/models/study_subject_validations.rb +116 -0
- data/app/models/subject_language.rb +11 -0
- data/app/models/subject_race.rb +11 -0
- data/app/models/subject_relationship.rb +21 -0
- data/app/models/subject_type.rb +22 -0
- data/app/models/tracing_status.rb +20 -0
- data/app/models/transfer.rb +40 -0
- data/app/models/unit.rb +14 -0
- data/app/models/vital_status.rb +19 -0
- data/app/models/zip_code.rb +36 -0
- data/config/abstract_fields.yml +1038 -0
- data/config/abstract_sections.yml +77 -0
- data/config/home_exposure_response_fields.yml +583 -0
- data/config/icf_master_tracker_update.yml +56 -0
- data/config/live_birth_data_update.yml +56 -0
- data/config/shared_use_db.yml +4 -0
- data/generators/ccls_engine/USAGE +2 -0
- data/generators/ccls_engine/ccls_engine_generator.rb +123 -0
- data/generators/ccls_engine/templates/autotest_ccls_engine.rb +3 -0
- data/generators/ccls_engine/templates/ccls_engine.rake +12 -0
- data/generators/ccls_engine/templates/fixtures/address_types.yml +30 -0
- data/generators/ccls_engine/templates/fixtures/context_data_sources.yml +54 -0
- data/generators/ccls_engine/templates/fixtures/contexts.yml +19 -0
- data/generators/ccls_engine/templates/fixtures/data_sources.yml +40 -0
- data/generators/ccls_engine/templates/fixtures/diagnoses.yml +40 -0
- data/generators/ccls_engine/templates/fixtures/document_types.yml +65 -0
- data/generators/ccls_engine/templates/fixtures/document_versions.csv +155 -0
- data/generators/ccls_engine/templates/fixtures/follow_up_types.yml +16 -0
- data/generators/ccls_engine/templates/fixtures/hospitals.yml +114 -0
- data/generators/ccls_engine/templates/fixtures/ineligible_reasons.yml +35 -0
- data/generators/ccls_engine/templates/fixtures/instrument_types.yml +26 -0
- data/generators/ccls_engine/templates/fixtures/instrument_versions.yml +22 -0
- data/generators/ccls_engine/templates/fixtures/instruments.yml +22 -0
- data/generators/ccls_engine/templates/fixtures/interview_methods.yml +30 -0
- data/generators/ccls_engine/templates/fixtures/interview_outcomes.yml +31 -0
- data/generators/ccls_engine/templates/fixtures/languages.yml +34 -0
- data/generators/ccls_engine/templates/fixtures/operational_event_types.yml +141 -0
- data/generators/ccls_engine/templates/fixtures/organizations.yml +198 -0
- data/generators/ccls_engine/templates/fixtures/people.yml +130 -0
- data/generators/ccls_engine/templates/fixtures/phone_types.yml +30 -0
- data/generators/ccls_engine/templates/fixtures/project_outcomes.yml +25 -0
- data/generators/ccls_engine/templates/fixtures/projects.yml +59 -0
- data/generators/ccls_engine/templates/fixtures/races.yml +52 -0
- data/generators/ccls_engine/templates/fixtures/refusal_reasons.yml +55 -0
- data/generators/ccls_engine/templates/fixtures/sample_outcomes.yml +36 -0
- data/generators/ccls_engine/templates/fixtures/sample_temperatures.yml +16 -0
- data/generators/ccls_engine/templates/fixtures/sample_types.yml +147 -0
- data/generators/ccls_engine/templates/fixtures/sections.yml +31 -0
- data/generators/ccls_engine/templates/fixtures/states.yml +363 -0
- data/generators/ccls_engine/templates/fixtures/subject_relationships.yml +46 -0
- data/generators/ccls_engine/templates/fixtures/subject_types.yml +30 -0
- data/generators/ccls_engine/templates/fixtures/tracing_statuses.yml +30 -0
- data/generators/ccls_engine/templates/fixtures/units.yml +13 -0
- data/generators/ccls_engine/templates/fixtures/vital_statuses.yml +28 -0
- data/generators/ccls_engine/templates/functional/roles_controller_test.rb +142 -0
- data/generators/ccls_engine/templates/functional/sessions_controller_test.rb +19 -0
- data/generators/ccls_engine/templates/functional/users_controller_test.rb +94 -0
- data/generators/ccls_engine/templates/images/sort_down.png +0 -0
- data/generators/ccls_engine/templates/images/sort_up.png +0 -0
- data/generators/ccls_engine/templates/initializer.rb +28 -0
- data/generators/ccls_engine/templates/javascripts/ccls_engine.js +24 -0
- data/generators/ccls_engine/templates/javascripts/jquery-ui.js +763 -0
- data/generators/ccls_engine/templates/javascripts/jquery.js +154 -0
- data/generators/ccls_engine/templates/javascripts/jrails.js +1 -0
- data/generators/ccls_engine/templates/migrations/create_user_invitations.rb +18 -0
- data/generators/ccls_engine/templates/migrations/create_users.rb +33 -0
- data/generators/ccls_engine/templates/migrations/drop_user_invitations.rb +18 -0
- data/generators/ccls_engine/templates/stylesheets/ccls_engine.css +180 -0
- data/generators/ccls_engine/templates/stylesheets/user.css +35 -0
- data/generators/ccls_engine/templates/stylesheets/users.css +23 -0
- data/generators/ccls_engine/templates/unit/core_extension_test.rb +18 -0
- data/generators/ccls_engine/templates/unit/role_test.rb +30 -0
- data/generators/ccls_engine/templates/unit/user_test.rb +321 -0
- data/lib/ccls-ccls_engine.rb +1 -0
- data/lib/ccls_engine.rb +135 -0
- data/lib/ccls_engine/action_view_extension.rb +3 -0
- data/lib/ccls_engine/action_view_extension/base.rb +53 -0
- data/lib/ccls_engine/action_view_extension/form_builder.rb +39 -0
- data/lib/ccls_engine/active_record_extension.rb +2 -0
- data/lib/ccls_engine/active_record_extension/base.rb +70 -0
- data/lib/ccls_engine/active_record_shared.rb +8 -0
- data/lib/ccls_engine/assertions.rb +69 -0
- data/lib/ccls_engine/autotest.rb +54 -0
- data/lib/ccls_engine/ccls_user.rb +117 -0
- data/lib/ccls_engine/core_extension.rb +14 -0
- data/lib/ccls_engine/date_and_time_formats.rb +30 -0
- data/lib/ccls_engine/factories.rb +880 -0
- data/lib/ccls_engine/factory_test_helper.rb +276 -0
- data/lib/ccls_engine/helper.rb +112 -0
- data/lib/ccls_engine/icf_master_tracker_update_test_helper.rb +121 -0
- data/lib/ccls_engine/live_birth_data_update_test_helper.rb +110 -0
- data/lib/ccls_engine/package_test_helper.rb +49 -0
- data/lib/ccls_engine/shared_database.rb +20 -0
- data/lib/ccls_engine/tasks.rb +1 -0
- data/lib/ccls_engine/test_tasks.rb +52 -0
- data/lib/ccls_engine/translation_table.rb +86 -0
- data/lib/shared_migration.rb +5 -0
- data/lib/surveyor/survey_extensions.rb +125 -0
- data/lib/tasks/application.rake +286 -0
- data/lib/tasks/calnet_authenticated.rake +6 -0
- data/lib/tasks/common_lib.rake +7 -0
- data/lib/tasks/database.rake +288 -0
- data/lib/tasks/documentation.rake +71 -0
- data/lib/tasks/homex_import.rake +723 -0
- data/lib/tasks/odms_import.rake +1116 -0
- data/lib/tasks/simply_authorized.rake +6 -0
- data/lib/tasks/ucb_ccls_engine_tasks.rake +4 -0
- data/lib/tasks/use_db.rake +4 -0
- data/rails/init.rb +4 -0
- data/test/unit/ccls/abstract_search_test.rb +150 -0
- data/test/unit/ccls/abstract_test.rb +674 -0
- data/test/unit/ccls/address_test.rb +155 -0
- data/test/unit/ccls/address_type_test.rb +25 -0
- data/test/unit/ccls/addressing_test.rb +466 -0
- data/test/unit/ccls/aliquot_sample_format_test.rb +20 -0
- data/test/unit/ccls/aliquot_test.rb +156 -0
- data/test/unit/ccls/analysis_test.rb +31 -0
- data/test/unit/ccls/bc_request_test.rb +43 -0
- data/test/unit/ccls/candidate_control_test.rb +712 -0
- data/test/unit/ccls/context_data_source_test.rb +26 -0
- data/test/unit/ccls/context_test.rb +40 -0
- data/test/unit/ccls/core_extension_test.rb +17 -0
- data/test/unit/ccls/county_test.rb +34 -0
- data/test/unit/ccls/data_source_test.rb +41 -0
- data/test/unit/ccls/diagnosis_test.rb +51 -0
- data/test/unit/ccls/document_type_test.rb +35 -0
- data/test/unit/ccls/document_version_test.rb +68 -0
- data/test/unit/ccls/enrollment_test.rb +575 -0
- data/test/unit/ccls/follow_up_test.rb +23 -0
- data/test/unit/ccls/follow_up_type_test.rb +34 -0
- data/test/unit/ccls/gift_card_search_test.rb +153 -0
- data/test/unit/ccls/gift_card_test.rb +40 -0
- data/test/unit/ccls/home_exposure_response_test.rb +83 -0
- data/test/unit/ccls/homex_outcome_test.rb +199 -0
- data/test/unit/ccls/hospital_test.rb +102 -0
- data/test/unit/ccls/icf_master_id_test.rb +30 -0
- data/test/unit/ccls/icf_master_tracker_change_test.rb +14 -0
- data/test/unit/ccls/icf_master_tracker_test.rb +132 -0
- data/test/unit/ccls/icf_master_tracker_update_test.rb +176 -0
- data/test/unit/ccls/ineligible_reason_test.rb +48 -0
- data/test/unit/ccls/instrument_test.rb +62 -0
- data/test/unit/ccls/instrument_type_test.rb +39 -0
- data/test/unit/ccls/instrument_version_test.rb +71 -0
- data/test/unit/ccls/interview_method_test.rb +44 -0
- data/test/unit/ccls/interview_outcome_test.rb +34 -0
- data/test/unit/ccls/interview_test.rb +298 -0
- data/test/unit/ccls/language_test.rb +47 -0
- data/test/unit/ccls/live_birth_data_update_test.rb +358 -0
- data/test/unit/ccls/operational_event_test.rb +187 -0
- data/test/unit/ccls/operational_event_type_test.rb +51 -0
- data/test/unit/ccls/organization_test.rb +64 -0
- data/test/unit/ccls/patient_test.rb +538 -0
- data/test/unit/ccls/person_test.rb +55 -0
- data/test/unit/ccls/phone_number_test.rb +244 -0
- data/test/unit/ccls/phone_type_test.rb +32 -0
- data/test/unit/ccls/project_outcome_test.rb +34 -0
- data/test/unit/ccls/project_test.rb +60 -0
- data/test/unit/ccls/race_test.rb +37 -0
- data/test/unit/ccls/refusal_reason_test.rb +52 -0
- data/test/unit/ccls/role_test.rb +26 -0
- data/test/unit/ccls/sample_kit_test.rb +35 -0
- data/test/unit/ccls/sample_outcome_test.rb +34 -0
- data/test/unit/ccls/sample_temperature_test.rb +25 -0
- data/test/unit/ccls/sample_test.rb +363 -0
- data/test/unit/ccls/sample_type_test.rb +58 -0
- data/test/unit/ccls/section_test.rb +34 -0
- data/test/unit/ccls/state_test.rb +31 -0
- data/test/unit/ccls/study_subject_abstracts_test.rb +115 -0
- data/test/unit/ccls/study_subject_addresses_test.rb +93 -0
- data/test/unit/ccls/study_subject_duplicates_test.rb +407 -0
- data/test/unit/ccls/study_subject_enrollments_test.rb +65 -0
- data/test/unit/ccls/study_subject_homex_outcome_test.rb +64 -0
- data/test/unit/ccls/study_subject_identifier_test.rb +439 -0
- data/test/unit/ccls/study_subject_interviews_test.rb +26 -0
- data/test/unit/ccls/study_subject_languages_test.rb +142 -0
- data/test/unit/ccls/study_subject_operational_events_test.rb +53 -0
- data/test/unit/ccls/study_subject_patient_test.rb +249 -0
- data/test/unit/ccls/study_subject_pii_test.rb +278 -0
- data/test/unit/ccls/study_subject_races_test.rb +203 -0
- data/test/unit/ccls/study_subject_search_test.rb +704 -0
- data/test/unit/ccls/study_subject_test.rb +770 -0
- data/test/unit/ccls/subject_language_test.rb +43 -0
- data/test/unit/ccls/subject_race_test.rb +35 -0
- data/test/unit/ccls/subject_relationship_test.rb +43 -0
- data/test/unit/ccls/subject_type_test.rb +40 -0
- data/test/unit/ccls/tracing_status_test.rb +32 -0
- data/test/unit/ccls/transfer_test.rb +81 -0
- data/test/unit/ccls/translation_table_test.rb +40 -0
- data/test/unit/ccls/unit_test.rb +21 -0
- data/test/unit/ccls/user_test.rb +156 -0
- data/test/unit/ccls/vital_status_test.rb +36 -0
- data/test/unit/ccls/zip_code_test.rb +55 -0
- metadata +633 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::IneligibleReasonTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
|
|
10
|
+
# only if study_subject is ineligible
|
|
11
|
+
# assert_should_have_many(:enrollments)
|
|
12
|
+
|
|
13
|
+
assert_should_not_require_attributes( :position, :ineligible_context )
|
|
14
|
+
|
|
15
|
+
test "explicit Factory ineligible_reason test" do
|
|
16
|
+
assert_difference('IneligibleReason.count',1) {
|
|
17
|
+
ineligible_reason = Factory(:ineligible_reason)
|
|
18
|
+
assert_match /Key\d*/, ineligible_reason.key
|
|
19
|
+
assert_match /Desc\d*/, ineligible_reason.description
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "should return description as to_s" do
|
|
24
|
+
ineligible_reason = create_ineligible_reason
|
|
25
|
+
assert_equal ineligible_reason.description, "#{ineligible_reason}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "should find random" do
|
|
29
|
+
ineligible_reason = IneligibleReason.random()
|
|
30
|
+
assert ineligible_reason.is_a?(IneligibleReason)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "should return nil on random when no records" do
|
|
34
|
+
# IneligibleReason.destroy_all
|
|
35
|
+
IneligibleReason.stubs(:count).returns(0)
|
|
36
|
+
ineligible_reason = IneligibleReason.random()
|
|
37
|
+
assert_nil ineligible_reason
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
#protected
|
|
41
|
+
#
|
|
42
|
+
# def create_ineligible_reason(options={})
|
|
43
|
+
# ineligible_reason = Factory.build(:ineligible_reason,options)
|
|
44
|
+
# ineligible_reason.save
|
|
45
|
+
# ineligible_reason
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InstrumentTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
assert_should_have_many(:instrument_versions)
|
|
10
|
+
assert_should_belong_to(:interview_method)
|
|
11
|
+
assert_should_initially_belong_to(:project)
|
|
12
|
+
assert_should_require_attributes( :name )
|
|
13
|
+
assert_should_not_require_attributes( :position,
|
|
14
|
+
:results_table_id,
|
|
15
|
+
:interview_method_id,
|
|
16
|
+
:began_use_on,
|
|
17
|
+
:ended_use_on )
|
|
18
|
+
assert_should_require_attribute_length( :name, :maximum => 250 )
|
|
19
|
+
assert_requires_complete_date( :began_use_on, :ended_use_on )
|
|
20
|
+
|
|
21
|
+
test "explicit Factory instrument test" do
|
|
22
|
+
assert_difference('Project.count',1) {
|
|
23
|
+
assert_difference('Instrument.count',1) {
|
|
24
|
+
instrument = Factory(:instrument)
|
|
25
|
+
assert_not_nil instrument.project
|
|
26
|
+
assert_equal 'Instrument Name', instrument.name
|
|
27
|
+
assert_match /Key\d*/, instrument.key
|
|
28
|
+
assert_match /Desc\d*/, instrument.description
|
|
29
|
+
} }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# unfortunately name is NOT unique so should change this
|
|
33
|
+
test "should return name as to_s" do
|
|
34
|
+
instrument = create_instrument
|
|
35
|
+
assert_equal instrument.name, "#{instrument}"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test "should require project" do
|
|
39
|
+
assert_difference( "Instrument.count", 0 ) do
|
|
40
|
+
instrument = create_instrument( :project => nil)
|
|
41
|
+
assert !instrument.errors.on(:project)
|
|
42
|
+
assert instrument.errors.on_attr_and_type?(:project_id,:blank)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test "should require valid project" do
|
|
47
|
+
assert_difference( "Instrument.count", 0 ) do
|
|
48
|
+
instrument = create_instrument( :project_id => 0)
|
|
49
|
+
assert !instrument.errors.on(:project_id)
|
|
50
|
+
assert instrument.errors.on_attr_and_type?(:project,:blank)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#protected
|
|
55
|
+
#
|
|
56
|
+
# def create_instrument(options={})
|
|
57
|
+
# instrument = Factory.build(:instrument,options)
|
|
58
|
+
# instrument.save
|
|
59
|
+
# instrument
|
|
60
|
+
# end
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InstrumentTypeTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
assert_should_have_many(:instrument_versions)
|
|
10
|
+
assert_should_initially_belong_to(:project)
|
|
11
|
+
assert_should_not_require_attributes( :position )
|
|
12
|
+
|
|
13
|
+
test "explicit Factory instrument_type test" do
|
|
14
|
+
assert_difference('Project.count',1) {
|
|
15
|
+
assert_difference('InstrumentType.count',1) {
|
|
16
|
+
instrument_type = Factory(:instrument_type)
|
|
17
|
+
assert_not_nil instrument_type.project
|
|
18
|
+
assert_match /Key\d*/, instrument_type.key
|
|
19
|
+
assert_match /Desc\d*/, instrument_type.description
|
|
20
|
+
} }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "should require project" do
|
|
24
|
+
assert_difference( "InstrumentType.count", 0 ) do
|
|
25
|
+
instrument_type = create_instrument_type( :project => nil)
|
|
26
|
+
assert !instrument_type.errors.on(:project)
|
|
27
|
+
assert instrument_type.errors.on_attr_and_type?(:project_id,:blank)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test "should require valid project" do
|
|
32
|
+
assert_difference( "InstrumentType.count", 0 ) do
|
|
33
|
+
instrument_type = create_instrument_type( :project_id => 0)
|
|
34
|
+
assert !instrument_type.errors.on(:project_id)
|
|
35
|
+
assert instrument_type.errors.on_attr_and_type?(:project,:blank)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InstrumentVersionTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
assert_should_have_many( :interviews )
|
|
10
|
+
assert_should_belong_to( :language, :instrument )
|
|
11
|
+
assert_should_initially_belong_to( :instrument_type )
|
|
12
|
+
assert_should_not_require_attributes(
|
|
13
|
+
:position,
|
|
14
|
+
:language_id,
|
|
15
|
+
:began_use_on,
|
|
16
|
+
:ended_use_on,
|
|
17
|
+
:instrument_id )
|
|
18
|
+
|
|
19
|
+
assert_requires_complete_date( :began_use_on, :ended_use_on )
|
|
20
|
+
|
|
21
|
+
test "explicit Factory instrument_version test" do
|
|
22
|
+
assert_difference('InstrumentType.count',1) {
|
|
23
|
+
assert_difference('InstrumentVersion.count',1) {
|
|
24
|
+
instrument_version = Factory(:instrument_version)
|
|
25
|
+
assert_not_nil instrument_version.instrument_type
|
|
26
|
+
assert_match /Key\d*/, instrument_version.key
|
|
27
|
+
assert_match /Desc\d*/, instrument_version.description
|
|
28
|
+
} }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test "should require instrument_type" do
|
|
32
|
+
assert_difference( "InstrumentVersion.count", 0 ) do
|
|
33
|
+
instrument_version = create_instrument_version( :instrument_type => nil)
|
|
34
|
+
assert !instrument_version.errors.on(:instrument_type)
|
|
35
|
+
assert instrument_version.errors.on_attr_and_type?(:instrument_type_id,:blank)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test "should require valid instrument_type" do
|
|
40
|
+
assert_difference( "InstrumentVersion.count", 0 ) do
|
|
41
|
+
instrument_version = create_instrument_version( :instrument_type_id => 0)
|
|
42
|
+
assert !instrument_version.errors.on(:instrument_type_id)
|
|
43
|
+
assert instrument_version.errors.on_attr_and_type?(:instrument_type,:blank)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test "should return description as to_s" do
|
|
48
|
+
instrument_version = create_instrument_version
|
|
49
|
+
assert_equal instrument_version.description, "#{instrument_version}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "should find random" do
|
|
53
|
+
instrument_version = InstrumentVersion.random()
|
|
54
|
+
assert instrument_version.is_a?(InstrumentVersion)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
test "should return nil on random when no records" do
|
|
58
|
+
InstrumentVersion.stubs(:count).returns(0)
|
|
59
|
+
instrument_version = InstrumentVersion.random()
|
|
60
|
+
assert_nil instrument_version
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#protected
|
|
64
|
+
#
|
|
65
|
+
# def create_instrument_version(options={})
|
|
66
|
+
# instrument_version = Factory.build(:instrument_version,options)
|
|
67
|
+
# instrument_version.save
|
|
68
|
+
# instrument_version
|
|
69
|
+
# end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InterviewMethodTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
assert_should_have_many( :interviews, :instruments )
|
|
10
|
+
assert_should_not_require_attributes( :position )
|
|
11
|
+
|
|
12
|
+
test "explicit Factory interview_method test" do
|
|
13
|
+
assert_difference('InterviewMethod.count',1) {
|
|
14
|
+
interview_method = Factory(:interview_method)
|
|
15
|
+
assert_match /Key\d*/, interview_method.key
|
|
16
|
+
assert_match /Desc\d*/, interview_method.description
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "should return description as to_s" do
|
|
21
|
+
interview_method = create_interview_method
|
|
22
|
+
assert_equal interview_method.description, "#{interview_method}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test "should find random" do
|
|
26
|
+
interview_method = InterviewMethod.random()
|
|
27
|
+
assert interview_method.is_a?(InterviewMethod)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
test "should return nil on random when no records" do
|
|
31
|
+
InterviewMethod.stubs(:count).returns(0)
|
|
32
|
+
interview_method = InterviewMethod.random()
|
|
33
|
+
assert_nil interview_method
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#protected
|
|
37
|
+
#
|
|
38
|
+
# def create_interview_method(options={})
|
|
39
|
+
# interview_method = Factory.build(:interview_method,options)
|
|
40
|
+
# interview_method.save
|
|
41
|
+
# interview_method
|
|
42
|
+
# end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InterviewOutcomeTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_behave_like_a_hash
|
|
6
|
+
|
|
7
|
+
assert_should_create_default_object
|
|
8
|
+
assert_should_act_as_list
|
|
9
|
+
assert_should_have_many(:homex_outcomes)
|
|
10
|
+
assert_should_not_require_attributes( :position )
|
|
11
|
+
|
|
12
|
+
test "explicit Factory interview_outcome test" do
|
|
13
|
+
assert_difference('InterviewOutcome.count',1) {
|
|
14
|
+
interview_outcome = Factory(:interview_outcome)
|
|
15
|
+
assert_match /Key\d*/, interview_outcome.key
|
|
16
|
+
assert_match /Desc\d*/, interview_outcome.description
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "should return description as to_s" do
|
|
21
|
+
interview_outcome = create_interview_outcome(:description => "Description")
|
|
22
|
+
assert_equal interview_outcome.description,
|
|
23
|
+
"#{interview_outcome}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#protected
|
|
27
|
+
#
|
|
28
|
+
# def create_interview_outcome(options={})
|
|
29
|
+
# interview_outcome = Factory.build(:interview_outcome,options)
|
|
30
|
+
# interview_outcome.save
|
|
31
|
+
# interview_outcome
|
|
32
|
+
# end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Ccls::InterviewTest < ActiveSupport::TestCase
|
|
4
|
+
|
|
5
|
+
assert_should_create_default_object
|
|
6
|
+
assert_should_initially_belong_to(:study_subject)
|
|
7
|
+
assert_should_protect( :study_subject_id, :study_subject )
|
|
8
|
+
assert_should_belong_to( :address,
|
|
9
|
+
:instrument_version,
|
|
10
|
+
:interview_method,
|
|
11
|
+
:language,
|
|
12
|
+
:subject_relationship )
|
|
13
|
+
assert_should_belong_to( :interviewer, :class_name => 'Person')
|
|
14
|
+
assert_should_not_require_attributes(
|
|
15
|
+
:address_id,
|
|
16
|
+
:language_id,
|
|
17
|
+
:interviewer_id,
|
|
18
|
+
:instrument_version_id,
|
|
19
|
+
:interview_method_id,
|
|
20
|
+
:study_subject_id,
|
|
21
|
+
:began_on,
|
|
22
|
+
:ended_on,
|
|
23
|
+
:intro_letter_sent_on,
|
|
24
|
+
:consent_read_over_phone,
|
|
25
|
+
:respondent_requested_new_consent,
|
|
26
|
+
:consent_reviewed_with_respondent )
|
|
27
|
+
assert_should_require_attribute_length(
|
|
28
|
+
:subject_relationship_other,
|
|
29
|
+
:respondent_first_name,
|
|
30
|
+
:respondent_last_name,
|
|
31
|
+
:maximum => 250 )
|
|
32
|
+
assert_requires_complete_date( :began_on, :ended_on, :intro_letter_sent_on )
|
|
33
|
+
assert_should_protect( :began_at, :ended_at )
|
|
34
|
+
|
|
35
|
+
test "explicit Factory interview test" do
|
|
36
|
+
assert_difference('StudySubject.count',1) {
|
|
37
|
+
assert_difference('Interview.count',1) {
|
|
38
|
+
interview = Factory(:interview)
|
|
39
|
+
assert_not_nil interview.study_subject
|
|
40
|
+
} }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test "should create intro letter operational event " <<
|
|
44
|
+
"when intro_letter_sent_on set" do
|
|
45
|
+
study_subject = create_hx_study_subject
|
|
46
|
+
assert_difference( "OperationalEvent.count", 1 ) {
|
|
47
|
+
assert_difference( "Interview.count", 1 ) {
|
|
48
|
+
@interview = create_interview( :study_subject => study_subject,
|
|
49
|
+
:intro_letter_sent_on => Date.yesterday ).reload
|
|
50
|
+
} }
|
|
51
|
+
assert_equal OperationalEventType['intro'],
|
|
52
|
+
OperationalEvent.last.operational_event_type
|
|
53
|
+
assert_equal @interview.intro_letter_sent_on,
|
|
54
|
+
OperationalEvent.last.occurred_on
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
test "should update intro letter operational event " <<
|
|
58
|
+
"when intro_letter_sent_on updated" do
|
|
59
|
+
interview = create_interview(
|
|
60
|
+
:study_subject => create_hx_study_subject,
|
|
61
|
+
:intro_letter_sent_on => Date.yesterday )
|
|
62
|
+
assert_difference( "OperationalEvent.count", 0 ) {
|
|
63
|
+
assert_difference( "Interview.count", 0 ) {
|
|
64
|
+
interview.update_attributes(:intro_letter_sent_on => Date.today )
|
|
65
|
+
} }
|
|
66
|
+
assert_equal Date.today,
|
|
67
|
+
OperationalEvent.last.occurred_on
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
test "should NOT require valid address_id" do
|
|
71
|
+
assert_difference( "Interview.count", 1 ) do
|
|
72
|
+
interview = create_interview(:address_id => 0)
|
|
73
|
+
assert !interview.errors.on(:address)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
test "should NOT require valid interviewer_id" do
|
|
78
|
+
assert_difference( "Interview.count", 1 ) do
|
|
79
|
+
interview = create_interview(:interviewer_id => 0)
|
|
80
|
+
assert !interview.errors.on(:interviewer)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
test "should NOT require valid instrument_version_id" do
|
|
85
|
+
assert_difference( "Interview.count", 1 ) do
|
|
86
|
+
interview = create_interview(:instrument_version_id => 0)
|
|
87
|
+
assert !interview.errors.on(:instrument_version_id)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
test "should NOT require valid interview_method_id" do
|
|
92
|
+
assert_difference( "Interview.count", 1 ) do
|
|
93
|
+
interview = create_interview(:interview_method_id => 0)
|
|
94
|
+
assert !interview.errors.on(:interview_method_id)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
test "should NOT require valid language_id" do
|
|
99
|
+
assert_difference( "Interview.count", 1 ) do
|
|
100
|
+
interview = create_interview(:language_id => 0)
|
|
101
|
+
assert !interview.errors.on(:language_id)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
test "should NOT require valid study_subject_id" do
|
|
106
|
+
assert_difference( "Interview.count", 1 ) do
|
|
107
|
+
interview = create_interview(:study_subject_id => 0)
|
|
108
|
+
assert !interview.errors.on(:study_subject_id)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
test "should return join of respondent's name" do
|
|
113
|
+
interview = create_interview(
|
|
114
|
+
:respondent_first_name => "Santa",
|
|
115
|
+
:respondent_last_name => "Claus" )
|
|
116
|
+
assert_equal 'Santa Claus', interview.respondent_full_name
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
test "should require subject_relationship_other if " <<
|
|
120
|
+
"subject_relationship == other" do
|
|
121
|
+
assert_difference( "Interview.count", 0 ) do
|
|
122
|
+
interview = create_interview(
|
|
123
|
+
:subject_relationship => SubjectRelationship['other'] )
|
|
124
|
+
assert interview.errors.on(:subject_relationship_other)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
test "should NOT ALLOW subject_relationship_other if " <<
|
|
129
|
+
"subject_relationship is blank" do
|
|
130
|
+
assert_difference( "Interview.count", 0 ) do
|
|
131
|
+
interview = create_interview(
|
|
132
|
+
:subject_relationship_id => '',
|
|
133
|
+
:subject_relationship_other => 'asdfasdf' )
|
|
134
|
+
assert interview.errors.on(:subject_relationship_other)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
test "should ALLOW subject_relationship_other if " <<
|
|
139
|
+
"subject_relationship != other" do
|
|
140
|
+
assert_difference( "Interview.count", 1 ) do
|
|
141
|
+
interview = create_interview(
|
|
142
|
+
:subject_relationship => Factory(:subject_relationship),
|
|
143
|
+
:subject_relationship_other => 'asdfasdf' )
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
test "should require subject_relationship_other with custom message" do
|
|
148
|
+
assert_difference( "Interview.count", 0 ) do
|
|
149
|
+
interview = create_interview(
|
|
150
|
+
:subject_relationship => SubjectRelationship['other'] )
|
|
151
|
+
assert interview.errors.on(:subject_relationship_other)
|
|
152
|
+
assert_match /You must specify a relationship with 'other relationship' is selected/,
|
|
153
|
+
interview.errors.full_messages.to_sentence
|
|
154
|
+
assert_no_match /Subject relationship other/,
|
|
155
|
+
interview.errors.full_messages.to_sentence
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
%w( began ended ).each do |time|
|
|
160
|
+
|
|
161
|
+
test "should NOT create #{time}_at on save if time fields NOT given" do
|
|
162
|
+
assert_difference( "Interview.count", 1 ) do
|
|
163
|
+
interview = create_interview
|
|
164
|
+
assert_nil interview.send("#{time}_at")
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
test "should NOT create #{time}_at on save if #{time}_on NOT given" do
|
|
169
|
+
assert_difference( "Interview.count", 1 ) do
|
|
170
|
+
interview = create_interview_with_times("#{time}_on" => nil)
|
|
171
|
+
assert_nil interview.send("#{time}_at")
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
test "should NOT create #{time}_at on save if #{time}_at_hour NOT given" do
|
|
176
|
+
assert_difference( "Interview.count", 1 ) do
|
|
177
|
+
interview = create_interview_with_times("#{time}_at_hour" => nil)
|
|
178
|
+
assert_nil interview.send("#{time}_at")
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
test "should NOT create #{time}_at on save if #{time}_at_minute NOT given" do
|
|
183
|
+
assert_difference( "Interview.count", 1 ) do
|
|
184
|
+
interview = create_interview_with_times("#{time}_at_minute" => nil)
|
|
185
|
+
assert_nil interview.send("#{time}_at")
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
test "should NOT create #{time}_at on save if #{time}_at_meridiem NOT given" do
|
|
190
|
+
assert_difference( "Interview.count", 1 ) do
|
|
191
|
+
interview = create_interview_with_times("#{time}_at_meridiem" => nil)
|
|
192
|
+
assert_nil interview.send("#{time}_at")
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
test "should create #{time}_at on save if time fields given" do
|
|
197
|
+
assert_difference( "Interview.count", 1 ) do
|
|
198
|
+
interview = create_interview_with_times
|
|
199
|
+
assert_not_nil interview.send("#{time}_at")
|
|
200
|
+
assert_equal interview.send("#{time}_at"),
|
|
201
|
+
DateTime.parse("May 12, 2000 1:30 PM")
|
|
202
|
+
# DateTime.parse("May 12, 2000 1:30 PM PST")
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
test "should nilify #{time}_at on update if #{time}_on NOT given" do
|
|
207
|
+
interview = create_interview_with_times
|
|
208
|
+
assert_not_nil interview.send("#{time}_at")
|
|
209
|
+
interview.update_attributes("#{time}_on" => nil)
|
|
210
|
+
assert_nil interview.send("#{time}_at")
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
test "should nilify #{time}_at on update if #{time}_at_hour NOT given" do
|
|
214
|
+
interview = create_interview_with_times
|
|
215
|
+
assert_not_nil interview.send("#{time}_at")
|
|
216
|
+
interview.update_attributes("#{time}_at_hour" => nil)
|
|
217
|
+
assert_nil interview.send("#{time}_at")
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
test "should nilify #{time}_at on update if #{time}_at_minute NOT given" do
|
|
221
|
+
interview = create_interview_with_times
|
|
222
|
+
assert_not_nil interview.send("#{time}_at")
|
|
223
|
+
interview.update_attributes("#{time}_at_minute" => nil)
|
|
224
|
+
assert_nil interview.send("#{time}_at")
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
test "should nilify #{time}_at on update if #{time}_at_meridiem NOT given" do
|
|
228
|
+
interview = create_interview_with_times
|
|
229
|
+
assert_not_nil interview.send("#{time}_at")
|
|
230
|
+
interview.update_attributes("#{time}_at_meridiem" => nil)
|
|
231
|
+
assert_nil interview.send("#{time}_at")
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
test "should require #{time}_at_hour be greater than 0" do
|
|
235
|
+
assert_difference( "Interview.count", 0 ) do
|
|
236
|
+
interview = create_interview_with_times("#{time}_at_hour" => 0)
|
|
237
|
+
assert_nil interview.send("#{time}_at")
|
|
238
|
+
assert interview.errors.on_attr_and_type?("#{time}_at_hour",:inclusion)
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
test "should require #{time}_at_hour be less than 13" do
|
|
243
|
+
assert_difference( "Interview.count", 0 ) do
|
|
244
|
+
interview = create_interview_with_times("#{time}_at_hour" => 13)
|
|
245
|
+
assert_nil interview.send("#{time}_at")
|
|
246
|
+
assert interview.errors.on_attr_and_type?("#{time}_at_hour",:inclusion)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
test "should require #{time}_at_minute be greater than -1" do
|
|
251
|
+
assert_difference( "Interview.count", 0 ) do
|
|
252
|
+
interview = create_interview_with_times("#{time}_at_minute" => -1)
|
|
253
|
+
assert_nil interview.send("#{time}_at")
|
|
254
|
+
assert interview.errors.on_attr_and_type?("#{time}_at_minute",:inclusion)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
test "should require #{time}_at_minute be less than 60" do
|
|
259
|
+
assert_difference( "Interview.count", 0 ) do
|
|
260
|
+
interview = create_interview_with_times("#{time}_at_minute" => 60)
|
|
261
|
+
assert_nil interview.send("#{time}_at")
|
|
262
|
+
assert interview.errors.on_attr_and_type?("#{time}_at_minute",:inclusion)
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
test "should require #{time}_at_meridiem is AM or PM" do
|
|
267
|
+
assert_difference( "Interview.count", 0 ) do
|
|
268
|
+
interview = create_interview_with_times("#{time}_at_meridiem" => 'MM')
|
|
269
|
+
assert_nil interview.send("#{time}_at")
|
|
270
|
+
assert interview.errors.on_attr_and_type?("#{time}_at_meridiem",:invalid)
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
protected
|
|
277
|
+
|
|
278
|
+
# def create_interview(options={})
|
|
279
|
+
# interview = Factory.build(:interview,options)
|
|
280
|
+
# interview.save
|
|
281
|
+
# interview
|
|
282
|
+
# end
|
|
283
|
+
|
|
284
|
+
def create_interview_with_times(options={})
|
|
285
|
+
ioptions = HashWithIndifferentAccess.new({
|
|
286
|
+
:began_on => Date.parse('May 12, 2000'),
|
|
287
|
+
:began_at_hour => 1,
|
|
288
|
+
:began_at_minute => 30,
|
|
289
|
+
:began_at_meridiem => 'PM',
|
|
290
|
+
:ended_on => Date.parse('May 12, 2000'),
|
|
291
|
+
:ended_at_hour => 1,
|
|
292
|
+
:ended_at_minute => 30,
|
|
293
|
+
:ended_at_meridiem => 'PM'
|
|
294
|
+
}).merge(options)
|
|
295
|
+
create_interview(ioptions)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
end
|