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,278 @@
1
+ require 'test_helper'
2
+
3
+ # This is just a collection of pii related tests
4
+ # for StudySubject separated only for clarity due
5
+ # to the size of the StudySubjectTest class.
6
+ class Ccls::StudySubjectPiiTest < ActiveSupport::TestCase
7
+
8
+ test "should return 'name not available' for study_subject without names" do
9
+ study_subject = create_study_subject
10
+ assert_nil study_subject.first_name
11
+ assert_nil study_subject.middle_name
12
+ assert_nil study_subject.last_name
13
+ assert_equal '[name not available]', study_subject.full_name
14
+ end
15
+
16
+ test "should not require dob on creation for mother" do
17
+ assert_difference( "StudySubject.count", 1 ) {
18
+ @study_subject = create_study_subject(
19
+ :subject_type => SubjectType['Mother'],
20
+ :dob => nil )
21
+ }
22
+ assert_nil @study_subject.reload.dob
23
+ end
24
+
25
+ test "should not require dob on update for mother" do
26
+ # flag not necessary as study_subject.subject_type exists
27
+ assert_difference( "StudySubject.count", 1 ) {
28
+ @study_subject = create_study_subject(:subject_type => SubjectType['Mother'] )
29
+ }
30
+ assert_not_nil @study_subject.reload.dob
31
+ @study_subject.update_attributes(:dob => nil)
32
+ assert_nil @study_subject.reload.dob
33
+ end
34
+
35
+ test "should nullify blank email" do
36
+ assert_difference("StudySubject.count",1) do
37
+ study_subject = create_study_subject(:email => ' ')
38
+ assert_nil study_subject.reload.email
39
+ end
40
+ end
41
+
42
+ test "should allow multiple blank email" do
43
+ create_study_subject(:email => ' ')
44
+ assert_difference( "StudySubject.count", 1 ) do
45
+ study_subject = create_study_subject(:email => ' ')
46
+ end
47
+ end
48
+
49
+ test "should require properly formated email address" do
50
+ assert_difference( "StudySubject.count", 0 ) do
51
+ %w( asdf me@some@where.com me@somewhere ).each do |bad_email|
52
+ study_subject = create_study_subject(:email => bad_email)
53
+ assert study_subject.errors.on_attr_and_type?(:email,:invalid)
54
+ end
55
+ end
56
+ assert_difference( "StudySubject.count", 1 ) do
57
+ %w( me@some.where.com ).each do |good_email|
58
+ study_subject = create_study_subject(:email => good_email)
59
+ assert !study_subject.errors.on_attr_and_type?(:email,:invalid)
60
+ end
61
+ end
62
+ end
63
+
64
+ test "should return dob as a date NOT time" do
65
+ study_subject = create_study_subject(:dob => (Time.now - 5.days) )
66
+ assert_not_nil study_subject.dob
67
+ assert_changes("StudySubject.find(#{study_subject.id}).dob") {
68
+ study_subject.update_attributes(:dob => (Time.now - 4.days) )
69
+ }
70
+ assert !study_subject.new_record?
71
+ assert_not_nil study_subject.dob
72
+ assert study_subject.dob.is_a?(Date)
73
+ assert_equal study_subject.dob, study_subject.dob.to_date
74
+ end
75
+
76
+ test "should parse a properly formatted date" do
77
+ assert_difference( "StudySubject.count", 1 ) do
78
+ study_subject = create_study_subject(
79
+ :dob => Date.parse("January 1 2001") )
80
+ assert !study_subject.new_record?,
81
+ "#{study_subject.errors.full_messages.to_sentence}"
82
+ end
83
+ end
84
+
85
+ test "should return join of study_subject's initials" do
86
+ study_subject = create_study_subject(
87
+ :first_name => "John",
88
+ :middle_name => "X",
89
+ :last_name => "Smith" )
90
+ assert_equal 'JXS', study_subject.initials
91
+ end
92
+
93
+ test "should return join of study_subject's initials without middle name" do
94
+ study_subject = create_study_subject(
95
+ :first_name => "John",
96
+ :last_name => "Smith" )
97
+ assert_equal 'JS', study_subject.initials
98
+ end
99
+
100
+ test "should return join of study_subject's initials with blank middle name" do
101
+ study_subject = create_study_subject(
102
+ :first_name => "John",
103
+ :middle_name => "",
104
+ :last_name => "Smith" )
105
+ assert_equal 'JS', study_subject.initials
106
+ end
107
+
108
+ test "should return join of study_subject's name" do
109
+ study_subject = create_study_subject(
110
+ :first_name => "John",
111
+ :middle_name => "Xavier",
112
+ :last_name => "Smith" )
113
+ assert_equal 'John Xavier Smith', study_subject.full_name
114
+ end
115
+
116
+ test "should return join of study_subject's name without middle name" do
117
+ study_subject = create_study_subject(
118
+ :first_name => "John",
119
+ :last_name => "Smith" )
120
+ assert_equal 'John Smith', study_subject.full_name
121
+ end
122
+
123
+ test "should return join of study_subject's name with blank middle name" do
124
+ study_subject = create_study_subject(
125
+ :first_name => "John",
126
+ :middle_name => "",
127
+ :last_name => "Smith" )
128
+ assert_equal 'John Smith', study_subject.full_name
129
+ end
130
+
131
+ test "should return 'name not available' if study_subject's names are blank" do
132
+ study_subject = create_study_subject
133
+ assert_equal '[name not available]', study_subject.full_name
134
+ end
135
+
136
+ test "should return 'name not available' if study_subject's father's names are blank" do
137
+ study_subject = create_study_subject
138
+ assert_equal '[name not available]', study_subject.fathers_name
139
+ end
140
+
141
+ test "should return 'name not available' if study_subject's mother's names are blank" do
142
+ study_subject = create_study_subject
143
+ assert_equal '[name not available]', study_subject.mothers_name
144
+ end
145
+
146
+ test "should return 'name not available' if study_subject's guardian's names are blank" do
147
+ study_subject = create_study_subject
148
+ assert_equal '[name not available]', study_subject.guardians_name
149
+ end
150
+
151
+ test "should return join of father's name" do
152
+ study_subject = create_study_subject(
153
+ :father_first_name => "Santa",
154
+ :father_middle_name => "X.",
155
+ :father_last_name => "Claus" )
156
+ assert_equal 'Santa X. Claus', study_subject.fathers_name
157
+ end
158
+
159
+ test "should return join of father's name without middle name" do
160
+ study_subject = create_study_subject(
161
+ :father_first_name => "Santa",
162
+ :father_last_name => "Claus" )
163
+ assert_equal 'Santa Claus', study_subject.fathers_name
164
+ end
165
+
166
+ test "should return join of father's name with blank middle name" do
167
+ study_subject = create_study_subject(
168
+ :father_first_name => "Santa",
169
+ :father_middle_name => "",
170
+ :father_last_name => "Claus" )
171
+ assert_equal 'Santa Claus', study_subject.fathers_name
172
+ end
173
+
174
+ test "should return join of mother's name" do
175
+ study_subject = create_study_subject(
176
+ :mother_first_name => "Ms",
177
+ :mother_middle_name => "X.",
178
+ :mother_last_name => "Claus" )
179
+ assert_equal 'Ms X. Claus', study_subject.mothers_name
180
+ end
181
+
182
+ test "should return join of mother's name without middle name" do
183
+ study_subject = create_study_subject(
184
+ :mother_first_name => "Ms",
185
+ :mother_last_name => "Claus" )
186
+ assert_equal 'Ms Claus', study_subject.mothers_name
187
+ end
188
+
189
+ test "should return join of mother's name with blank middle name" do
190
+ study_subject = create_study_subject(
191
+ :mother_first_name => "Ms",
192
+ :mother_middle_name => "",
193
+ :mother_last_name => "Claus" )
194
+ assert_equal 'Ms Claus', study_subject.mothers_name
195
+ end
196
+
197
+ test "should return join of guardian's name" do
198
+ study_subject = create_study_subject(
199
+ :guardian_first_name => "Jack",
200
+ :guardian_middle_name => "X.",
201
+ :guardian_last_name => "Frost" )
202
+ assert_equal 'Jack X. Frost', study_subject.guardians_name
203
+ end
204
+
205
+ test "should return join of guardian's name without middle name" do
206
+ study_subject = create_study_subject(
207
+ :guardian_first_name => "Jack",
208
+ :guardian_last_name => "Frost" )
209
+ assert_equal 'Jack Frost', study_subject.guardians_name
210
+ end
211
+
212
+ test "should return join of guardian's name with blank middle name" do
213
+ study_subject = create_study_subject(
214
+ :guardian_first_name => "Jack",
215
+ :guardian_middle_name => "",
216
+ :guardian_last_name => "Frost" )
217
+ assert_equal 'Jack Frost', study_subject.guardians_name
218
+ end
219
+
220
+ test "should require guardian_relationship_other if " <<
221
+ "guardian_relationship == other" do
222
+ assert_difference( "StudySubject.count", 0 ) do
223
+ study_subject = create_study_subject(
224
+ :guardian_relationship => SubjectRelationship['other'] )
225
+ assert study_subject.errors.on_attr_and_type?(:guardian_relationship_other,:blank)
226
+ end
227
+ end
228
+
229
+ test "should require guardian_relationship_other with custom message" do
230
+ assert_difference( "StudySubject.count", 0 ) do
231
+ study_subject = create_study_subject(
232
+ :guardian_relationship => SubjectRelationship['other'] )
233
+ assert study_subject.errors.on_attr_and_type?(:guardian_relationship_other,:blank)
234
+ assert_match /You must specify a relationship with 'other relationship' is selected/,
235
+ study_subject.errors.full_messages.to_sentence
236
+ assert_no_match /Guardian relationship other/,
237
+ study_subject.errors.full_messages.to_sentence
238
+ end
239
+ end
240
+
241
+ test "should require dob with custom message" do
242
+ assert_difference( "StudySubject.count", 0 ) do
243
+ study_subject = create_study_subject( :dob => nil )
244
+ assert study_subject.errors.on_attr_and_type?(:dob,:blank)
245
+ assert_match /Date of birth can't be blank/,
246
+ study_subject.errors.full_messages.to_sentence
247
+ assert_no_match /DOB/i,
248
+ study_subject.errors.full_messages.to_sentence
249
+ end
250
+ end
251
+
252
+ test "should not require dob if subject is mother" do
253
+ assert_difference('StudySubject.count',1) do
254
+ study_subject = create_mother_study_subject( :dob => nil )
255
+ end
256
+ end
257
+
258
+ test "should require dob if subject is not mother" do
259
+ assert_difference('StudySubject.count',0) do
260
+ study_subject = create_study_subject( :dob => nil )
261
+ end
262
+ end
263
+
264
+ test "should require birth_city if birth_country is 'United States'" do
265
+ assert_difference( "StudySubject.count", 0 ) do
266
+ study_subject = create_study_subject( :birth_country => 'United States' )
267
+ assert study_subject.errors.on_attr_and_type?(:birth_city,:blank)
268
+ end
269
+ end
270
+
271
+ test "should require birth_state if birth_country is 'United States'" do
272
+ assert_difference( "StudySubject.count", 0 ) do
273
+ study_subject = create_study_subject( :birth_country => 'United States' )
274
+ assert study_subject.errors.on_attr_and_type?(:birth_state,:blank)
275
+ end
276
+ end
277
+
278
+ end
@@ -0,0 +1,203 @@
1
+ require 'test_helper'
2
+
3
+ # This is just a collection of race related tests
4
+ # for StudySubject separated only for clarity due
5
+ # to the size of the StudySubjectTest class.
6
+ class Ccls::StudySubjectRacesTest < ActiveSupport::TestCase
7
+
8
+ test "should create study_subject with race" do
9
+ assert_difference( 'Race.count', 1 ){
10
+ assert_difference( 'SubjectRace.count', 1 ){
11
+ assert_difference( "StudySubject.count", 1 ) {
12
+ study_subject = create_study_subject
13
+ study_subject.races << Factory(:race)
14
+ assert !study_subject.new_record?,
15
+ "#{study_subject.errors.full_messages.to_sentence}"
16
+ } } }
17
+ end
18
+
19
+ test "should NOT destroy races with study_subject" do
20
+ assert_difference('StudySubject.count',1) {
21
+ assert_difference('Race.count',1) {
22
+ @study_subject = Factory(:subject_race).study_subject
23
+ } }
24
+ assert_difference('StudySubject.count',-1) {
25
+ assert_difference('Race.count',0) {
26
+ @study_subject.destroy
27
+ } }
28
+ end
29
+
30
+ test "should NOT destroy subject_races with study_subject" do
31
+ assert_difference('StudySubject.count',1) {
32
+ assert_difference('SubjectRace.count',1) {
33
+ @study_subject = Factory(:subject_race).study_subject
34
+ } }
35
+ assert_difference('StudySubject.count',-1) {
36
+ assert_difference('SubjectRace.count',0) {
37
+ @study_subject.destroy
38
+ } }
39
+ end
40
+
41
+ test "should return race name for string" do
42
+ study_subject = create_study_subject
43
+ assert_equal study_subject.race_names,
44
+ "#{study_subject.races.first}"
45
+ end
46
+
47
+ test "should create study_subject with empty subject_races_attributes" do
48
+ assert_difference( 'SubjectRace.count', 0 ){
49
+ assert_difference( "StudySubject.count", 1 ) {
50
+ @study_subject = create_study_subject(:subject_races_attributes => { })
51
+ assert !@study_subject.new_record?,
52
+ "#{@study_subject.errors.full_messages.to_sentence}"
53
+ } }
54
+ assert @study_subject.races.empty?
55
+ assert @study_subject.subject_races.empty?
56
+ end
57
+
58
+ test "should create study_subject with blank race_id" do
59
+ assert_difference( 'SubjectRace.count', 0 ){
60
+ assert_difference( "StudySubject.count", 1 ) {
61
+ @study_subject = create_study_subject(:subject_races_attributes => {
62
+ '0' => { :race_id => '' }
63
+ })
64
+ assert !@study_subject.new_record?,
65
+ "#{@study_subject.errors.full_messages.to_sentence}"
66
+ } }
67
+ assert @study_subject.races.empty?
68
+ assert @study_subject.subject_races.empty?
69
+ end
70
+
71
+ test "should create study_subject with subject_races_attributes race_id" do
72
+ assert Race.count > 0
73
+ assert_difference( 'SubjectRace.count', 1 ){
74
+ assert_difference( "StudySubject.count", 1 ) {
75
+ @study_subject = create_study_subject(:subject_races_attributes => {
76
+ '0' => { :race_id => Race.first.id }
77
+ })
78
+ assert !@study_subject.new_record?,
79
+ "#{@study_subject.errors.full_messages.to_sentence}"
80
+ } }
81
+ assert !@study_subject.races.empty?
82
+ assert !@study_subject.subject_races.empty?
83
+ assert !@study_subject.subject_races.first.is_primary
84
+ end
85
+
86
+ test "should create study_subject with subject_races_attributes race_id and is_primary" do
87
+ assert Race.count > 0
88
+ assert_difference( 'SubjectRace.count', 1 ){
89
+ assert_difference( "StudySubject.count", 1 ) {
90
+ @study_subject = create_study_subject(:subject_races_attributes => {
91
+ '0' => { :race_id => Race.first.id, :is_primary => 'true' }
92
+ })
93
+ assert !@study_subject.new_record?,
94
+ "#{@study_subject.errors.full_messages.to_sentence}"
95
+ } }
96
+ assert !@study_subject.races.empty?
97
+ assert !@study_subject.subject_races.empty?
98
+ assert @study_subject.subject_races.first.is_primary
99
+ end
100
+
101
+ test "should create study_subject with subject_races_attributes multiple races" do
102
+ assert Race.count > 2
103
+ races = Race.all
104
+ assert_difference( 'SubjectRace.count', 3 ){
105
+ assert_difference( "StudySubject.count", 1 ) {
106
+ @study_subject = create_study_subject(:subject_races_attributes => {
107
+ '0' => { :race_id => races[1].id },
108
+ '1' => { :race_id => races[2].id },
109
+ '2' => { :race_id => races[3].id }
110
+ })
111
+ assert !@study_subject.new_record?,
112
+ "#{@study_subject.errors.full_messages.to_sentence}"
113
+ } }
114
+ assert !@study_subject.races.empty?
115
+ assert_equal 3, @study_subject.races.length
116
+ assert !@study_subject.subject_races.empty?
117
+ assert_equal 3, @study_subject.subject_races.length
118
+ assert !@study_subject.subject_races.collect(&:is_primary).any?
119
+ end
120
+
121
+ test "should create study_subject with subject_races_attributes multiple races and is_primaries" do
122
+ assert Race.count > 2
123
+ races = Race.all
124
+ assert_difference( 'SubjectRace.count', 3 ){
125
+ assert_difference( "StudySubject.count", 1 ) {
126
+ @study_subject = create_study_subject(:subject_races_attributes => {
127
+ '0' => { :race_id => races[1].id, :is_primary => 'true' },
128
+ '1' => { :race_id => races[2].id, :is_primary => 'true' },
129
+ '2' => { :race_id => races[3].id, :is_primary => 'true' }
130
+ })
131
+ assert !@study_subject.new_record?,
132
+ "#{@study_subject.errors.full_messages.to_sentence}"
133
+ } }
134
+ assert !@study_subject.races.empty?
135
+ assert_equal 3, @study_subject.races.length
136
+ assert !@study_subject.subject_races.empty?
137
+ assert_equal 3, @study_subject.subject_races.length
138
+ assert @study_subject.subject_races.collect(&:is_primary).all?
139
+ end
140
+
141
+ test "should create study_subject with subject_races_attributes with is_primary and no race_id" do
142
+ assert Race.count > 0
143
+ assert_difference( 'SubjectRace.count', 0 ){
144
+ assert_difference( "StudySubject.count", 1 ) {
145
+ @study_subject = create_study_subject(:subject_races_attributes => {
146
+ '0' => { :is_primary => 'true' }
147
+ })
148
+ assert !@study_subject.new_record?,
149
+ "#{@study_subject.errors.full_messages.to_sentence}"
150
+ } }
151
+ assert @study_subject.races.empty?
152
+ assert @study_subject.subject_races.empty?
153
+ end
154
+
155
+ test "should NOT create study_subject with subject_races_attributes " <<
156
+ "if race is other and no other given" do
157
+ assert Race.count > 0
158
+ assert_difference( 'SubjectRace.count', 0 ){
159
+ assert_difference( "StudySubject.count", 0 ) {
160
+ @study_subject = create_study_subject(:subject_races_attributes => {
161
+ '0' => { :race_id => Race['other'].id }
162
+ })
163
+ assert @study_subject.errors.on_attr_and_type?("subject_races.other",:blank)
164
+ } }
165
+ end
166
+
167
+ test "should update study_subject with subject_races_attributes" do
168
+ assert Race.count > 0
169
+ assert_difference( 'SubjectRace.count', 0 ){
170
+ assert_difference( "StudySubject.count", 1 ) {
171
+ @study_subject = create_study_subject
172
+ assert !@study_subject.new_record?,
173
+ "#{@study_subject.errors.full_messages.to_sentence}"
174
+ } }
175
+ assert @study_subject.races.empty?
176
+ assert @study_subject.subject_races.empty?
177
+ assert_difference( 'SubjectRace.count', 1 ){
178
+ assert_difference( "StudySubject.count", 0 ) {
179
+ @study_subject.update_attributes(:subject_races_attributes => {
180
+ '0' => { :race_id => Race.first.id, :is_primary => 'true' }
181
+ })
182
+ } }
183
+ assert !@study_subject.races.empty?
184
+ assert !@study_subject.subject_races.empty?
185
+ assert @study_subject.subject_races.first.is_primary
186
+ end
187
+
188
+ test "should destroy subject_race on update with _destroy" do
189
+ study_subject = create_study_subject
190
+ assert_difference( 'SubjectRace.count', 1 ){
191
+ study_subject.update_attributes(:subject_races_attributes => {
192
+ '0' => { :race_id => Race.first.id, :is_primary => 'true' }
193
+ })
194
+ }
195
+ subject_race = study_subject.subject_races.first
196
+ assert_difference( 'SubjectRace.count', -1 ){
197
+ study_subject.update_attributes(:subject_races_attributes => {
198
+ '0' => { :id => subject_race.id, :_destroy => 1 }
199
+ })
200
+ }
201
+ end
202
+
203
+ end