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,47 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::LanguageTest < 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, :instrument_versions )
10
+ assert_should_require_attributes( :code )
11
+ assert_should_require_unique_attributes( :code )
12
+ assert_should_not_require_attributes( :position )
13
+
14
+ test "explicit Factory language test" do
15
+ assert_difference('Language.count',1) {
16
+ language = Factory(:language)
17
+ assert_match /Key\d*/, language.key
18
+ assert_match /Code\d*/, language.code
19
+ assert_match /Desc\d*/, language.description
20
+ }
21
+ end
22
+
23
+ test "should return description as to_s" do
24
+ language = create_language
25
+ assert_equal language.description, "#{language}"
26
+ end
27
+
28
+ test "should find random" do
29
+ language = Language.random()
30
+ assert language.is_a?(Language)
31
+ end
32
+
33
+ test "should return nil on random when no records" do
34
+ Language.stubs(:count).returns(0)
35
+ language = Language.random()
36
+ assert_nil language
37
+ end
38
+
39
+ #protected
40
+ #
41
+ # def create_language(options={})
42
+ # language = Factory.build(:language,options)
43
+ # language.save
44
+ # language
45
+ # end
46
+
47
+ end
@@ -0,0 +1,358 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::LiveBirthDataUpdateTest < ActiveSupport::TestCase
4
+ include Ccls::LiveBirthDataUpdateTestHelper
5
+
6
+ setup :turn_off_paperclip_logging
7
+
8
+ assert_should_create_default_object
9
+
10
+ # These are String tests and these tests and this method should
11
+ # be moved into StringExtension
12
+
13
+ test "should split persons name into 3 names without middle name" do
14
+ names = "John Smith".split_name
15
+ assert_equal 3, names.length
16
+ assert_equal ['John','','Smith'], names
17
+ end
18
+
19
+ test "should split persons name into 3 names with middle name" do
20
+ names = "John Herbert Smith".split_name
21
+ assert_equal 3, names.length
22
+ assert_equal ['John','Herbert','Smith'], names
23
+ end
24
+
25
+ test "should split persons name into 3 names with 2 middle names" do
26
+ names = "John Herbert Walker Smith".split_name
27
+ assert_equal 3, names.length
28
+ assert_equal ['John','Herbert Walker','Smith'], names
29
+ end
30
+
31
+ test "should split persons name into 3 names with middle initial" do
32
+ names = "John H. Smith".split_name
33
+ assert_equal 3, names.length
34
+ assert_equal ['John','H.','Smith'], names
35
+ end
36
+
37
+ test "should split persons name into 3 names even with \\240 codes" do
38
+ names = "John\240Herbert\240Smith".split_name
39
+ assert_equal 3, names.length
40
+ assert_equal ["John","Herbert","Smith"], names
41
+ end
42
+
43
+ test "should split persons name into 3 names even with apostrophe" do
44
+ names = "John Herbert O'Grady".split_name
45
+ assert_equal 3, names.length
46
+ assert_equal ["John","Herbert","O'Grady"], names
47
+ end
48
+
49
+ # TODO test for name with period like Mary Elizabeth St. James
50
+ # TODO test for name with 2 last names
51
+ # TODO test for name with 2 first names
52
+
53
+
54
+
55
+
56
+ test "should create without attached csv_file" do
57
+ assert_difference('LiveBirthDataUpdate.count',1) {
58
+ @object = Factory(:live_birth_data_update)
59
+ }
60
+ assert_nil @object.csv_file_file_name
61
+ assert_nil @object.csv_file_content_type
62
+ assert_nil @object.csv_file_file_size
63
+ assert_nil @object.csv_file_updated_at
64
+ end
65
+
66
+ test "should create with attached csv_file" do
67
+ assert_difference('LiveBirthDataUpdate.count',1) {
68
+ @object = create_test_file_and_live_birth_data_update
69
+ }
70
+ assert_not_nil @object.csv_file_file_name
71
+ assert_equal @object.csv_file_file_name, csv_test_file_name
72
+ assert_not_nil @object.csv_file_content_type
73
+ assert_not_nil @object.csv_file_file_size
74
+ assert_not_nil @object.csv_file_updated_at
75
+ cleanup_live_birth_data_update_and_test_file(@object)
76
+ end
77
+
78
+ test "should convert nil attached csv_file to candidate controls" do
79
+ live_birth_data_update = Factory(:live_birth_data_update)
80
+ assert_nil live_birth_data_update.csv_file_file_name
81
+ assert_difference('CandidateControl.count',0) {
82
+ results = live_birth_data_update.to_candidate_controls
83
+ assert_equal [], results
84
+ }
85
+ end
86
+
87
+ test "should convert non-existant attached csv_file to candidate controls" do
88
+ live_birth_data_update = create_test_file_and_live_birth_data_update
89
+ assert File.exists?(live_birth_data_update.csv_file.path)
90
+ File.delete(live_birth_data_update.csv_file.path)
91
+ assert !File.exists?(live_birth_data_update.csv_file.path)
92
+ assert_difference('CandidateControl.count',0) {
93
+ results = live_birth_data_update.to_candidate_controls
94
+ assert_equal [], results
95
+ }
96
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
97
+ end
98
+
99
+ test "should convert attached csv_file to candidate controls with matching case" do
100
+ create_case_for_live_birth_data_update
101
+ live_birth_data_update = create_test_file_and_live_birth_data_update
102
+ assert_difference('CandidateControl.count',1) {
103
+ results = live_birth_data_update.to_candidate_controls
104
+ assert_equal 2, results.length
105
+ assert results[0].is_a?(StudySubject)
106
+ assert results[0].is_case?
107
+ assert results[1].is_a?(CandidateControl)
108
+ }
109
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
110
+ end
111
+
112
+ test "should convert attached csv_file to candidate controls with missing case" do
113
+ live_birth_data_update = create_test_file_and_live_birth_data_update
114
+ assert_difference('CandidateControl.count',0) {
115
+ results = live_birth_data_update.to_candidate_controls
116
+ assert_equal results,
117
+ ["Could not find study_subject with masterid 1234FAKE",
118
+ "Could not find study_subject with masterid 1234FAKE"]
119
+ }
120
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
121
+ end
122
+
123
+ test "should convert attached csv_file to candidate controls with existing candidate control" do
124
+ create_case_for_live_birth_data_update
125
+ live_birth_data_update = create_test_file_and_live_birth_data_update
126
+ results = nil
127
+ assert_difference('CandidateControl.count',1) {
128
+ results = live_birth_data_update.to_candidate_controls
129
+ assert_equal 2, results.length
130
+ assert results[0].is_a?(StudySubject)
131
+ assert results[0].is_case?
132
+ assert results[1].is_a?(CandidateControl)
133
+ }
134
+ assert_difference('CandidateControl.count',0) {
135
+ new_results = live_birth_data_update.to_candidate_controls
136
+ assert_equal 2, new_results.length
137
+ assert new_results[0].is_a?(StudySubject)
138
+ assert new_results[0].is_case?
139
+ assert new_results[1].is_a?(CandidateControl)
140
+ assert_equal results, new_results
141
+ }
142
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
143
+ end
144
+
145
+ test "should convert attached csv_file to candidate controls with blank child_full_name" do
146
+ create_case_for_live_birth_data_update
147
+ live_birth_data_update = create_test_file_and_live_birth_data_update(:child_full_name => '')
148
+ results = nil
149
+ assert_difference('CandidateControl.count',0) {
150
+ results = live_birth_data_update.to_candidate_controls
151
+ assert_equal 2, results.length
152
+ assert results[0].is_a?(StudySubject)
153
+ assert results[0].is_case?
154
+ assert results[1].is_a?(CandidateControl)
155
+ assert results[1].errors.on_attr_and_type?(:first_name, :blank)
156
+ assert results[1].errors.on_attr_and_type?(:last_name, :blank)
157
+ }
158
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
159
+ end
160
+
161
+ test "should convert attached csv_file to candidate controls with blank child_dobm" do
162
+ create_case_for_live_birth_data_update
163
+ live_birth_data_update = create_test_file_and_live_birth_data_update(:child_dobm => '')
164
+ results = nil
165
+ assert_difference('CandidateControl.count',0) {
166
+ results = live_birth_data_update.to_candidate_controls
167
+ assert_equal 2, results.length
168
+ assert results[0].is_a?(StudySubject)
169
+ assert results[0].is_case?
170
+ assert results[1].is_a?(CandidateControl)
171
+ assert results[1].errors.on_attr_and_type?(:dob, :blank)
172
+ }
173
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
174
+ end
175
+
176
+ test "should convert attached csv_file to candidate controls with blank child_dobd" do
177
+ create_case_for_live_birth_data_update
178
+ live_birth_data_update = create_test_file_and_live_birth_data_update(:child_dobd => '')
179
+ results = nil
180
+ assert_difference('CandidateControl.count',0) {
181
+ results = live_birth_data_update.to_candidate_controls
182
+ assert_equal 2, results.length
183
+ assert results[0].is_a?(StudySubject)
184
+ assert results[0].is_case?
185
+ assert results[1].is_a?(CandidateControl)
186
+ assert results[1].errors.on_attr_and_type?(:dob, :blank)
187
+ }
188
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
189
+ end
190
+
191
+ test "should convert attached csv_file to candidate controls with blank child_doby" do
192
+ create_case_for_live_birth_data_update
193
+ live_birth_data_update = create_test_file_and_live_birth_data_update(:child_doby => '')
194
+ results = nil
195
+ assert_difference('CandidateControl.count',0) {
196
+ results = live_birth_data_update.to_candidate_controls
197
+ assert_equal 2, results.length
198
+ assert results[0].is_a?(StudySubject)
199
+ assert results[0].is_case?
200
+ assert results[1].is_a?(CandidateControl)
201
+ assert results[1].errors.on_attr_and_type?(:dob, :blank)
202
+ }
203
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
204
+ end
205
+
206
+ test "should convert attached csv_file to candidate controls with blank child_gender" do
207
+ create_case_for_live_birth_data_update
208
+ live_birth_data_update = create_test_file_and_live_birth_data_update(:child_gender => '')
209
+ results = nil
210
+ assert_difference('CandidateControl.count',0) {
211
+ results = live_birth_data_update.to_candidate_controls
212
+ assert_equal 2, results.length
213
+ assert results[0].is_a?(StudySubject)
214
+ assert results[0].is_case?
215
+ assert results[1].is_a?(CandidateControl)
216
+ assert results[1].errors.on_attr_and_type?(:sex, :inclusion)
217
+ }
218
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
219
+ end
220
+
221
+ # TODO CandidateControl has the following potential validation failures.
222
+ # What to do for these?
223
+ # Force them with default values?
224
+ #
225
+ # validates_presence_of :first_name
226
+ # validates_presence_of :last_name
227
+ # validates_presence_of :dob
228
+ # validates_length_of :related_patid, :is => 4, :allow_blank => true
229
+ # validates_inclusion_of :sex, :in => %w( M F DK )
230
+
231
+
232
+ test "should copy attributes when csv_file converted to candidate control" do
233
+ study_subject = create_case_for_live_birth_data_update
234
+ live_birth_data_update = create_test_file_and_live_birth_data_update
235
+ assert_difference('CandidateControl.count',1) {
236
+ results = live_birth_data_update.to_candidate_controls
237
+ assert_equal 2, results.length
238
+ candidate_control = results.last
239
+ assert_equal candidate_control.related_patid, study_subject.patid
240
+ assert_equal candidate_control.mom_is_biomom, control[:biomom]
241
+ assert_equal candidate_control.dad_is_biodad, control[:biodad]
242
+ #control[:date]},#{
243
+ assert_equal candidate_control.mother_full_name, control[:mother_full_name]
244
+ assert_equal candidate_control.mother_maiden_name, control[:mother_maiden_name]
245
+ #control[:father_full_name]},#{
246
+ assert_equal candidate_control.full_name, control[:child_full_name]
247
+ assert_equal candidate_control.dob,
248
+ Date.new(control[:child_doby], control[:child_dobm], control[:child_dobd])
249
+ # Date.new(control[:child_doby].to_i, control[:child_dobm].to_i, control[:child_dobd].to_i)
250
+ assert_equal candidate_control.sex, control[:child_gender]
251
+ #control[:birthplace_country]},#{
252
+ #control[:birthplace_state]},#{
253
+ #control[:birthplace_city]},#{
254
+ assert_equal candidate_control.mother_hispanicity_id, control[:mother_hispanicity]
255
+ #control[:mother_hispanicity_mex]},#{
256
+ assert_equal candidate_control.mother_race_id, control[:mother_race]
257
+ #control[:mother_race_other]},#{
258
+ assert_equal candidate_control.father_hispanicity_id, control[:father_hispanicity]
259
+ #control[:father_hispanicity_mex]},#{
260
+ assert_equal candidate_control.father_race_id, control[:father_race]
261
+ #control[:father_race_other]}} }
262
+ }
263
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
264
+ end
265
+
266
+ test "should test with real data file" do
267
+ # real data and won't be in repository
268
+ unless File.exists?('test-livebirthdata_011912.csv')
269
+ puts
270
+ puts "-- Real data test file does not exist. Skipping."
271
+ return
272
+ end
273
+
274
+ # minimal semi-real case creation
275
+ s0 = Factory(:case_study_subject,:sex => 'F',
276
+ :first_name => 'FakeFirst1',:last_name => 'FakeLast1',
277
+ :dob => Date.parse('10/16/1977'))
278
+ # s0 has no icf_master_id, so should be ignored
279
+
280
+ s1 = Factory(:case_study_subject,:sex => 'F',
281
+ :first_name => 'FakeFirst2',:last_name => 'FakeLast2',
282
+ :dob => Date.parse('9/21/1988'))
283
+ Factory(:icf_master_id,:icf_master_id => '48882638A')
284
+ s1.assign_icf_master_id
285
+
286
+ s2 = Factory(:case_study_subject,:sex => 'M',
287
+ :first_name => 'FakeFirst3',:last_name => 'FakeLast3',
288
+ :dob => Date.parse('6/1/2009'))
289
+ Factory(:icf_master_id,:icf_master_id => '16655682G')
290
+ s2.assign_icf_master_id
291
+
292
+ live_birth_data_update = Factory(:live_birth_data_update,
293
+ :csv_file => File.open('test-livebirthdata_011912.csv') )
294
+ assert_not_nil live_birth_data_update.csv_file_file_name
295
+
296
+ # 35 lines - 1 header - 3 cases = 31
297
+ assert_difference('CandidateControl.count',31){
298
+ results = live_birth_data_update.to_candidate_controls
299
+ assert results[0].is_a?(String)
300
+ assert_equal results[0],
301
+ "Could not find study_subject with masterid [no ID assigned]"
302
+ assert results[1].is_a?(StudySubject)
303
+ assert results[2].is_a?(StudySubject)
304
+ assert_equal results[1], s1
305
+ assert_equal results[2], s2
306
+ results.each { |r|
307
+ if r.is_a?(CandidateControl) and r.new_record?
308
+ puts r.inspect
309
+ puts r.errors.full_messages.to_sentence
310
+ end
311
+ }
312
+ }
313
+ live_birth_data_update.destroy
314
+ # cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
315
+ end
316
+
317
+ test "should return a StudySubject in results for case" do
318
+ study_subject = create_case_for_live_birth_data_update
319
+ File.open(csv_test_file_name,'w'){|f|
320
+ f.puts csv_file_header
321
+ f.puts csv_file_case_study_subject }
322
+ live_birth_data_update = create_live_birth_data_update_with_file
323
+ assert_difference('CandidateControl.count',0){
324
+ results = live_birth_data_update.to_candidate_controls
325
+ assert results[0].is_a?(StudySubject)
326
+ assert_equal results[0], study_subject
327
+ }
328
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
329
+ end
330
+
331
+ test "should return a CandidateControl in results for control" do
332
+ study_subject = create_case_for_live_birth_data_update
333
+ File.open(csv_test_file_name,'w'){|f|
334
+ f.puts csv_file_header
335
+ f.puts csv_file_control }
336
+ live_birth_data_update = create_live_birth_data_update_with_file
337
+ assert_difference('CandidateControl.count',1){
338
+ results = live_birth_data_update.to_candidate_controls
339
+ assert results[0].is_a?(CandidateControl)
340
+ }
341
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
342
+ end
343
+
344
+ test "should return a String in results for unknown ca_co_status" do
345
+ study_subject = create_case_for_live_birth_data_update
346
+ File.open(csv_test_file_name,'w'){|f|
347
+ f.puts csv_file_header
348
+ f.puts csv_file_unknown }
349
+ live_birth_data_update = create_live_birth_data_update_with_file
350
+ assert_difference('CandidateControl.count',0){
351
+ results = live_birth_data_update.to_candidate_controls
352
+ assert results[0].is_a?(String)
353
+ assert_equal results[0], "Unexpected ca_co_status :unknown:"
354
+ }
355
+ cleanup_live_birth_data_update_and_test_file(live_birth_data_update)
356
+ end
357
+
358
+ end
@@ -0,0 +1,187 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::OperationalEventTest < ActiveSupport::TestCase
4
+
5
+ assert_should_create_default_object
6
+ assert_should_initially_belong_to(:enrollment)
7
+ assert_should_initially_belong_to(:operational_event_type)
8
+
9
+ assert_should_require_attributes( :enrollment_id )
10
+ assert_should_not_require_attributes( :occurred_on, :description, :event_notes )
11
+
12
+ assert_requires_complete_date(:occurred_on)
13
+ assert_should_require_attribute_length( :description, :maximum => 250 )
14
+ assert_should_require_attribute_length( :event_notes, :maximum => 65000 )
15
+
16
+ test "explicit Factory operational_event test" do
17
+ assert_difference('OperationalEventType.count',1) {
18
+ assert_difference('OperationalEvent.count',1) {
19
+ operational_event = Factory(:operational_event)
20
+ assert_not_nil operational_event.operational_event_type
21
+ } }
22
+ end
23
+
24
+ test "should require operational_event_type" do
25
+ assert_difference( "OperationalEvent.count", 0 ) do
26
+ operational_event = create_operational_event( :operational_event_type => nil)
27
+ assert !operational_event.errors.on(:operational_event_type)
28
+ assert operational_event.errors.on_attr_and_type?(:operational_event_type_id,:blank)
29
+ end
30
+ end
31
+
32
+ test "should require valid operational_event_type" do
33
+ assert_difference( "OperationalEvent.count", 0 ) do
34
+ operational_event = create_operational_event( :operational_event_type_id => 0)
35
+ assert !operational_event.errors.on(:operational_event_type_id)
36
+ assert operational_event.errors.on_attr_and_type?(:operational_event_type,:blank)
37
+ end
38
+ end
39
+
40
+ # description is not required so ...
41
+ test "should return description as to_s if not nil" do
42
+ operational_event = create_operational_event(:description => 'testing')
43
+ assert_equal operational_event.description, "#{operational_event}"
44
+ end
45
+
46
+ # test "should return NOT description as to_s if nil" do
47
+ # operational_event = create_operational_event
48
+ # assert_not_equal operational_event.description, "#{operational_event}"
49
+ # end
50
+
51
+ test "should order by type ASC" do
52
+ oes = create_oet_operational_events
53
+ events = OperationalEvent.search(:order => 'type',:dir => 'asc')
54
+ assert_equal events, [oes[1],oes[0],oes[2]]
55
+ end
56
+
57
+ test "should order by type DESC" do
58
+ oes = create_oet_operational_events
59
+ events = OperationalEvent.search(:order => 'type',:dir => 'desc')
60
+ assert_equal events, [oes[2],oes[0],oes[1]]
61
+ end
62
+
63
+ test "should order by type and DESC as default dir" do
64
+ oes = create_oet_operational_events
65
+ events = OperationalEvent.search(:order => 'type')
66
+ assert_equal events, [oes[2],oes[0],oes[1]]
67
+ end
68
+
69
+ test "should order by description ASC" do
70
+ oes = create_description_operational_events
71
+ events = OperationalEvent.search(:order => 'description',:dir => 'asc')
72
+ assert_equal events, [oes[1],oes[0],oes[2]]
73
+ end
74
+
75
+ test "should order by description DESC" do
76
+ oes = create_description_operational_events
77
+ events = OperationalEvent.search(:order => 'description',:dir => 'desc')
78
+ assert_equal events, [oes[2],oes[0],oes[1]]
79
+ end
80
+
81
+ test "should order by description and DESC as default dir" do
82
+ oes = create_description_operational_events
83
+ events = OperationalEvent.search(:order => 'description')
84
+ assert_equal events, [oes[2],oes[0],oes[1]]
85
+ end
86
+
87
+ test "should order by occurred_on ASC" do
88
+ oes = create_occurred_on_operational_events
89
+ events = OperationalEvent.search(:order => 'occurred_on',:dir => 'asc')
90
+ assert_equal events, [oes[1],oes[0],oes[2]]
91
+ end
92
+
93
+ test "should order by occurred_on DESC" do
94
+ oes = create_occurred_on_operational_events
95
+ events = OperationalEvent.search(:order => 'occurred_on',:dir => 'desc')
96
+ assert_equal events, [oes[2],oes[0],oes[1]]
97
+ end
98
+
99
+ test "should order by occurred_on and DESC as default dir" do
100
+ oes = create_occurred_on_operational_events
101
+ events = OperationalEvent.search(:order => 'occurred_on')
102
+ assert_equal events, [oes[2],oes[0],oes[1]]
103
+ end
104
+
105
+ test "should order by occurred_on DESC as defaults" do
106
+ oes = create_occurred_on_operational_events
107
+ events = OperationalEvent.search()
108
+ assert_equal events, [oes[2],oes[0],oes[1]]
109
+ end
110
+
111
+ test "should ignore invalid order" do
112
+ oes = create_occurred_on_operational_events
113
+ events = OperationalEvent.search(:order => 'iambogus')
114
+ assert_equal events, [oes[2],oes[0],oes[1]]
115
+ end
116
+
117
+ test "should ignore invalid dir" do
118
+ oes = create_occurred_on_operational_events
119
+ events = OperationalEvent.search(:order => 'occurred_on',
120
+ :dir => 'iambogus')
121
+ assert_equal events, [oes[2],oes[0],oes[1]]
122
+ end
123
+
124
+ test "should ignore valid dir without order" do
125
+ oes = create_occurred_on_operational_events
126
+ events = OperationalEvent.search(:dir => 'ASC')
127
+ assert_equal events, [oes[2],oes[0],oes[1]]
128
+ end
129
+
130
+ test "should copy operational event type description on create" do
131
+ operational_event = create_operational_event
132
+ assert_equal operational_event.reload.description,
133
+ operational_event.operational_event_type.description
134
+ end
135
+
136
+ test "should only include operational events for study_subject" do
137
+ enrollment = Factory(:enrollment)
138
+ operational_event_1 = create_operational_event
139
+ operational_event_2 = create_operational_event(
140
+ :enrollment => enrollment )
141
+ events = OperationalEvent.search(:study_subject_id => enrollment.study_subject.id)
142
+ # enrollment creates subject with auto-created ccls enrollment
143
+ assert_equal 2, events.length
144
+ assert events.include? operational_event_2
145
+ end
146
+
147
+ protected
148
+
149
+ # def create_operational_event(options={})
150
+ # operational_event = Factory.build(:operational_event,options)
151
+ # operational_event.save
152
+ # operational_event
153
+ # end
154
+
155
+ def create_operational_events(*args)
156
+ args.collect{|options| create_operational_event(options) }
157
+ end
158
+
159
+ def create_occurred_on_operational_events
160
+ today = Date.today
161
+ create_operational_events(
162
+ { :occurred_on => ( today - 1.month ) },
163
+ { :occurred_on => ( today - 1.year ) },
164
+ { :occurred_on => ( today - 1.week ) }
165
+ )
166
+ end
167
+
168
+ def create_description_operational_events
169
+ create_operational_events(
170
+ { :description => 'M' },
171
+ { :description => 'A' },
172
+ { :description => 'Z' }
173
+ )
174
+ end
175
+
176
+ def create_oet_operational_events
177
+ create_operational_events(
178
+ { :operational_event_type => Factory(
179
+ :operational_event_type,:description => 'MMMM') },
180
+ { :operational_event_type => Factory(
181
+ :operational_event_type,:description => 'AAAA') },
182
+ { :operational_event_type => Factory(
183
+ :operational_event_type,:description => 'ZZZZ') }
184
+ )
185
+ end
186
+
187
+ end