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,65 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::StudySubjectEnrollmentsTest < ActiveSupport::TestCase
4
+
5
+ test "should create study_subject and accept_nested_attributes_for enrollments" do
6
+ assert_difference( 'Enrollment.count', 2) { # ccls enrollment is auto-created, so 2
7
+ assert_difference( "StudySubject.count", 1 ) {
8
+ study_subject = create_study_subject(
9
+ :enrollments_attributes => [Factory.attributes_for(:enrollment,
10
+ :project_id => Project['non-specific'].id)])
11
+ assert !study_subject.new_record?,
12
+ "#{study_subject.errors.full_messages.to_sentence}"
13
+ } }
14
+ end
15
+
16
+ test "should NOT destroy enrollments with study_subject" do
17
+ assert_difference('StudySubject.count',1) {
18
+ assert_difference('Enrollment.count',2) { # due to the callback creation of ccls enrollment
19
+ @study_subject = Factory(:enrollment).study_subject
20
+ } }
21
+ assert_difference('StudySubject.count',-1) {
22
+ assert_difference('Enrollment.count',0) {
23
+ @study_subject.destroy
24
+ } }
25
+ end
26
+
27
+ test "should return nil hx_enrollment if not enrolled" do
28
+ study_subject = create_study_subject
29
+ assert_nil study_subject.enrollments.find_by_project_id(
30
+ Project['HomeExposures'].id)
31
+ end
32
+
33
+ test "should return valid hx_enrollment if enrolled" do
34
+ study_subject = create_study_subject
35
+ hxe = Factory(:enrollment,
36
+ :study_subject => study_subject,
37
+ :project => Project['HomeExposures']
38
+ )
39
+ assert_not_nil study_subject.enrollments.find_by_project_id(
40
+ Project['HomeExposures'].id)
41
+ end
42
+
43
+ test "should create ccls project enrollment on creation" do
44
+ study_subject = nil
45
+ assert_difference('Project.count',0) { # make sure it didn't create id
46
+ assert_difference('Enrollment.count',1) {
47
+ assert_difference('StudySubject.count',1) {
48
+ study_subject = create_study_subject
49
+ } } }
50
+ assert_not_nil study_subject.enrollments.find_by_project_id(Project['ccls'].id)
51
+ end
52
+
53
+ test "should only create 1 ccls project enrollment on creation if given one" do
54
+ study_subject = nil
55
+ assert_difference('Project.count',0) { # make sure it didn't create id
56
+ assert_difference('Enrollment.count',1) {
57
+ assert_difference('StudySubject.count',1) {
58
+ study_subject = create_study_subject(:enrollments_attributes => [
59
+ { :project_id => Project['ccls'].id }
60
+ ])
61
+ } } }
62
+ assert_not_nil study_subject.enrollments.find_by_project_id(Project['ccls'].id)
63
+ end
64
+
65
+ end
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::StudySubjectHomexOutcomeTest < ActiveSupport::TestCase
4
+
5
+ test "should create study_subject and accept_nested_attributes_for homex_outcome" do
6
+ assert_difference( 'HomexOutcome.count', 1) {
7
+ assert_difference( "StudySubject.count", 1 ) {
8
+ study_subject = create_study_subject(
9
+ :homex_outcome_attributes => Factory.attributes_for(:homex_outcome))
10
+ assert !study_subject.new_record?,
11
+ "#{study_subject.errors.full_messages.to_sentence}"
12
+ } }
13
+ end
14
+
15
+ # StudySubject currently accepts nested attributes for homex_outcome,
16
+ # but an empty homex_outcome is no longer invalid.
17
+ test "should create study_subject with empty homex_outcome" do
18
+ assert_difference( 'HomexOutcome.count', 1) {
19
+ assert_difference( 'StudySubject.count', 1) {
20
+ study_subject = create_study_subject( :homex_outcome_attributes => {})
21
+ } }
22
+ end
23
+
24
+ test "should NOT destroy homex_outcome with study_subject" do
25
+ assert_difference('StudySubject.count',1) {
26
+ assert_difference('HomexOutcome.count',1) {
27
+ @study_subject = Factory(:study_subject)
28
+ Factory(:homex_outcome, :study_subject => @study_subject)
29
+ } }
30
+ assert_difference('StudySubject.count',-1) {
31
+ assert_difference('HomexOutcome.count',0) {
32
+ @study_subject.destroy
33
+ } }
34
+ end
35
+
36
+ # Delegated homex_outcome fields
37
+ %w( interview_outcome sample_outcome
38
+ interview_outcome_on sample_outcome_on
39
+ ).each do |method_name|
40
+
41
+ test "should respond to #{method_name}" do
42
+ study_subject = create_study_subject
43
+ assert study_subject.respond_to?(method_name)
44
+ end
45
+
46
+ end
47
+
48
+ # Delegated homex_outcome fields except ... interview_outcome, sample_outcome
49
+ %w( interview_outcome_on sample_outcome_on ).each do |method_name|
50
+
51
+ test "should return nil #{method_name} without homex_outcome" do
52
+ study_subject = create_study_subject
53
+ assert_nil study_subject.send(method_name)
54
+ end
55
+
56
+ test "should return #{method_name} with homex_outcome" do
57
+ study_subject = create_study_subject(
58
+ :homex_outcome_attributes => Factory.attributes_for(:homex_outcome))
59
+ assert_not_nil study_subject.send(method_name)
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,439 @@
1
+ require 'test_helper'
2
+
3
+ # This is just a collection of identifier related tests
4
+ # for StudySubject separated only for clarity due
5
+ # to the size of the StudySubjectTest class.
6
+ class Ccls::StudySubjectIdentifierTest < ActiveSupport::TestCase
7
+
8
+ test "studyid should be patid, case_control_type and orderno" do
9
+ StudySubject.any_instance.stubs(:get_next_patid).returns('123')
10
+ study_subject = Factory(:case_study_subject)
11
+ assert study_subject.is_case?
12
+ assert_not_nil study_subject.studyid
13
+ assert_nil study_subject.studyid_nohyphen
14
+ assert_nil study_subject.studyid_intonly_nohyphen
15
+ assert_equal "0123-C-0", study_subject.studyid
16
+ end
17
+
18
+ test "should create study subject with specified matchingid" do
19
+ # just to make sure that this method is defined
20
+ # get funny errors when accidentally comment out.
21
+ assert_difference('StudySubject.count',1) {
22
+ study_subject = create_study_subject(:matchingid => '54321')
23
+ assert_equal '054321', study_subject.matchingid
24
+ }
25
+ end
26
+
27
+ test "should not assign icf_master_id when there are none" do
28
+ study_subject = Factory(:study_subject, :icf_master_id => nil)
29
+ study_subject.assign_icf_master_id
30
+ assert_nil study_subject.icf_master_id
31
+ end
32
+
33
+ test "should not assign icf_master_id if already have one and one exists" do
34
+ study_subject = Factory(:study_subject)
35
+ assert_nil study_subject.reload.icf_master_id
36
+ imi1 = Factory(:icf_master_id,:icf_master_id => '12345678A')
37
+ study_subject.assign_icf_master_id
38
+ assert_equal imi1.icf_master_id, study_subject.reload.icf_master_id
39
+ imi2 = Factory(:icf_master_id,:icf_master_id => '12345678B')
40
+ study_subject.assign_icf_master_id
41
+ assert_equal imi1.icf_master_id, study_subject.reload.icf_master_id
42
+ end
43
+
44
+ test "should assign icf_master_id when there is one" do
45
+ study_subject = create_study_subject
46
+ imi = Factory(:icf_master_id,:icf_master_id => '12345678A')
47
+ study_subject.assign_icf_master_id
48
+ assert_not_nil study_subject.icf_master_id
49
+ assert_equal '12345678A', study_subject.icf_master_id
50
+ imi.reload
51
+ assert_not_nil imi.assigned_on
52
+ assert_equal Date.today, imi.assigned_on
53
+ assert_not_nil imi.study_subject_id
54
+ assert_equal imi.study_subject_id, study_subject.id
55
+ end
56
+
57
+ test "should assign icf_master_id to mother on creation if one exists" do
58
+ study_subject = create_study_subject
59
+ imi = Factory(:icf_master_id,:icf_master_id => '12345678A')
60
+ assert_equal '12345678A', imi.icf_master_id
61
+ mother = study_subject.create_mother
62
+ assert_not_nil mother.reload.icf_master_id
63
+ assert_equal '12345678A', mother.icf_master_id
64
+ end
65
+
66
+ test "should not assign icf_master_id to mother on creation if none exist" do
67
+ study_subject = create_study_subject
68
+ mother = study_subject.create_mother
69
+ assert_nil mother.reload.icf_master_id
70
+ end
71
+
72
+ test "should return 'no ID assigned' if study_subject has no icf_master_id" do
73
+ study_subject = create_study_subject
74
+ assert_nil study_subject.icf_master_id
75
+ assert_equal study_subject.icf_master_id_to_s, '[no ID assigned]'
76
+ end
77
+
78
+ test "should return icf_master_id if study_subject has icf_master_id" do
79
+ study_subject = create_study_subject
80
+ assert_nil study_subject.icf_master_id
81
+ assert_equal study_subject.icf_master_id_to_s, '[no ID assigned]'
82
+ imi = Factory(:icf_master_id,:icf_master_id => '12345678A')
83
+ study_subject.assign_icf_master_id
84
+ assert_not_nil study_subject.icf_master_id
85
+ assert_equal study_subject.icf_master_id, imi.icf_master_id
86
+ assert_equal study_subject.icf_master_id_to_s, imi.icf_master_id
87
+ end
88
+
89
+ test "should require unique icf_master_id" do
90
+ assert_difference('StudySubject.count',1){
91
+ Factory(:study_subject, :icf_master_id => 'Fake1234')
92
+ }
93
+ assert_difference('StudySubject.count',0){
94
+ study_subject = Factory.build(:study_subject, :icf_master_id => 'Fake1234')
95
+ study_subject.save
96
+ assert study_subject.errors.on_attr_and_type?(:icf_master_id, :taken)
97
+ }
98
+ end
99
+
100
+ test "should nullify blank state_id_no before validation" do
101
+ study_subject = Factory.build(:study_subject, :state_id_no => '')
102
+ assert study_subject.state_id_no.blank?
103
+ assert !study_subject.state_id_no.nil?
104
+ study_subject.valid?
105
+ assert study_subject.state_id_no.blank?
106
+ assert study_subject.state_id_no.nil?
107
+ end
108
+
109
+ test "should nullify blank state_registrar_no before validation" do
110
+ study_subject = Factory.build(:study_subject, :state_registrar_no => '')
111
+ assert study_subject.state_registrar_no.blank?
112
+ assert !study_subject.state_registrar_no.nil?
113
+ study_subject.valid?
114
+ assert study_subject.state_registrar_no.blank?
115
+ assert study_subject.state_registrar_no.nil?
116
+ end
117
+
118
+ test "should nullify blank local_registrar_no before validation" do
119
+ study_subject = Factory.build(:study_subject, :local_registrar_no => '')
120
+ assert study_subject.local_registrar_no.blank?
121
+ assert !study_subject.local_registrar_no.nil?
122
+ study_subject.valid?
123
+ assert study_subject.local_registrar_no.blank?
124
+ assert study_subject.local_registrar_no.nil?
125
+ end
126
+
127
+ # test "should pad subjectid with leading zeros before validation" do
128
+ # study_subject = Factory.build(:study_subject)
129
+ # assert study_subject.subjectid.length < 6
130
+ # study_subject.valid? #save
131
+ # assert study_subject.subjectid.length == 6
132
+ # end
133
+
134
+ test "should pad matchingid with leading zeros before validation" do
135
+ study_subject = Factory.build(:study_subject,{ :matchingid => '123' })
136
+ assert study_subject.matchingid.length < 6
137
+ assert_equal '123', study_subject.matchingid
138
+ study_subject.valid? #save
139
+ assert study_subject.matchingid.length == 6
140
+ assert_equal '000123', study_subject.matchingid
141
+ end
142
+
143
+ test "should pad patid with leading zeros before validation" do
144
+ study_subject = Factory.build(:study_subject)
145
+ study_subject.patid = '123'
146
+ assert study_subject.patid.length < 4
147
+ assert_equal '123', study_subject.patid
148
+ study_subject.valid? #save
149
+ assert study_subject.patid.length == 4
150
+ assert_equal '0123', study_subject.patid
151
+ end
152
+
153
+ # remove ssn from factory and don't use class level test
154
+ test "should require unique ssn" do
155
+ Factory(:study_subject,:ssn => '123-45-6789')
156
+ assert_difference('StudySubject.count',0){
157
+ study_subject = Factory.build(:study_subject,:ssn => '123-45-6789')
158
+ study_subject.save
159
+ assert study_subject.errors.on_attr_and_type?(:ssn,:taken)
160
+ }
161
+ end
162
+
163
+ test "should nullify blank ssn" do
164
+ assert_difference('StudySubject.count',1){
165
+ study_subject = Factory(:study_subject, :ssn => '')
166
+ assert study_subject.reload.ssn.nil?
167
+ }
168
+ end
169
+
170
+ test "should create with string standard format ssn" do
171
+ assert_difference( "StudySubject.count", 1 ) do
172
+ study_subject = create_study_subject(:ssn => '987-65-4321')
173
+ assert !study_subject.new_record?,
174
+ "#{study_subject.errors.full_messages.to_sentence}"
175
+ assert_equal '987-65-4321', study_subject.reload.ssn
176
+ end
177
+ end
178
+
179
+ test "should require standard formatted ssn" do
180
+ %w( 1s2n3-4k5=6;7sdfg89 123456789 12345678X 12345678 1-34-56-789 ).each do |invalid_ssn|
181
+ assert_difference( "StudySubject.count", 0 ) do
182
+ study_subject = create_study_subject(:ssn => invalid_ssn)
183
+ assert study_subject.errors.on_attr_and_type?(:ssn,:invalid)
184
+ end
185
+ end
186
+ end
187
+
188
+ # patid and childid should be protected as they are generated values
189
+
190
+ test "should generate orderno = 0 for case_control_type == 'c'" do
191
+ # case_control_type is NOT the trigger. SubjectType is.
192
+ study_subject = Factory(:case_study_subject).reload
193
+ assert_equal 0, study_subject.orderno
194
+ end
195
+
196
+ test "should not overwrite given studyid" do
197
+ study_subject = Factory(:study_subject,:studyid => 'MyStudyId').reload
198
+ assert_equal 'MyStudyId', study_subject.studyid
199
+ end
200
+
201
+ test "should set studyid with patid, case_control_type and orderno for" <<
202
+ " case_control_type c" do
203
+ StudySubject.any_instance.stubs(:get_next_patid).returns('123')
204
+ study_subject = Factory(:case_study_subject).reload
205
+ assert_equal "0123", study_subject.patid
206
+ assert_equal "C", study_subject.case_control_type
207
+ assert_equal "0", study_subject.orderno.to_s
208
+ assert_not_nil study_subject.studyid
209
+ assert_nil study_subject.studyid_nohyphen
210
+ assert_nil study_subject.studyid_intonly_nohyphen
211
+ assert_equal "0123-C-0", study_subject.studyid
212
+ end
213
+
214
+ test "should generate subjectid on creation for any study_subject" do
215
+ study_subject = Factory(:study_subject)
216
+ assert_not_nil study_subject.subjectid
217
+ assert study_subject.subjectid.length == 6
218
+ end
219
+
220
+ test "should generate patid on creation of case_control_type == 'c'" do
221
+ assert_difference('StudySubject.maximum(:patid).to_i', 1) {
222
+ study_subject = Factory(:case_study_subject).reload
223
+ assert_not_nil study_subject.patid
224
+ }
225
+ end
226
+
227
+ %w( c b f 4 5 6 ).each do |cct|
228
+
229
+ test "should generate childid on creation of case_control_type #{cct}" do
230
+ assert_difference('StudySubject.maximum(:childid).to_i', 1) {
231
+ study_subject = Factory(:study_subject, :case_control_type => cct )
232
+ assert_not_nil study_subject.childid
233
+ }
234
+ end
235
+
236
+ test "should generate familyid == subjectid on creation of case_control_type #{cct}" do
237
+ study_subject = Factory(:study_subject, :case_control_type => cct )
238
+ assert_not_nil study_subject.subjectid
239
+ assert_not_nil study_subject.familyid
240
+ assert_equal study_subject.subjectid, study_subject.familyid
241
+ end
242
+
243
+ end
244
+
245
+ test "should generate familyid == child's subjectid on creation of case's mother" do
246
+ case_study_subject = create_case_study_subject
247
+ assert_equal case_study_subject.subjectid, case_study_subject.familyid
248
+ mother = case_study_subject.create_mother
249
+ assert_equal case_study_subject.subjectid, mother.familyid
250
+ end
251
+
252
+ test "should generate familyid == child's subjectid on creation of control's mother" do
253
+ control_study_subject = create_control_study_subject
254
+ assert_equal control_study_subject.subjectid, control_study_subject.familyid
255
+ mother = control_study_subject.create_mother
256
+ assert_equal control_study_subject.subjectid, mother.familyid
257
+ end
258
+
259
+ test "should generate matchingid == subjectid on creation of case" do
260
+ study_subject = Factory(:case_study_subject).reload
261
+ assert_not_nil study_subject.subjectid
262
+ assert_not_nil study_subject.matchingid
263
+ assert_equal study_subject.subjectid, study_subject.matchingid
264
+ end
265
+
266
+ test "should not generate new patid for case if given" do
267
+ # existing data import
268
+ assert_difference( "StudySubject.maximum(:patid).to_i", 123 ) { # was 0, now 123
269
+ assert_difference( "StudySubject.count", 1 ) {
270
+ study_subject = Factory(:case_study_subject, :patid => '123').reload
271
+ assert_not_nil study_subject.studyid
272
+ assert_nil study_subject.studyid_nohyphen
273
+ assert_nil study_subject.studyid_intonly_nohyphen
274
+ assert_equal "0123-C-0", study_subject.studyid
275
+ assert_equal "0123", study_subject.patid
276
+ } } #}
277
+ end
278
+
279
+ test "should not generate new childid if given" do
280
+ # existing data import
281
+ assert_difference( "StudySubject.maximum(:childid).to_i", 123 ) { # was 0, now 123
282
+ assert_difference( "StudySubject.count", 1 ) {
283
+ study_subject = Factory(:case_study_subject, :childid => '123').reload
284
+ assert_equal 123, study_subject.childid
285
+ } } #}
286
+ end
287
+
288
+ test "should not generate new orderno if given" do
289
+ # existing data import
290
+ assert_difference( "StudySubject.count", 1 ) {
291
+ study_subject = Factory(:case_study_subject, :orderno => 9).reload
292
+ assert_equal 9, study_subject.orderno
293
+ }
294
+ end
295
+
296
+ test "should not generate new subjectid if given" do
297
+ # existing data import
298
+ assert_difference( "StudySubject.count", 1 ) {
299
+ study_subject = Factory(:case_study_subject, :subjectid => 'ABCDEF').reload
300
+ assert_equal "ABCDEF", study_subject.subjectid
301
+ }
302
+ end
303
+
304
+ test "should not generate new familyid if given" do
305
+ # existing data import
306
+ assert_difference( "StudySubject.count", 1 ) {
307
+ study_subject = Factory(:case_study_subject, :familyid => 'ABCDEF').reload
308
+ assert_equal "ABCDEF", study_subject.familyid
309
+ }
310
+ end
311
+
312
+ test "should not generate new matchingid if given" do
313
+ # existing data import
314
+ assert_difference( "StudySubject.count", 1 ) {
315
+ study_subject = Factory(:case_study_subject, :matchingid => '123456').reload
316
+ assert_equal "123456", study_subject.matchingid
317
+ }
318
+ end
319
+
320
+ test "should find by studyid or icf_master_id with studyid" do
321
+ study_subject1 = Factory(:case_study_subject)
322
+ study_subject2 = Factory(:case_study_subject)
323
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
324
+ study_subject1.studyid, nil )
325
+ assert study_subjects.include?(study_subject1)
326
+ assert !study_subjects.include?(study_subject2)
327
+ end
328
+
329
+ test "should find by studyid or icf_master_id with case studyid" do
330
+ subject = Factory(:complete_case_study_subject)
331
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
332
+ subject.studyid, nil )
333
+ assert study_subjects.include?(subject)
334
+ end
335
+
336
+ test "should find by studyid or icf_master_id with case icf_master_id" do
337
+ subject = Factory(:complete_case_study_subject)
338
+ Factory(:icf_master_id, :icf_master_id => '123456789' )
339
+ subject.assign_icf_master_id
340
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
341
+ nil, subject.icf_master_id )
342
+ assert study_subjects.include?(subject)
343
+ end
344
+
345
+ test "should find by studyid or icf_master_id with control studyid" do
346
+ subject = Factory(:complete_control_study_subject,
347
+ :patid => '1234', :case_control_type => 'X', :orderno => 9)
348
+ assert_equal subject.patid, '1234'
349
+ assert_equal subject.case_control_type, 'X'
350
+ assert_equal subject.orderno, 9
351
+ assert_equal subject.studyid, '1234-X-9'
352
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
353
+ subject.studyid, nil )
354
+ assert study_subjects.include?(subject)
355
+ end
356
+
357
+ test "should find by studyid or icf_master_id with control icf_master_id" do
358
+ subject = Factory(:complete_control_study_subject)
359
+ Factory(:icf_master_id, :icf_master_id => '123456789' )
360
+ subject.assign_icf_master_id
361
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
362
+ nil, subject.icf_master_id )
363
+ assert study_subjects.include?(subject)
364
+ end
365
+
366
+ # Mothers won't have a studyid
367
+ # test "should find by studyid or icf_master_id with mother studyid" do
368
+ # subject = Factory(:complete_mother_study_subject)
369
+ # puts subject.studyid
370
+ # study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
371
+ # subject.studyid, nil )
372
+ # assert study_subjects.include?(subject)
373
+ # end
374
+
375
+ test "should find by studyid or icf_master_id with mother icf_master_id" do
376
+ subject = Factory(:complete_mother_study_subject)
377
+ Factory(:icf_master_id, :icf_master_id => '123456789' )
378
+ subject.assign_icf_master_id
379
+ study_subjects = StudySubject.find_all_by_studyid_or_icf_master_id(
380
+ nil, subject.icf_master_id )
381
+ assert study_subjects.include?(subject)
382
+ end
383
+
384
+ # TODO what about both studyid and icf_master_id?
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+ # The problems with autogeneration of childid, patid and subjectid are
397
+ # that they cannot be validated automatically. Validation would simply
398
+ # return this failure to the user, whom can do nothing about it.
399
+ # Autogeneration must work on its own. subjectid seems to effectively
400
+ # select an unused subjectid, but if many subjects were being created at
401
+ # the same time could theoretically select the same random number.
402
+ # If/When this occurs, a database error will be returned and confuse
403
+ # the user.
404
+ #
405
+
406
+ # ActiveRecord::StatementInvalid: Mysql::Error: Duplicate entry '12345' for key 'index_identifiers_on_childid': INSERT INTO `identifiers` (`familyid`, `created_at`, `case_control_type`, `childidwho`, `ssn`, `updated_at`, `state_id_no`, `matchingid`, `gbid`, `idno_wiemels`, `related_childid`, `state_registrar_no`, `study_subject_id`, `studyid`, `childid`, `studyid_nohyphen`, `icf_master_id`, `orderno`, `lab_no`, `lab_no_wiemels`, `accession_no`, `subjectid`, `newid`, `studyid_intonly_nohyphen`, `local_registrar_no`, `patid`, `related_case_childid`) VALUES('407928', '2011-10-28 12:36:07', '3', NULL, '000000002', '2011-10-28 12:36:07', '2', NULL, '2', '2', NULL, '2', 2, NULL, 12345, NULL, '2', NULL, NULL, '2', '2', '407928', NULL, NULL, '2', NULL, NULL)
407
+ test "duplicating childid should raise database error" do
408
+ StudySubject.any_instance.stubs(:get_next_childid).returns(12345)
409
+ study_subject1 = Factory(:study_subject)
410
+ assert_not_nil study_subject1.childid
411
+ assert_raises(ActiveRecord::StatementInvalid){
412
+ study_subject2 = Factory(:study_subject)
413
+ }
414
+ end
415
+
416
+ # ActiveRecord::StatementInvalid: Mysql::Error: Duplicate entry '0123-C-0' for key 'piccton': INSERT INTO `identifiers` (`familyid`, `created_at`, `case_control_type`, `childidwho`, `ssn`, `updated_at`, `state_id_no`, `matchingid`, `gbid`, `idno_wiemels`, `related_childid`, `state_registrar_no`, `study_subject_id`, `studyid`, `childid`, `studyid_nohyphen`, `icf_master_id`, `orderno`, `lab_no`, `lab_no_wiemels`, `accession_no`, `subjectid`, `newid`, `studyid_intonly_nohyphen`, `local_registrar_no`, `patid`, `related_case_childid`) VALUES('975152', '2011-10-28 12:36:08', 'C', NULL, '000000004', '2011-10-28 12:36:08', '4', '975152', '4', '4', NULL, '4', 4, NULL, 2, NULL, '4', 0, NULL, '4', '4', '975152', NULL, NULL, '4', '0123', NULL)
417
+ test "duplicating patid should raise database error" do
418
+ StudySubject.any_instance.stubs(:get_next_patid).returns('0123')
419
+ study_subject1 = Factory(:case_study_subject)
420
+ assert_not_nil study_subject1.patid
421
+ assert_raises(ActiveRecord::StatementInvalid){
422
+ study_subject2 = Factory(:case_study_subject)
423
+ }
424
+ end
425
+
426
+ # This should never actually happen as the code actually removes all those that exist.
427
+ # But it does show that if/when creation of an identifier with an existing
428
+ # is attempted, it will raise a database error.
429
+ # ActiveRecord::StatementInvalid: Mysql::Error: Duplicate entry '012345' for key 'index_identifiers_on_subjectid': INSERT INTO `identifiers` (`familyid`, `created_at`, `case_control_type`, `childidwho`, `ssn`, `updated_at`, `state_id_no`, `matchingid`, `gbid`, `idno_wiemels`, `related_childid`, `state_registrar_no`, `study_subject_id`, `studyid`, `childid`, `studyid_nohyphen`, `icf_master_id`, `orderno`, `lab_no`, `lab_no_wiemels`, `accession_no`, `subjectid`, `newid`, `studyid_intonly_nohyphen`, `local_registrar_no`, `patid`, `related_case_childid`) VALUES('012345', '2011-10-28 12:36:08', '5', NULL, '000000006', '2011-10-28 12:36:08', '6', NULL, '6', '6', NULL, '6', 6, NULL, 4, NULL, '6', NULL, NULL, '6', '6', '012345', NULL, NULL, '6', NULL, NULL)
430
+ test "duplicating subjectid should raise database error" do
431
+ StudySubject.any_instance.stubs(:generate_subjectid).returns('012345')
432
+ study_subject1 = Factory(:study_subject)
433
+ assert_not_nil study_subject1.subjectid
434
+ assert_raises(ActiveRecord::StatementInvalid){
435
+ study_subject2 = Factory(:study_subject)
436
+ }
437
+ end
438
+
439
+ end