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.
Files changed (269) hide show
  1. data/README.rdoc +182 -0
  2. data/app/models/abstract.rb +181 -0
  3. data/app/models/abstract_search.rb +50 -0
  4. data/app/models/abstract_validations.rb +324 -0
  5. data/app/models/address.rb +70 -0
  6. data/app/models/address_type.rb +15 -0
  7. data/app/models/addressing.rb +147 -0
  8. data/app/models/aliquot.rb +44 -0
  9. data/app/models/aliquot_sample_format.rb +13 -0
  10. data/app/models/analysis.rb +14 -0
  11. data/app/models/bc_request.rb +20 -0
  12. data/app/models/candidate_control.rb +101 -0
  13. data/app/models/context.rb +23 -0
  14. data/app/models/context_data_source.rb +4 -0
  15. data/app/models/county.rb +16 -0
  16. data/app/models/data_source.rb +24 -0
  17. data/app/models/diagnosis.rb +23 -0
  18. data/app/models/document_type.rb +16 -0
  19. data/app/models/document_version.rb +27 -0
  20. data/app/models/enrollment.rb +78 -0
  21. data/app/models/enrollment_validations.rb +167 -0
  22. data/app/models/follow_up.rb +16 -0
  23. data/app/models/follow_up_type.rb +18 -0
  24. data/app/models/gift_card.rb +22 -0
  25. data/app/models/gift_card_search.rb +137 -0
  26. data/app/models/home_exposure_response.rb +24 -0
  27. data/app/models/homex_outcome.rb +75 -0
  28. data/app/models/hospital.rb +22 -0
  29. data/app/models/icf_master_id.rb +30 -0
  30. data/app/models/icf_master_tracker.rb +217 -0
  31. data/app/models/icf_master_tracker_change.rb +9 -0
  32. data/app/models/icf_master_tracker_update.rb +50 -0
  33. data/app/models/ineligible_reason.rb +26 -0
  34. data/app/models/instrument.rb +26 -0
  35. data/app/models/instrument_type.rb +17 -0
  36. data/app/models/instrument_version.rb +28 -0
  37. data/app/models/interview.rb +122 -0
  38. data/app/models/interview_method.rb +17 -0
  39. data/app/models/interview_outcome.rb +16 -0
  40. data/app/models/language.rb +28 -0
  41. data/app/models/live_birth_data_update.rb +142 -0
  42. data/app/models/operational_event.rb +99 -0
  43. data/app/models/operational_event_type.rb +31 -0
  44. data/app/models/organization.rb +28 -0
  45. data/app/models/patient.rb +63 -0
  46. data/app/models/patient_validations.rb +118 -0
  47. data/app/models/person.rb +28 -0
  48. data/app/models/phone_number.rb +105 -0
  49. data/app/models/phone_type.rb +15 -0
  50. data/app/models/project.rb +39 -0
  51. data/app/models/project_outcome.rb +19 -0
  52. data/app/models/race.rb +31 -0
  53. data/app/models/refusal_reason.rb +23 -0
  54. data/app/models/sample.rb +168 -0
  55. data/app/models/sample_kit.rb +14 -0
  56. data/app/models/sample_outcome.rb +16 -0
  57. data/app/models/sample_temperature.rb +14 -0
  58. data/app/models/sample_type.rb +37 -0
  59. data/app/models/search.rb +195 -0
  60. data/app/models/section.rb +18 -0
  61. data/app/models/state.rb +25 -0
  62. data/app/models/study_subject.rb +237 -0
  63. data/app/models/study_subject_abstracts.rb +47 -0
  64. data/app/models/study_subject_addresses.rb +34 -0
  65. data/app/models/study_subject_associations.rb +38 -0
  66. data/app/models/study_subject_duplicates.rb +111 -0
  67. data/app/models/study_subject_enrollments.rb +17 -0
  68. data/app/models/study_subject_homex_outcome.rb +22 -0
  69. data/app/models/study_subject_identifier.rb +153 -0
  70. data/app/models/study_subject_interviews.rb +25 -0
  71. data/app/models/study_subject_languages.rb +21 -0
  72. data/app/models/study_subject_operational_events.rb +66 -0
  73. data/app/models/study_subject_patient.rb +177 -0
  74. data/app/models/study_subject_pii.rb +74 -0
  75. data/app/models/study_subject_races.rb +25 -0
  76. data/app/models/study_subject_search.rb +260 -0
  77. data/app/models/study_subject_validations.rb +116 -0
  78. data/app/models/subject_language.rb +11 -0
  79. data/app/models/subject_race.rb +11 -0
  80. data/app/models/subject_relationship.rb +21 -0
  81. data/app/models/subject_type.rb +22 -0
  82. data/app/models/tracing_status.rb +20 -0
  83. data/app/models/transfer.rb +40 -0
  84. data/app/models/unit.rb +14 -0
  85. data/app/models/vital_status.rb +19 -0
  86. data/app/models/zip_code.rb +36 -0
  87. data/config/abstract_fields.yml +1038 -0
  88. data/config/abstract_sections.yml +77 -0
  89. data/config/home_exposure_response_fields.yml +583 -0
  90. data/config/icf_master_tracker_update.yml +56 -0
  91. data/config/live_birth_data_update.yml +56 -0
  92. data/config/shared_use_db.yml +4 -0
  93. data/generators/ccls_engine/USAGE +2 -0
  94. data/generators/ccls_engine/ccls_engine_generator.rb +123 -0
  95. data/generators/ccls_engine/templates/autotest_ccls_engine.rb +3 -0
  96. data/generators/ccls_engine/templates/ccls_engine.rake +12 -0
  97. data/generators/ccls_engine/templates/fixtures/address_types.yml +30 -0
  98. data/generators/ccls_engine/templates/fixtures/context_data_sources.yml +54 -0
  99. data/generators/ccls_engine/templates/fixtures/contexts.yml +19 -0
  100. data/generators/ccls_engine/templates/fixtures/data_sources.yml +40 -0
  101. data/generators/ccls_engine/templates/fixtures/diagnoses.yml +40 -0
  102. data/generators/ccls_engine/templates/fixtures/document_types.yml +65 -0
  103. data/generators/ccls_engine/templates/fixtures/document_versions.csv +155 -0
  104. data/generators/ccls_engine/templates/fixtures/follow_up_types.yml +16 -0
  105. data/generators/ccls_engine/templates/fixtures/hospitals.yml +114 -0
  106. data/generators/ccls_engine/templates/fixtures/ineligible_reasons.yml +35 -0
  107. data/generators/ccls_engine/templates/fixtures/instrument_types.yml +26 -0
  108. data/generators/ccls_engine/templates/fixtures/instrument_versions.yml +22 -0
  109. data/generators/ccls_engine/templates/fixtures/instruments.yml +22 -0
  110. data/generators/ccls_engine/templates/fixtures/interview_methods.yml +30 -0
  111. data/generators/ccls_engine/templates/fixtures/interview_outcomes.yml +31 -0
  112. data/generators/ccls_engine/templates/fixtures/languages.yml +34 -0
  113. data/generators/ccls_engine/templates/fixtures/operational_event_types.yml +141 -0
  114. data/generators/ccls_engine/templates/fixtures/organizations.yml +198 -0
  115. data/generators/ccls_engine/templates/fixtures/people.yml +130 -0
  116. data/generators/ccls_engine/templates/fixtures/phone_types.yml +30 -0
  117. data/generators/ccls_engine/templates/fixtures/project_outcomes.yml +25 -0
  118. data/generators/ccls_engine/templates/fixtures/projects.yml +59 -0
  119. data/generators/ccls_engine/templates/fixtures/races.yml +52 -0
  120. data/generators/ccls_engine/templates/fixtures/refusal_reasons.yml +55 -0
  121. data/generators/ccls_engine/templates/fixtures/sample_outcomes.yml +36 -0
  122. data/generators/ccls_engine/templates/fixtures/sample_temperatures.yml +16 -0
  123. data/generators/ccls_engine/templates/fixtures/sample_types.yml +147 -0
  124. data/generators/ccls_engine/templates/fixtures/sections.yml +31 -0
  125. data/generators/ccls_engine/templates/fixtures/states.yml +363 -0
  126. data/generators/ccls_engine/templates/fixtures/subject_relationships.yml +46 -0
  127. data/generators/ccls_engine/templates/fixtures/subject_types.yml +30 -0
  128. data/generators/ccls_engine/templates/fixtures/tracing_statuses.yml +30 -0
  129. data/generators/ccls_engine/templates/fixtures/units.yml +13 -0
  130. data/generators/ccls_engine/templates/fixtures/vital_statuses.yml +28 -0
  131. data/generators/ccls_engine/templates/functional/roles_controller_test.rb +142 -0
  132. data/generators/ccls_engine/templates/functional/sessions_controller_test.rb +19 -0
  133. data/generators/ccls_engine/templates/functional/users_controller_test.rb +94 -0
  134. data/generators/ccls_engine/templates/images/sort_down.png +0 -0
  135. data/generators/ccls_engine/templates/images/sort_up.png +0 -0
  136. data/generators/ccls_engine/templates/initializer.rb +28 -0
  137. data/generators/ccls_engine/templates/javascripts/ccls_engine.js +24 -0
  138. data/generators/ccls_engine/templates/javascripts/jquery-ui.js +763 -0
  139. data/generators/ccls_engine/templates/javascripts/jquery.js +154 -0
  140. data/generators/ccls_engine/templates/javascripts/jrails.js +1 -0
  141. data/generators/ccls_engine/templates/migrations/create_user_invitations.rb +18 -0
  142. data/generators/ccls_engine/templates/migrations/create_users.rb +33 -0
  143. data/generators/ccls_engine/templates/migrations/drop_user_invitations.rb +18 -0
  144. data/generators/ccls_engine/templates/stylesheets/ccls_engine.css +180 -0
  145. data/generators/ccls_engine/templates/stylesheets/user.css +35 -0
  146. data/generators/ccls_engine/templates/stylesheets/users.css +23 -0
  147. data/generators/ccls_engine/templates/unit/core_extension_test.rb +18 -0
  148. data/generators/ccls_engine/templates/unit/role_test.rb +30 -0
  149. data/generators/ccls_engine/templates/unit/user_test.rb +321 -0
  150. data/lib/ccls-ccls_engine.rb +1 -0
  151. data/lib/ccls_engine.rb +135 -0
  152. data/lib/ccls_engine/action_view_extension.rb +3 -0
  153. data/lib/ccls_engine/action_view_extension/base.rb +53 -0
  154. data/lib/ccls_engine/action_view_extension/form_builder.rb +39 -0
  155. data/lib/ccls_engine/active_record_extension.rb +2 -0
  156. data/lib/ccls_engine/active_record_extension/base.rb +70 -0
  157. data/lib/ccls_engine/active_record_shared.rb +8 -0
  158. data/lib/ccls_engine/assertions.rb +69 -0
  159. data/lib/ccls_engine/autotest.rb +54 -0
  160. data/lib/ccls_engine/ccls_user.rb +117 -0
  161. data/lib/ccls_engine/core_extension.rb +14 -0
  162. data/lib/ccls_engine/date_and_time_formats.rb +30 -0
  163. data/lib/ccls_engine/factories.rb +880 -0
  164. data/lib/ccls_engine/factory_test_helper.rb +276 -0
  165. data/lib/ccls_engine/helper.rb +112 -0
  166. data/lib/ccls_engine/icf_master_tracker_update_test_helper.rb +121 -0
  167. data/lib/ccls_engine/live_birth_data_update_test_helper.rb +110 -0
  168. data/lib/ccls_engine/package_test_helper.rb +49 -0
  169. data/lib/ccls_engine/shared_database.rb +20 -0
  170. data/lib/ccls_engine/tasks.rb +1 -0
  171. data/lib/ccls_engine/test_tasks.rb +52 -0
  172. data/lib/ccls_engine/translation_table.rb +86 -0
  173. data/lib/shared_migration.rb +5 -0
  174. data/lib/surveyor/survey_extensions.rb +125 -0
  175. data/lib/tasks/application.rake +286 -0
  176. data/lib/tasks/calnet_authenticated.rake +6 -0
  177. data/lib/tasks/common_lib.rake +7 -0
  178. data/lib/tasks/database.rake +288 -0
  179. data/lib/tasks/documentation.rake +71 -0
  180. data/lib/tasks/homex_import.rake +723 -0
  181. data/lib/tasks/odms_import.rake +1116 -0
  182. data/lib/tasks/simply_authorized.rake +6 -0
  183. data/lib/tasks/ucb_ccls_engine_tasks.rake +4 -0
  184. data/lib/tasks/use_db.rake +4 -0
  185. data/rails/init.rb +4 -0
  186. data/test/unit/ccls/abstract_search_test.rb +150 -0
  187. data/test/unit/ccls/abstract_test.rb +674 -0
  188. data/test/unit/ccls/address_test.rb +155 -0
  189. data/test/unit/ccls/address_type_test.rb +25 -0
  190. data/test/unit/ccls/addressing_test.rb +466 -0
  191. data/test/unit/ccls/aliquot_sample_format_test.rb +20 -0
  192. data/test/unit/ccls/aliquot_test.rb +156 -0
  193. data/test/unit/ccls/analysis_test.rb +31 -0
  194. data/test/unit/ccls/bc_request_test.rb +43 -0
  195. data/test/unit/ccls/candidate_control_test.rb +712 -0
  196. data/test/unit/ccls/context_data_source_test.rb +26 -0
  197. data/test/unit/ccls/context_test.rb +40 -0
  198. data/test/unit/ccls/core_extension_test.rb +17 -0
  199. data/test/unit/ccls/county_test.rb +34 -0
  200. data/test/unit/ccls/data_source_test.rb +41 -0
  201. data/test/unit/ccls/diagnosis_test.rb +51 -0
  202. data/test/unit/ccls/document_type_test.rb +35 -0
  203. data/test/unit/ccls/document_version_test.rb +68 -0
  204. data/test/unit/ccls/enrollment_test.rb +575 -0
  205. data/test/unit/ccls/follow_up_test.rb +23 -0
  206. data/test/unit/ccls/follow_up_type_test.rb +34 -0
  207. data/test/unit/ccls/gift_card_search_test.rb +153 -0
  208. data/test/unit/ccls/gift_card_test.rb +40 -0
  209. data/test/unit/ccls/home_exposure_response_test.rb +83 -0
  210. data/test/unit/ccls/homex_outcome_test.rb +199 -0
  211. data/test/unit/ccls/hospital_test.rb +102 -0
  212. data/test/unit/ccls/icf_master_id_test.rb +30 -0
  213. data/test/unit/ccls/icf_master_tracker_change_test.rb +14 -0
  214. data/test/unit/ccls/icf_master_tracker_test.rb +132 -0
  215. data/test/unit/ccls/icf_master_tracker_update_test.rb +176 -0
  216. data/test/unit/ccls/ineligible_reason_test.rb +48 -0
  217. data/test/unit/ccls/instrument_test.rb +62 -0
  218. data/test/unit/ccls/instrument_type_test.rb +39 -0
  219. data/test/unit/ccls/instrument_version_test.rb +71 -0
  220. data/test/unit/ccls/interview_method_test.rb +44 -0
  221. data/test/unit/ccls/interview_outcome_test.rb +34 -0
  222. data/test/unit/ccls/interview_test.rb +298 -0
  223. data/test/unit/ccls/language_test.rb +47 -0
  224. data/test/unit/ccls/live_birth_data_update_test.rb +358 -0
  225. data/test/unit/ccls/operational_event_test.rb +187 -0
  226. data/test/unit/ccls/operational_event_type_test.rb +51 -0
  227. data/test/unit/ccls/organization_test.rb +64 -0
  228. data/test/unit/ccls/patient_test.rb +538 -0
  229. data/test/unit/ccls/person_test.rb +55 -0
  230. data/test/unit/ccls/phone_number_test.rb +244 -0
  231. data/test/unit/ccls/phone_type_test.rb +32 -0
  232. data/test/unit/ccls/project_outcome_test.rb +34 -0
  233. data/test/unit/ccls/project_test.rb +60 -0
  234. data/test/unit/ccls/race_test.rb +37 -0
  235. data/test/unit/ccls/refusal_reason_test.rb +52 -0
  236. data/test/unit/ccls/role_test.rb +26 -0
  237. data/test/unit/ccls/sample_kit_test.rb +35 -0
  238. data/test/unit/ccls/sample_outcome_test.rb +34 -0
  239. data/test/unit/ccls/sample_temperature_test.rb +25 -0
  240. data/test/unit/ccls/sample_test.rb +363 -0
  241. data/test/unit/ccls/sample_type_test.rb +58 -0
  242. data/test/unit/ccls/section_test.rb +34 -0
  243. data/test/unit/ccls/state_test.rb +31 -0
  244. data/test/unit/ccls/study_subject_abstracts_test.rb +115 -0
  245. data/test/unit/ccls/study_subject_addresses_test.rb +93 -0
  246. data/test/unit/ccls/study_subject_duplicates_test.rb +407 -0
  247. data/test/unit/ccls/study_subject_enrollments_test.rb +65 -0
  248. data/test/unit/ccls/study_subject_homex_outcome_test.rb +64 -0
  249. data/test/unit/ccls/study_subject_identifier_test.rb +439 -0
  250. data/test/unit/ccls/study_subject_interviews_test.rb +26 -0
  251. data/test/unit/ccls/study_subject_languages_test.rb +142 -0
  252. data/test/unit/ccls/study_subject_operational_events_test.rb +53 -0
  253. data/test/unit/ccls/study_subject_patient_test.rb +249 -0
  254. data/test/unit/ccls/study_subject_pii_test.rb +278 -0
  255. data/test/unit/ccls/study_subject_races_test.rb +203 -0
  256. data/test/unit/ccls/study_subject_search_test.rb +704 -0
  257. data/test/unit/ccls/study_subject_test.rb +770 -0
  258. data/test/unit/ccls/subject_language_test.rb +43 -0
  259. data/test/unit/ccls/subject_race_test.rb +35 -0
  260. data/test/unit/ccls/subject_relationship_test.rb +43 -0
  261. data/test/unit/ccls/subject_type_test.rb +40 -0
  262. data/test/unit/ccls/tracing_status_test.rb +32 -0
  263. data/test/unit/ccls/transfer_test.rb +81 -0
  264. data/test/unit/ccls/translation_table_test.rb +40 -0
  265. data/test/unit/ccls/unit_test.rb +21 -0
  266. data/test/unit/ccls/user_test.rb +156 -0
  267. data/test/unit/ccls/vital_status_test.rb +36 -0
  268. data/test/unit/ccls/zip_code_test.rb +55 -0
  269. 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