surveyor 0.8.0 → 0.9.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.
- data/README.md +22 -5
- data/VERSION +1 -1
- data/app/models/dependency.rb +16 -32
- data/app/models/question.rb +1 -1
- data/app/models/question_group.rb +1 -1
- data/app/models/response.rb +1 -4
- data/app/models/response_set.rb +4 -3
- data/app/models/survey.rb +0 -1
- data/app/models/validation.rb +20 -0
- data/app/models/validation_condition.rb +19 -17
- data/generators/surveyor/surveyor_generator.rb +9 -5
- data/generators/surveyor/templates/migrate/add_display_order_to_surveys.rb +9 -0
- data/generators/surveyor/templates/surveys/kitchen_sink_survey.rb +15 -4
- data/lib/surveyor.rb +16 -0
- data/script/surveyor/answer.rb +32 -55
- data/script/surveyor/base.rb +61 -0
- data/script/surveyor/dependency.rb +4 -41
- data/script/surveyor/dependency_condition.rb +13 -38
- data/script/surveyor/question.rb +16 -50
- data/script/surveyor/question_group.rb +7 -19
- data/script/surveyor/specs/answer_spec.rb +15 -52
- data/script/surveyor/specs/question_spec.rb +37 -85
- data/script/surveyor/specs/spec_helper.rb +6 -0
- data/script/surveyor/specs/survey_section_spec.rb +23 -0
- data/script/surveyor/specs/validation_condition_spec.rb +20 -0
- data/script/surveyor/specs/validation_spec.rb +20 -0
- data/script/surveyor/survey.rb +10 -85
- data/script/surveyor/survey_parser.rb +160 -38
- data/script/surveyor/survey_section.rb +6 -130
- data/script/surveyor/validation.rb +19 -0
- data/script/surveyor/validation_condition.rb +19 -0
- data/spec/lib/surveyor_spec.rb +44 -0
- data/spec/models/dependency_spec.rb +9 -16
- data/spec/models/question_group_spec.rb +3 -3
- data/spec/models/question_spec.rb +1 -1
- data/spec/models/validation_condition_spec.rb +29 -0
- data/spec/models/validation_spec.rb +27 -0
- data/spec/spec_helper.rb +0 -2
- data/surveyor.gemspec +12 -7
- metadata +12 -7
- data/lib/tiny_code.rb +0 -58
- data/script/surveyor/columnizer.rb +0 -36
- data/script/surveyor/specs/question_dependency_spec.rb +0 -46
- data/script/surveyor/specs/question_group_spec.rb +0 -9
- data/script/surveyor/specs/section_spec.rb +0 -58
@@ -0,0 +1,61 @@
|
|
1
|
+
class SurveyParser
|
2
|
+
class Base
|
3
|
+
|
4
|
+
# Class level instance variable, because class variable are shared with subclasses
|
5
|
+
class << self
|
6
|
+
attr_accessor :children
|
7
|
+
end
|
8
|
+
|
9
|
+
@children = []
|
10
|
+
|
11
|
+
# Class methods
|
12
|
+
def self.inherited(subclass)
|
13
|
+
# set the class level instance variable default on subclasses
|
14
|
+
subclass.instance_variable_set(:@children, self.instance_variable_get(:@children))
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.has_children(*args)
|
18
|
+
args.each{|model| attr_accessor model}
|
19
|
+
self.instance_variable_set(:@children, args)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Instance methods
|
23
|
+
def initialize(obj, args, opts)
|
24
|
+
# inherit the parser from parent (obj)
|
25
|
+
self.parser = (obj.nil? ? nil : obj.class == SurveyParser ? obj : obj.parser)
|
26
|
+
# get a new id from the parser
|
27
|
+
self.id = parser.nil? ? nil : parser.send("new_#{self.class.name.underscore}_id")
|
28
|
+
# set [parent]_id to obj.id, if we have that attribute
|
29
|
+
self.send("#{obj.class.name.underscore}_id=", obj.nil? ? nil : obj.id) if self.respond_to?("#{obj.class.name.underscore}_id=")
|
30
|
+
# initialize descendant models
|
31
|
+
self.class.children.each{|model| self.send("#{model}=", [])}
|
32
|
+
# combine default options, parsed opts, parsed args, and initialize instance variables
|
33
|
+
self.default_options.merge(parse_opts(opts)).merge(parse_args(args)).each{|k,v| self.send("#{k.to_s}=", v)}
|
34
|
+
# print to the log
|
35
|
+
print "#{self.class.name.gsub(/[a-z]/, "")[-1,1]}#{self.id} "
|
36
|
+
end
|
37
|
+
def default_options
|
38
|
+
{}
|
39
|
+
end
|
40
|
+
def parse_opts(opts)
|
41
|
+
opts.reject{|k,v| k == :method_name} # toss the method name by default
|
42
|
+
end
|
43
|
+
def parse_args(args)
|
44
|
+
args[0] || {}
|
45
|
+
end
|
46
|
+
|
47
|
+
# Filter out attributes that shouldn't be in fixtures, including children, parser, placeholders
|
48
|
+
def yml_attrs
|
49
|
+
instance_variables.sort - self.class.children.map{|model| "@#{model.to_s}"} - %w(@parser @dependency @validation @question_reference @answer_reference)
|
50
|
+
end
|
51
|
+
def to_yml
|
52
|
+
out = [ %(#{@data_export_identifier}_#{@id}:) ]
|
53
|
+
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
54
|
+
(out << nil ).join("\r\n")
|
55
|
+
end
|
56
|
+
def to_file
|
57
|
+
File.open(self.parser.send("#{self.class.name.underscore.pluralize}_yml"), File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
|
58
|
+
self.class.children.each{|model| self.send(model).compact.map(&:to_file)}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -1,48 +1,11 @@
|
|
1
|
-
class Dependency
|
2
|
-
|
1
|
+
class Dependency < SurveyParser::Base
|
3
2
|
# Context, Conditional, Children
|
4
3
|
attr_accessor :id, :question_id, :question_group_id, :parser
|
5
4
|
attr_accessor :rule
|
6
|
-
|
5
|
+
has_children :dependency_conditions
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
self.parser = question.parser
|
11
|
-
self.id = parser.new_dependency_id
|
12
|
-
if question.class == QuestionGroup
|
13
|
-
self.question_group_id = question.id
|
14
|
-
else
|
15
|
-
self.question_id = question.id
|
16
|
-
end
|
17
|
-
self.rule = (args[0] || {})[:rule]
|
18
|
-
self.dependency_conditions = []
|
19
|
-
self.default_options().merge(options).merge(args[1] || {}).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
7
|
+
def parse_opts(opts)
|
8
|
+
{} # toss the method name and reference identifier by default
|
20
9
|
end
|
21
|
-
|
22
|
-
def default_options()
|
23
|
-
{}
|
24
|
-
end
|
25
|
-
|
26
|
-
# Injecting the id of the current dependency object into the dependency_condition on assignment
|
27
|
-
def add_dependency_condition(dc_obj)
|
28
|
-
dc_obj.dependency_id = self.id
|
29
|
-
self.dependency_conditions << dc_obj
|
30
|
-
end
|
31
|
-
|
32
|
-
def yml_attrs
|
33
|
-
instance_variables.sort - ["@parser", "@dependency_conditions", "@reference_identifier"]
|
34
|
-
end
|
35
|
-
def to_yml
|
36
|
-
out = [ %(#{@data_export_identifier}_#{@id}:) ]
|
37
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
38
|
-
(out << nil ).join("\r\n")
|
39
|
-
end
|
40
|
-
|
41
|
-
def to_file
|
42
|
-
File.open(self.parser.dependencies_yml, File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
|
43
|
-
self.dependency_conditions.compact.map(&:to_file)
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
10
|
|
48
11
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class DependencyCondition
|
1
|
+
class DependencyCondition < SurveyParser::Base
|
2
2
|
|
3
3
|
# Context, Conditional, Value
|
4
4
|
attr_accessor :id, :dependency_id, :rule_key, :parser
|
@@ -6,58 +6,33 @@ class DependencyCondition
|
|
6
6
|
attr_accessor :answer_id, :datetime_value, :integer_value, :float_value, :unit, :text_value, :string_value, :response_other
|
7
7
|
attr_accessor :question_reference, :answer_reference
|
8
8
|
|
9
|
-
|
10
|
-
def initialize(dependency, args, options)
|
11
|
-
self.parser = dependency.parser
|
12
|
-
self.id = parser.new_dependency_condition_id
|
13
|
-
self.dependency_id = dependency.id
|
14
|
-
args_options = parse_args_options(args)
|
15
|
-
self.default_options().merge(options).merge(args_options).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
16
|
-
end
|
17
|
-
|
18
|
-
def default_options()
|
9
|
+
def default_options
|
19
10
|
{ :operator => "==" }
|
20
11
|
end
|
21
|
-
|
22
|
-
def parse_args_options(args)
|
12
|
+
def parse_args(args)
|
23
13
|
a0, a1, a2 = args
|
24
|
-
|
25
|
-
a2.is_a?(Hash) ? options.merge(a2) : options.merge({:answer_reference => a2.to_s.gsub("a_", "")})
|
26
|
-
end
|
27
|
-
|
28
|
-
def yml_attrs
|
29
|
-
instance_variables.sort - ["@parser", "@question_reference", "@answer_reference", "@reference_identifier"]
|
14
|
+
{:question_reference => a0.to_s.gsub("q_", ""), :operator => a1}.merge(a2.is_a?(Hash) ? a2 : {:answer_reference => a2.to_s.gsub("a_", "")})
|
30
15
|
end
|
31
|
-
def
|
32
|
-
|
33
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
34
|
-
(out << nil ).join("\r\n")
|
16
|
+
def parse_opts(opts)
|
17
|
+
{:rule_key => opts[:reference_identifier]}
|
35
18
|
end
|
36
|
-
|
19
|
+
|
37
20
|
def reconcile_dependencies
|
38
21
|
# Looking up references to questions and answers for linking the dependency objects
|
39
|
-
|
40
|
-
ref_question =
|
41
|
-
|
42
|
-
puts " found question: #{ref_question.data_export_identifier} (id:#{ref_question.id})"
|
22
|
+
print "Lookup Q ref #{@question_reference}:"
|
23
|
+
if (ref_question = parser.current_survey.find_question_by_reference(@question_reference))
|
24
|
+
print " found Q#{ref_question.id} "
|
43
25
|
@question_id = ref_question.id
|
44
|
-
|
45
|
-
if ref_answer
|
26
|
+
print "Lookup A ref #{@answer_reference}"
|
27
|
+
if (ref_answer = ref_question.find_answer_by_reference(@answer_reference))
|
28
|
+
print " found A#{ref_answer.id} "
|
46
29
|
@answer_id = ref_answer.id
|
47
30
|
else
|
48
31
|
raise "Could not find referenced answer #{@answer_reference}"
|
49
32
|
end
|
50
|
-
|
51
33
|
else
|
52
34
|
raise "Could not find referenced question #{@question_reference}"
|
53
35
|
end
|
54
36
|
end
|
55
37
|
|
56
|
-
def to_file
|
57
|
-
# Reconciling the references used in the dsl to actual object ids
|
58
|
-
#puts "Reconcile of dependency:"
|
59
|
-
# reconcile_dependencies
|
60
|
-
File.open(self.parser.dependency_conditions_yml, File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
|
61
|
-
end
|
62
|
-
|
63
38
|
end
|
data/script/surveyor/question.rb
CHANGED
@@ -1,67 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class Question
|
4
|
-
include Columnizer
|
5
|
-
|
1
|
+
class Question < SurveyParser::Base
|
6
2
|
# Context, Content, Reference, Display, Children
|
7
3
|
attr_accessor :id, :parser, :survey_section_id, :question_group_id
|
8
4
|
attr_accessor :text, :short_text, :help_text, :pick
|
9
|
-
attr_accessor :reference_identifier, :data_export_identifier, :common_namespace, :
|
5
|
+
attr_accessor :reference_identifier, :data_export_identifier, :common_namespace, :common_identifier
|
10
6
|
attr_accessor :display_order, :display_type, :is_mandatory, :display_width, :custom_class, :custom_renderer
|
11
|
-
attr_accessor :
|
7
|
+
attr_accessor :dependency
|
8
|
+
has_children :answers
|
12
9
|
|
13
|
-
def
|
14
|
-
|
15
|
-
self.id = parser.new_question_id
|
16
|
-
self.display_order = self.id
|
17
|
-
self.survey_section_id = section.id
|
18
|
-
self.text = args[0]
|
19
|
-
self.answers = []
|
20
|
-
self.dependency = nil
|
21
|
-
self.default_options(text).merge(options).merge(args[1] || {}).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
22
|
-
end
|
23
|
-
|
24
|
-
def default_options(text)
|
25
|
-
{ :short_text => text,
|
26
|
-
:pick => :none,
|
10
|
+
def default_options
|
11
|
+
{ :pick => :none,
|
27
12
|
:display_type => :default,
|
28
13
|
:is_mandatory => true,
|
29
|
-
:
|
14
|
+
:display_order => self.id
|
30
15
|
}
|
31
16
|
end
|
32
|
-
|
33
|
-
|
34
|
-
def dependency=(dep)
|
35
|
-
unless dep.nil?
|
36
|
-
dep.question_id = self.id
|
37
|
-
end
|
38
|
-
@dependency = dep
|
17
|
+
def parse_opts(opts)
|
18
|
+
(name = opts.delete(:method_name)) =~ /label|image/ ? opts.merge(:display_type => name) : opts
|
39
19
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
count = 0
|
44
|
-
puts "Looking up answer with ref: #{ref_id}"
|
45
|
-
while answer.nil? and count < self.answers.size
|
46
|
-
answer = self.answers[count] if self.answers[count].reference_identifier == ref_id
|
47
|
-
count += 1
|
48
|
-
end
|
49
|
-
puts " found answer: '#{answer.text}' (id:#{answer.id})" unless answer.nil?
|
50
|
-
answer
|
20
|
+
def parse_args(args)
|
21
|
+
text = args[0] || "Question"
|
22
|
+
{:text => text, :short_text => text, :data_export_identifier => Surveyor.to_normalized_string(text)}.merge(args[1] || {})
|
51
23
|
end
|
52
24
|
|
53
|
-
def
|
54
|
-
|
55
|
-
end
|
56
|
-
def to_yml
|
57
|
-
out = [ %(#{@data_export_identifier}_#{@id}:) ]
|
58
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
59
|
-
(out << nil ).join("\r\n")
|
25
|
+
def find_answer_by_reference(ref_id)
|
26
|
+
self.answers.detect{|a| a.reference_identifier == ref_id}
|
60
27
|
end
|
61
|
-
|
28
|
+
|
62
29
|
def to_file
|
63
|
-
|
64
|
-
self.answers.compact.map(&:to_file)
|
30
|
+
super
|
65
31
|
if self.dependency then self.dependency.to_file end
|
66
32
|
end
|
67
33
|
|
@@ -1,5 +1,4 @@
|
|
1
|
-
class QuestionGroup
|
2
|
-
|
1
|
+
class QuestionGroup < SurveyParser::Base
|
3
2
|
# Context, Content, Display, Children
|
4
3
|
attr_accessor :id, :parser
|
5
4
|
attr_accessor :text, :help_text
|
@@ -7,29 +6,18 @@ class QuestionGroup
|
|
7
6
|
attr_accessor :display_type, :custom_class, :custom_renderer
|
8
7
|
attr_accessor :dependency
|
9
8
|
|
10
|
-
|
11
|
-
def initialize(section, args, options)
|
12
|
-
self.parser = section.parser
|
13
|
-
self.id = parser.new_question_group_id
|
14
|
-
self.text = args[0]
|
15
|
-
self.default_options().merge(options).merge(args[1] || {}).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
16
|
-
end
|
17
|
-
|
18
|
-
def default_options()
|
9
|
+
def default_options
|
19
10
|
{:display_type => "default"}
|
20
11
|
end
|
21
|
-
|
22
|
-
|
23
|
-
instance_variables.sort - ["@parser", "@dependency"]
|
12
|
+
def parse_args(args)
|
13
|
+
{:text => args[0] || "Question Group"}.merge(args[1] || {})
|
24
14
|
end
|
25
|
-
def
|
26
|
-
|
27
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
28
|
-
(out << nil ).join("\r\n")
|
15
|
+
def parse_opts(opts)
|
16
|
+
(name = opts.delete(:method_name)) =~ /grid|repeater/ ? opts.merge(:display_type => name) : opts
|
29
17
|
end
|
30
18
|
|
31
19
|
def to_file
|
32
|
-
|
20
|
+
super
|
33
21
|
if self.dependency then self.dependency.to_file end
|
34
22
|
end
|
35
23
|
|
@@ -1,66 +1,29 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'answer'
|
2
3
|
|
3
4
|
describe Answer, " when first created" do
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
before do
|
12
|
-
@ans = Answer.new(TEST_ID, TEST_QUESTION_ID, TEST_CONTEXT_ID, TEST_TEXT, TEST_OPTIONS)
|
6
|
+
before(:each) do
|
7
|
+
question = mock("Question", :id => 2, :parser => mock("Parser", :new_answer_id => 1))
|
8
|
+
question.stub!(:class => Question)
|
9
|
+
options = {:help_text => "Never or rarely ever", :reference_identifier => "b3a_1"}
|
10
|
+
@ans = Answer.new(question, ["No / Rarely"], options)
|
13
11
|
end
|
14
12
|
|
15
13
|
it "should set inititalized variables to those passed in" do
|
16
|
-
@ans.id.should ==
|
17
|
-
@ans.question_id.should ==
|
18
|
-
@ans.
|
19
|
-
@ans.text.should ==
|
20
|
-
@ans.help_text.should ==
|
21
|
-
|
14
|
+
@ans.id.should == 1
|
15
|
+
@ans.question_id.should == 2
|
16
|
+
@ans.reference_identifier.should == "b3a_1"
|
17
|
+
@ans.text.should == "No / Rarely"
|
18
|
+
@ans.help_text.should == "Never or rarely ever"
|
19
|
+
end
|
22
20
|
|
23
21
|
it "should output current state to yml" do
|
24
22
|
@ans.should.respond_to?(:to_yml)
|
25
23
|
end
|
26
|
-
|
27
|
-
it "should create a normalized code from the answer text" do
|
28
|
-
# The answer object should take the title of the text and convert
|
29
|
-
# it to a code that is more appropirate for a database entry
|
30
|
-
|
31
|
-
# Taking a few answers from the survey for testing
|
32
|
-
str = []
|
33
|
-
str[0] = "This? is a in - t3rrible-@nswer of! (question) on"
|
34
|
-
str[1] = "Private insurance/ HMO/ PPO"
|
35
|
-
str[2] = "VA"
|
36
|
-
str[3] = "PMS (Premenstrual syndrome)/ PMDD (Premenstrual Dysphoric Disorder)"
|
37
|
-
str[4] = "Have never been employed outside the home"
|
38
|
-
str[5] = "Professional"
|
39
|
-
str[6] = "Not working because of temporary disability, but expect to return to a job"
|
40
|
-
|
41
|
-
# What the results should look like
|
42
|
-
r_str = []
|
43
|
-
r_str[0] = "this_t3rrible_nswer"
|
44
|
-
r_str[1] = "private_insurance_hmo_ppo"
|
45
|
-
r_str[2] = "va"
|
46
|
-
r_str[3] = "pms_pmdd"
|
47
|
-
r_str[4] = "never_been_employed_outside_home"
|
48
|
-
r_str[5] = "professional"
|
49
|
-
r_str[6] = "temporary_disability_expect_return_job"
|
50
|
-
|
51
|
-
count = 0
|
52
|
-
str.each do |s|
|
53
|
-
|
54
|
-
code = Answer.to_normalized_code(s)
|
55
|
-
code.should eql(r_str[count])
|
56
|
-
count += 1
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
24
|
+
|
62
25
|
it "should create a normalized code automatically when initalized" do
|
63
|
-
@ans.
|
26
|
+
@ans.data_export_identifier.should eql("no_rarely")
|
64
27
|
end
|
65
28
|
|
66
29
|
end
|
@@ -1,111 +1,63 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'question'
|
2
3
|
|
3
4
|
describe Question, " when first created" do
|
4
|
-
TEST_ID = 1
|
5
|
-
TEST_CONTEXT_ID = "B3"
|
6
|
-
TEST_SECTION_ID = 2
|
7
|
-
TEST_TEXT = "In the past 12 months how many times have you been to a doctor?"
|
8
|
-
TEST_HELP_TEXT = "Please give a rough estimate"
|
9
|
-
TEST_OPTIONS = {:help_text => TEST_HELP_TEXT }
|
10
|
-
TEST_CODE = "many_times_you_been_doctor"
|
11
|
-
|
12
5
|
before do
|
13
|
-
|
6
|
+
section = mock("SurveySection", :id => 2, :parser => mock("Parser", :new_question_id => 1))
|
7
|
+
section.stub!(:class => SurveySection)
|
8
|
+
args = {:help_text => "Please give a rough estimate", :reference_identifier => "B3"}
|
9
|
+
options = {}
|
10
|
+
@ques = Question.new(section, ["In the past 12 months how many times have you been to a doctor?", args], options)
|
14
11
|
end
|
15
12
|
|
16
13
|
it "should set initialization parameters properly" do
|
17
|
-
@ques.id.should ==
|
18
|
-
@ques.
|
19
|
-
@ques.
|
20
|
-
@ques.
|
21
|
-
@ques.options[:help_text].should == TEST_HELP_TEXT
|
14
|
+
@ques.id.should == 1
|
15
|
+
@ques.reference_identifier.should == "B3"
|
16
|
+
@ques.survey_section_id.should == 2
|
17
|
+
@ques.help_text.should == "Please give a rough estimate"
|
22
18
|
|
23
19
|
#Checking the defaults
|
24
|
-
@ques.
|
25
|
-
@ques.
|
26
|
-
@ques.
|
20
|
+
@ques.pick.should == :none
|
21
|
+
@ques.display_type.should == :default
|
22
|
+
@ques.is_mandatory.should == true
|
27
23
|
end
|
28
24
|
|
29
25
|
it "should output current state to yml" do
|
30
26
|
@ques.should.respond_to?(:to_yml)
|
31
27
|
end
|
32
|
-
|
33
|
-
it "should create a normalized code from the answer text" do
|
34
|
-
# The question object should take the title of the text and convert
|
35
|
-
# it to a code that is more appropirate for a database entry
|
36
|
-
|
37
|
-
# Taking a few questions from the survey for testing
|
38
|
-
str = []
|
39
|
-
str[0] = "How long has it been since you last visited a doctor for a routine checkup (routine being not for a particular reason)?"
|
40
|
-
str[1] = "Do you take medications as directed?"
|
41
|
-
str[2] = "Do you every leak urine (or) water when you didn't want to?" #checking for () and ' removal
|
42
|
-
str[3] = "Do your biological family members (not adopted) have a \"history\" of any of the following?"
|
43
|
-
str[4] = "Your health:"
|
44
|
-
str[5] = "In general, you would say your health is:"
|
45
|
-
|
46
|
-
# What the results should look like
|
47
|
-
r_str = []
|
48
|
-
r_str[0] = "visited_doctor_for_routine_checkup"
|
49
|
-
r_str[1] = "you_take_medications_as_directed"
|
50
|
-
r_str[2] = "urine_water_you_didnt_want"
|
51
|
-
r_str[3] = "family_members_history_any_following"
|
52
|
-
r_str[4] = "your_health"
|
53
|
-
r_str[5] = "you_would_say_your_health"
|
54
|
-
|
55
|
-
count = 0
|
56
|
-
str.each do |s|
|
57
|
-
|
58
|
-
code = Question.to_normalized_code(s)
|
59
|
-
code.should eql(r_str[count])
|
60
|
-
count += 1
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
28
|
+
|
66
29
|
it "should create a normalized code automatically when initalized" do
|
67
|
-
@ques.
|
30
|
+
@ques.data_export_identifier.should eql("many_times_you_been_doctor")
|
68
31
|
end
|
69
32
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
33
|
+
# We don't change titles via the DSL
|
34
|
+
# it "should update the normalized code if the title is changed" do
|
35
|
+
# @ques.data_export_identifier.should == "many_times_you_been_doctor"
|
36
|
+
# @ques.text = "Sometimes or All the time?"
|
37
|
+
# @ques.data_export_identifier.should == "sometimes_all_time"
|
38
|
+
# end
|
75
39
|
|
76
40
|
end
|
77
41
|
|
78
|
-
describe Question, "
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
@
|
85
|
-
|
86
|
-
|
87
|
-
ma2.stub!(:context_id).and_return("2")
|
88
|
-
@question.add_answer(ma2)
|
89
|
-
|
90
|
-
ma3 = mock("answer")
|
91
|
-
ma3.stub!(:context_id).and_return("3")
|
92
|
-
@question.add_answer(ma3)
|
93
|
-
|
42
|
+
describe Question, "when it contains data" do
|
43
|
+
before(:each) do
|
44
|
+
section = mock("SurveySection", :id => 2, :parser => mock("Parser", :new_question_id => 1))
|
45
|
+
args = {:help_text => "Please give a rough estimate", :reference_identifier => "B3"}
|
46
|
+
options = {}
|
47
|
+
@ques = Question.new(section, ["In the past 12 months how many times have you been to a doctor?", args], options)
|
48
|
+
@ques.answers << mock("Answer", :reference_identifier => "1", :text => "foo")
|
49
|
+
@ques.answers << mock("Answer", :reference_identifier => "2", :text => "foo")
|
50
|
+
@ques.answers << mock("Answer", :reference_identifier => "3", :text => "foo")
|
94
51
|
end
|
95
|
-
|
52
|
+
|
96
53
|
it "should have added the test answers correctly" do
|
97
|
-
@
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should have a question text" do
|
101
|
-
@question.text.should eql(TEST_TEXT)
|
54
|
+
@ques.answers.length.should eql(3)
|
102
55
|
end
|
103
56
|
|
104
|
-
it "should find an answer by
|
105
|
-
|
106
|
-
a_to_find
|
107
|
-
a_to_find.
|
108
|
-
a_to_find.context_id.should eql("2")
|
57
|
+
it "should find an answer by reference" do
|
58
|
+
a_to_find = @ques.find_answer_by_reference("2")
|
59
|
+
a_to_find.should_not be_nil
|
60
|
+
a_to_find.reference_identifier.should eql("2")
|
109
61
|
end
|
110
62
|
|
111
63
|
end
|