ccls-ccls_engine 3.11.0

Sign up to get free protection for your applications and to get access to all the features.
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