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,155 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::AddressTest < ActiveSupport::TestCase
4
+
5
+
6
+ # TODO this should really be unique, only used during importing
7
+ # validates_uniqueness_of :external_address_id, :allow_blank => true
8
+
9
+ # external_address_id isn't required so don't use class level test
10
+ test "should require unique external_address_id" do
11
+ Factory(:address,:external_address_id => 123456789)
12
+ assert_difference('Address.count',0){
13
+ address = Factory.build(:address,:external_address_id => 123456789)
14
+ address.save
15
+ assert address.errors.on_attr_and_type?(:external_address_id,:taken)
16
+ }
17
+ end
18
+
19
+
20
+
21
+ assert_should_create_default_object
22
+ assert_should_require_attributes(
23
+ :line_1,
24
+ :city,
25
+ :state,
26
+ :zip )
27
+ assert_should_not_require_attributes(
28
+ :country,
29
+ :county,
30
+ :line_2,
31
+ :unit,
32
+ :external_address_id )
33
+ assert_should_require_attribute_length(
34
+ :zip,
35
+ :maximum => 10 )
36
+ assert_should_require_attribute_length(
37
+ :line_1,
38
+ :line_2,
39
+ :unit,
40
+ :city,
41
+ :state,
42
+ :maximum => 250 )
43
+
44
+ assert_should_have_one(:addressing)
45
+ assert_should_have_many(:interviews)
46
+ assert_should_initially_belong_to(:address_type)
47
+
48
+ test "explicit Factory address test" do
49
+ assert_difference('AddressType.count',1) {
50
+ assert_difference('Address.count',1) {
51
+ address = Factory(:address)
52
+ assert_not_nil address.address_type
53
+ assert_match /Box \d*/, address.line_1
54
+ assert_equal "Berkeley", address.city
55
+ assert_equal "CA", address.state
56
+ assert_equal "12345", address.zip
57
+ } }
58
+ end
59
+
60
+ test "explicit Factory mailing_address test" do
61
+ assert_difference('AddressType.count',0) {
62
+ assert_difference('Address.count',1) {
63
+ address = Factory(:mailing_address)
64
+ assert_equal address.address_type, AddressType['mailing']
65
+ } }
66
+ end
67
+
68
+ test "explicit Factory residence_address test" do
69
+ assert_difference('AddressType.count',0) {
70
+ assert_difference('Address.count',1) {
71
+ address = Factory(:residence_address)
72
+ assert_equal address.address_type, AddressType['residence']
73
+ } }
74
+ end
75
+
76
+ test "should require address_type" do
77
+ assert_difference( "Address.count", 0 ) do
78
+ address = create_address( :address_type => nil)
79
+ assert !address.errors.on(:address_type)
80
+ assert address.errors.on_attr_and_type?(:address_type_id,:blank)
81
+ end
82
+ end
83
+
84
+ test "should require valid address_type" do
85
+ assert_difference( "Address.count", 0 ) do
86
+ address = create_address( :address_type_id => 0)
87
+ assert !address.errors.on(:address_type_id)
88
+ assert address.errors.on_attr_and_type?(:address_type,:blank)
89
+ end
90
+ end
91
+
92
+ test "should require 5 or 9 digit zip" do
93
+ %w( asdf 1234 123456 1234Q ).each do |bad_zip|
94
+ assert_difference( "Address.count", 0 ) do
95
+ address = create_address( :zip => bad_zip )
96
+ assert address.errors.on(:zip)
97
+ end
98
+ end
99
+ %w( 12345 12345-6789 123456789 ).each do |good_zip|
100
+ assert_difference( "Address.count", 1 ) do
101
+ address = create_address( :zip => good_zip )
102
+ assert !address.errors.on(:zip)
103
+ assert address.zip =~ /\A\d{5}(-)?(\d{4})?\z/
104
+ end
105
+ end
106
+ end
107
+
108
+ test "should format 9 digit zip" do
109
+ assert_difference( "Address.count", 1 ) do
110
+ address = create_address( :zip => '123456789' )
111
+ assert !address.errors.on(:zip)
112
+ assert address.zip =~ /\A\d{5}(-)?(\d{4})?\z/
113
+ assert_equal '12345-6789', address.zip
114
+ end
115
+ end
116
+
117
+ test "should order address chronologically reversed" do
118
+ a1 = Factory(:address, :created_at => Date.jd(2440000) ).id
119
+ a2 = Factory(:address, :created_at => Date.jd(2450000) ).id
120
+ a3 = Factory(:address, :created_at => Date.jd(2445000) ).id
121
+ address_ids = Address.all.collect(&:id)
122
+ assert_equal address_ids, [a2,a3,a1]
123
+ end
124
+
125
+ test "should return city state and zip with csz" do
126
+ address = Factory(:address,
127
+ :city => 'City',
128
+ :state => 'CA',
129
+ :zip => '12345')
130
+ assert_equal "City, CA 12345", address.csz
131
+ end
132
+
133
+ # Note that there are probably legitimate address line 1's
134
+ # that will match the p.*o.*box regex.
135
+ test "should require non-residence address type with pobox in line" do
136
+ ["P.O. Box 123","PO Box 123","P O Box 123","Post Office Box 123"].each do |pobox|
137
+ assert_difference( "Address.count", 0 ) do
138
+ address = create_address(
139
+ :line_1 => pobox,
140
+ :address_type => AddressType['residence']
141
+ )
142
+ assert address.errors.on(:address_type_id)
143
+ end
144
+ end
145
+ end
146
+
147
+ #protected
148
+ #
149
+ # def create_address(options={})
150
+ # address = Factory.build(:address,options)
151
+ # address.save
152
+ # address
153
+ # end
154
+
155
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::AddressTypeTest < ActiveSupport::TestCase
4
+
5
+ assert_should_behave_like_a_hash
6
+
7
+ assert_should_create_default_object
8
+ assert_should_not_require_attributes( :position )
9
+ assert_should_act_as_list
10
+ assert_should_have_many(:addresses)
11
+
12
+ test "explicit Factory address_type test" do
13
+ assert_difference('AddressType.count',1) {
14
+ address_type = Factory(:address_type)
15
+ assert_match /Key\d*/, address_type.key
16
+ assert_match /Desc\d*/, address_type.description
17
+ }
18
+ end
19
+
20
+ test "should return key as to_s" do
21
+ address_type = Factory(:address_type)
22
+ assert_equal address_type.key, "#{address_type}"
23
+ end
24
+
25
+ end
@@ -0,0 +1,466 @@
1
+ require 'test_helper'
2
+
3
+ class Ccls::AddressingTest < ActiveSupport::TestCase
4
+
5
+ assert_should_create_default_object
6
+ assert_should_protect(:study_subject_id, :study_subject)
7
+ assert_should_not_require_attributes(
8
+ :address_id,
9
+ :current_address,
10
+ :address_at_diagnosis,
11
+ :is_valid,
12
+ :why_invalid,
13
+ :is_verified,
14
+ :how_verified,
15
+ :valid_from,
16
+ :valid_to,
17
+ :verified_on,
18
+ :verified_by_uid )
19
+ # :data_source_id )
20
+ assert_should_initially_belong_to(
21
+ :study_subject,
22
+ :address )
23
+ assert_should_require_attribute_length(
24
+ :why_invalid,
25
+ :how_verified,
26
+ :maximum => 250 )
27
+ assert_requires_complete_date(
28
+ :valid_from,
29
+ :valid_to )
30
+
31
+ test "explicit Factory addressing test" do
32
+ assert_difference('StudySubject.count',1) {
33
+ assert_difference('Address.count',1) {
34
+ assert_difference('Addressing.count',1) {
35
+ addressing = Factory(:addressing)
36
+ assert_not_nil addressing.address
37
+ assert_not_nil addressing.study_subject
38
+ assert_equal 1, addressing.is_valid
39
+ # assert_equal 2, addressing.is_verified
40
+ assert !addressing.is_verified # noticed that this is NOT int for YNDK, but boolean
41
+ } } }
42
+ end
43
+
44
+ test "explicity Factory mailing_addressing test" do
45
+ assert_difference('StudySubject.count',1) {
46
+ assert_difference('Address.count',1) {
47
+ assert_difference('Addressing.count',1) {
48
+ addressing = Factory(:mailing_addressing)
49
+ assert_equal addressing.address.address_type,
50
+ AddressType['mailing']
51
+ assert_equal addressing.current_address, YNDK[:no]
52
+ } } }
53
+ end
54
+
55
+ test "explicity Factory current_mailing_addressing test" do
56
+ assert_difference('StudySubject.count',1) {
57
+ assert_difference('Address.count',1) {
58
+ assert_difference('Addressing.count',1) {
59
+ addressing = Factory(:current_mailing_addressing)
60
+ assert_equal addressing.address.address_type,
61
+ AddressType['mailing']
62
+ assert_equal addressing.current_address, YNDK[:yes]
63
+ } } }
64
+ end
65
+
66
+ test "explicity Factory residence_addressing test" do
67
+ assert_difference('StudySubject.count',1) {
68
+ assert_difference('Address.count',1) {
69
+ assert_difference('Addressing.count',1) {
70
+ addressing = Factory(:residence_addressing)
71
+ assert_equal addressing.address.address_type,
72
+ AddressType['residence']
73
+ assert_equal addressing.current_address, YNDK[:no]
74
+ } } }
75
+ end
76
+
77
+ test "explicity Factory current_residence_addressing test" do
78
+ assert_difference('StudySubject.count',1) {
79
+ assert_difference('Address.count',1) {
80
+ assert_difference('Addressing.count',1) {
81
+ addressing = Factory(:current_residence_addressing)
82
+ assert_equal addressing.address.address_type,
83
+ AddressType['residence']
84
+ assert_equal addressing.current_address, YNDK[:yes]
85
+ } } }
86
+ end
87
+
88
+ test "current_address should default to 1" do
89
+ addressing = Addressing.new
90
+ assert_equal 1, addressing.current_address
91
+ end
92
+
93
+ #
94
+ # addressing uses accepts_attributes_for :address
95
+ # so the addressing can't require address_id on create
96
+ # or this test fails.
97
+ #
98
+ # test "should require address on update" do
99
+ # assert_difference("Addressing.count", 1 ) do
100
+ # addressing = create_addressing(:address_id => nil)
101
+ # addressing.reload.update_attributes(
102
+ # :created_at => Date.yesterday )
103
+ # assert addressing.errors.on(:address)
104
+ # end
105
+ # end
106
+
107
+
108
+ test "should require data_source_other if data_source is other" do
109
+ assert_difference( "Addressing.count", 0 ) {
110
+ # assert_difference( "Address.count", 0 ) {
111
+ # The factory will create the associations regardless
112
+ # so an Address and StudySubject gets created regardless
113
+ addressing = create_addressing( :data_source => DataSource['Other'] )
114
+ assert addressing.errors.on_attr_and_type?(:data_source_other,:blank)
115
+ } # }
116
+ end
117
+
118
+ test "should NOT require data_source_other if data_source is not other" do
119
+ assert_difference( "Address.count", 1 ) {
120
+ assert_difference( "Addressing.count", 1 ) {
121
+ addressing = create_addressing( :data_source => DataSource['raf'])
122
+ assert !addressing.errors.on_attr_and_type?(:data_source_other,:blank)
123
+ } }
124
+ end
125
+
126
+ test "should require a valid address with address_attributes" do
127
+ assert_difference("Address.count", 0 ) {
128
+ assert_difference("Addressing.count", 0 ) {
129
+ addressing = create_addressing(:address_id => nil,
130
+ :address_attributes => {} )
131
+ } }
132
+ end
133
+
134
+ [:yes,:nil].each do |yndk|
135
+ test "should NOT require why_invalid if is_valid is #{yndk}" do
136
+ assert_difference("Addressing.count", 1 ) do
137
+ addressing = create_addressing(:is_valid => YNDK[yndk])
138
+ end
139
+ end
140
+ end
141
+ [:no,:dk].each do |yndk|
142
+ test "should require why_invalid if is_valid is #{yndk}" do
143
+ assert_difference("Addressing.count", 0 ) do
144
+ addressing = create_addressing(:is_valid => YNDK[yndk])
145
+ assert addressing.errors.on(:why_invalid)
146
+ end
147
+ end
148
+ end
149
+
150
+ test "should NOT require how_verified if is_verified is false" do
151
+ assert_difference("Addressing.count", 1 ) do
152
+ addressing = create_addressing(:is_verified => false)
153
+ end
154
+ end
155
+ test "should require how_verified if is_verified is true" do
156
+ assert_difference("Addressing.count", 0 ) do
157
+ addressing = create_addressing(:is_verified => true)
158
+ assert addressing.errors.on(:how_verified)
159
+ end
160
+ end
161
+
162
+
163
+ test "should NOT set verified_on if is_verified NOT changed to true" do
164
+ addressing = create_addressing(:is_verified => false)
165
+ assert_nil addressing.verified_on
166
+ end
167
+
168
+
169
+ test "should set verified_on if is_verified changed to true" do
170
+ addressing = create_addressing(:is_verified => true,
171
+ :how_verified => "not a clue")
172
+ assert_not_nil addressing.verified_on
173
+ end
174
+
175
+ test "should set verified_on to NIL if is_verified changed to false" do
176
+ addressing = create_addressing(:is_verified => true,
177
+ :how_verified => "not a clue")
178
+ assert_not_nil addressing.verified_on
179
+ addressing.update_attributes(:is_verified => false)
180
+ assert_nil addressing.verified_on
181
+ end
182
+
183
+ test "should NOT set verified_by_uid if is_verified NOT changed to true" do
184
+ addressing = create_addressing(:is_verified => false)
185
+ assert_nil addressing.verified_by_uid
186
+ end
187
+
188
+ test "should set verified_by_uid to 0 if is_verified changed to true" do
189
+ addressing = create_addressing(:is_verified => true,
190
+ :how_verified => "not a clue")
191
+ assert_not_nil addressing.verified_by_uid
192
+ assert_equal addressing.verified_by_uid, ''
193
+ end
194
+
195
+ test "should set verified_by_uid to current_user.id if is_verified " <<
196
+ "changed to true if current_user passed" do
197
+ cu = admin_user
198
+ addressing = create_addressing(:is_verified => true,
199
+ :current_user => cu,
200
+ :how_verified => "not a clue")
201
+ assert_not_nil addressing.verified_by_uid
202
+ assert_equal addressing.verified_by_uid, cu.uid
203
+ end
204
+
205
+ test "should set verified_by_uid to NIL if is_verified changed to false" do
206
+ addressing = create_addressing(:is_verified => true,
207
+ :how_verified => "not a clue")
208
+ assert_not_nil addressing.verified_by_uid
209
+ addressing.update_attributes(:is_verified => false)
210
+ assert_nil addressing.verified_by_uid
211
+ end
212
+
213
+
214
+ test "should only return current addressings" do
215
+ create_addressing(:current_address => YNDK[:yes])
216
+ create_addressing(:current_address => YNDK[:no])
217
+ create_addressing(:current_address => YNDK[:dk])
218
+ addressing = Addressing.current
219
+ assert_equal 2, addressing.length
220
+ addressing.each do |addressing|
221
+ assert [1,999].include?(addressing.current_address)
222
+ end
223
+ end
224
+
225
+ test "should only return historic addressings" do
226
+ create_addressing(:current_address => YNDK[:yes])
227
+ create_addressing(:current_address => YNDK[:no])
228
+ create_addressing(:current_address => YNDK[:dk])
229
+ addressing = Addressing.historic
230
+ assert_equal 1, addressing.length
231
+ addressing.each do |addressing|
232
+ assert ![1,999].include?(addressing.current_address)
233
+ end
234
+ end
235
+
236
+ test "should make study_subject ineligible "<<
237
+ "on create if state NOT 'CA' and address is ONLY residence" do
238
+ study_subject = create_eligible_hx_study_subject
239
+ assert_difference('OperationalEvent.count',1) {
240
+ assert_difference('Addressing.count',1) {
241
+ assert_difference('Address.count',1) {
242
+ create_az_addressing(study_subject)
243
+ } } }
244
+ assert_study_subject_is_not_eligible(study_subject)
245
+ hxe = study_subject.enrollments.find_by_project_id(Project['HomeExposures'].id)
246
+ assert_equal hxe.ineligible_reason,
247
+ IneligibleReason['newnonCA']
248
+ end
249
+
250
+ test "should make study_subject ineligible "<<
251
+ "on create if state NOT 'CA' and address is ANOTHER residence" do
252
+ study_subject = create_eligible_hx_study_subject
253
+ assert_difference('OperationalEvent.count',1) {
254
+ assert_difference('Address.count',2) {
255
+ assert_difference("Addressing.count", 2 ) {
256
+ create_ca_addressing(study_subject)
257
+ create_az_addressing(study_subject)
258
+ } } }
259
+ assert_study_subject_is_not_eligible(study_subject)
260
+ hxe = study_subject.enrollments.find_by_project_id(Project['HomeExposures'].id)
261
+ assert_equal hxe.ineligible_reason,
262
+ IneligibleReason['moved']
263
+ end
264
+
265
+ test "should NOT make study_subject ineligible "<<
266
+ "on create if OET is missing" do
267
+ OperationalEventType['ineligible'].destroy
268
+ study_subject = create_eligible_hx_study_subject
269
+ assert_difference('OperationalEvent.count',0) {
270
+ assert_difference('Address.count',1) {
271
+ assert_difference("Addressing.count", 1 ) {
272
+ create_ca_addressing(study_subject)
273
+ assert_raise(ActiveRecord::RecordNotSaved){
274
+ create_az_addressing(study_subject)
275
+ } } } }
276
+ assert_study_subject_is_eligible(study_subject)
277
+ end
278
+
279
+ test "should NOT make study_subject ineligible "<<
280
+ "on create if state NOT 'CA' and address is NOT residence" do
281
+ study_subject = create_eligible_hx_study_subject
282
+ assert_difference('OperationalEvent.count',0) {
283
+ assert_difference('Address.count',1) {
284
+ assert_difference("Addressing.count", 1 ) {
285
+ create_az_addressing(study_subject,
286
+ :address => { :address_type => AddressType['mailing'] })
287
+ } } }
288
+ assert_study_subject_is_eligible(study_subject)
289
+ end
290
+
291
+ test "should NOT make study_subject ineligible "<<
292
+ "on create if state 'CA' and address is residence" do
293
+ study_subject = create_eligible_hx_study_subject
294
+ assert_difference('OperationalEvent.count',0) {
295
+ assert_difference('Address.count',1) {
296
+ assert_difference("Addressing.count", 1 ) {
297
+ create_ca_addressing(study_subject)
298
+ } } }
299
+ assert_study_subject_is_eligible(study_subject)
300
+ end
301
+
302
+ %w( address_type address_type_id
303
+ line_1 line_2 unit city state zip csz county ).each do |method_name|
304
+ test "should respond to #{method_name}" do
305
+ addressing = create_addressing
306
+ assert addressing.respond_to?(method_name)
307
+ end
308
+ end
309
+
310
+
311
+ # '1' and '0' are the default values for a checkbox.
312
+ # I probably should add a condition to this event that
313
+ # the address_type be 'Residence', but I've left that to the view.
314
+ # addressing = Factory(:current_residence_addressing)
315
+
316
+ test "should NOT add 'subject_moved' event to subject if subject_moved is '1'" <<
317
+ " if not residence address" do
318
+ addressing = Factory(:current_mailing_addressing)
319
+ assert_difference('OperationalEvent.count',0) {
320
+ addressing.update_attributes(
321
+ :current_address => '2',
322
+ :subject_moved => '1')
323
+ }
324
+ end
325
+
326
+ test "should NOT add 'subject_moved' event to subject if subject_moved is '1'" <<
327
+ " if was not current address" do
328
+ addressing = Factory(:residence_addressing)
329
+ assert_difference('OperationalEvent.count',0) {
330
+ addressing.update_attributes(
331
+ :current_address => '2',
332
+ :subject_moved => '1')
333
+ }
334
+ end
335
+
336
+ test "should add 'subject_moved' event to subject if subject_moved is '1'" do
337
+ addressing = Factory(:current_residence_addressing)
338
+ assert_difference('OperationalEvent.count',1) {
339
+ addressing.update_attributes(
340
+ :current_address => '2',
341
+ :subject_moved => '1')
342
+ }
343
+ end
344
+
345
+ test "should not add 'subject_moved' event to subject if subject_moved is '0'" do
346
+ addressing = Factory(:current_residence_addressing)
347
+ assert_difference('OperationalEvent.count',0) {
348
+ addressing.update_attributes(
349
+ :current_address => '2',
350
+ :subject_moved => '0')
351
+ }
352
+ end
353
+
354
+ test "should add 'subject_moved' event to subject if subject_moved is 'true'" do
355
+ addressing = Factory(:current_residence_addressing)
356
+ assert_difference('OperationalEvent.count',1) {
357
+ addressing.update_attributes(
358
+ :current_address => '2',
359
+ :subject_moved => 'true')
360
+ }
361
+ end
362
+
363
+ test "should not add 'subject_moved' event to subject if subject_moved is 'false'" do
364
+ addressing = Factory(:current_residence_addressing)
365
+ assert_difference('OperationalEvent.count',0) {
366
+ addressing.update_attributes(
367
+ :current_address => '2',
368
+ :subject_moved => 'false')
369
+ }
370
+ end
371
+
372
+ test "should not add 'subject_moved' event to subject if subject_moved is nil" do
373
+ addressing = Factory(:current_residence_addressing)
374
+ assert_difference('OperationalEvent.count',0) {
375
+ addressing.update_attributes(
376
+ :current_address => '2',
377
+ :subject_moved => nil)
378
+ }
379
+ end
380
+
381
+ # current_address has a database default of 1
382
+ [ :current_address ].each do |field|
383
+
384
+ # Making assumption that 12345 will NEVER be a valid value.
385
+ test "should NOT allow 12345 for #{field}" do
386
+ addressing = Addressing.new(field => 12345)
387
+ addressing.valid?
388
+ assert addressing.errors.on_attr_and_type?(field,:inclusion)
389
+ end
390
+
391
+ # test "should allow nil for #{field}" do
392
+ # addressing = Addressing.new(field => nil)
393
+ # assert_nil addressing.send(field)
394
+ # addressing.valid?
395
+ # assert !addressing.errors.on(field)
396
+ # end
397
+
398
+ test "should allow all valid YNDK values for #{field}" do
399
+ addressing = Addressing.new
400
+ YNDK.valid_values.each do |value|
401
+ addressing.send("#{field}=", value)
402
+ addressing.valid?
403
+ assert !addressing.errors.on(field)
404
+ end
405
+ end
406
+
407
+ end
408
+
409
+ [ :is_valid, :address_at_diagnosis ].each do |field|
410
+
411
+ # Making assumption that 12345 will NEVER be a valid value.
412
+ test "should NOT allow 12345 for #{field}" do
413
+ addressing = Addressing.new(field => 12345)
414
+ addressing.valid?
415
+ assert addressing.errors.on_attr_and_type?(field,:inclusion)
416
+ end
417
+
418
+ test "should allow nil for #{field}" do
419
+ addressing = Addressing.new(field => nil)
420
+ assert_nil addressing.send(field)
421
+ addressing.valid?
422
+ assert !addressing.errors.on(field)
423
+ end
424
+
425
+ test "should allow all valid YNDK values for #{field}" do
426
+ addressing = Addressing.new
427
+ YNDK.valid_values.each do |value|
428
+ addressing.send("#{field}=", value)
429
+ addressing.valid?
430
+ assert !addressing.errors.on(field)
431
+ end
432
+ end
433
+
434
+ end
435
+
436
+ protected
437
+
438
+ # def create_addressing(options={})
439
+ # addressing = Factory.build(:addressing,options)
440
+ # addressing.save
441
+ # addressing
442
+ # end
443
+
444
+ def create_addressing_with_address(study_subject,options={})
445
+ create_addressing({
446
+ :study_subject => study_subject,
447
+ # doesn't work in rcov for some reason
448
+ # :address => nil, # block address_attributes
449
+ :address_id => nil, # block address_attributes
450
+ :address_attributes => Factory.attributes_for(:address,{
451
+ :address_type => AddressType['residence']
452
+ }.merge(options[:address]||{}))
453
+ }.merge(options[:addressing]||{}))
454
+ end
455
+
456
+ def create_ca_addressing(study_subject,options={})
457
+ create_addressing_with_address(study_subject,{
458
+ :address => {:state => 'CA'}}.merge(options))
459
+ end
460
+
461
+ def create_az_addressing(study_subject,options={})
462
+ create_addressing_with_address(study_subject,{
463
+ :address => {:state => 'AZ'}}.merge(options))
464
+ end
465
+
466
+ end