question_chain 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +18 -0
  3. data/Licence.txt +20 -0
  4. data/README.rdoc +34 -0
  5. data/Rakefile +2 -0
  6. data/config/initializers/mustache.rb +2 -0
  7. data/lib/question_chain/answerable.rb +142 -0
  8. data/lib/question_chain/answers.rb +290 -0
  9. data/lib/question_chain/models/answers/question_view.rb +21 -0
  10. data/lib/question_chain/models/answers/ui_object_view.rb +67 -0
  11. data/lib/question_chain/models/answers/ui_objects_check_box_view.rb +17 -0
  12. data/lib/question_chain/models/answers/ui_objects_drop_down_view.rb +16 -0
  13. data/lib/question_chain/models/answers/ui_objects_hidden_field_view.rb +8 -0
  14. data/lib/question_chain/models/answers/ui_objects_object_reference_drop_down_view.rb +18 -0
  15. data/lib/question_chain/models/answers/ui_objects_object_search_view.rb +22 -0
  16. data/lib/question_chain/models/answers/ui_objects_relatable_category_drop_down_view.rb +18 -0
  17. data/lib/question_chain/models/answers/ui_objects_text_field_view.rb +8 -0
  18. data/lib/question_chain/models/chain_template.rb +43 -0
  19. data/lib/question_chain/models/question.rb +37 -0
  20. data/lib/question_chain/models/relatable_category_filter.rb +15 -0
  21. data/lib/question_chain/models/rule.rb +27 -0
  22. data/lib/question_chain/models/rules/attribute_change.rb +28 -0
  23. data/lib/question_chain/models/rules/choice_genenerator.rb +5 -0
  24. data/lib/question_chain/models/rules/populate_drop_down.rb +30 -0
  25. data/lib/question_chain/models/rules/search.rb +19 -0
  26. data/lib/question_chain/models/rules/value_change.rb +22 -0
  27. data/lib/question_chain/models/ui_group.rb +71 -0
  28. data/lib/question_chain/models/ui_object.rb +92 -0
  29. data/lib/question_chain/models/ui_object_answer.rb +17 -0
  30. data/lib/question_chain/models/ui_objects/check_box.rb +8 -0
  31. data/lib/question_chain/models/ui_objects/drop_down.rb +17 -0
  32. data/lib/question_chain/models/ui_objects/hidden_field.rb +5 -0
  33. data/lib/question_chain/models/ui_objects/object_reference_drop_down.rb +67 -0
  34. data/lib/question_chain/models/ui_objects/object_search.rb +44 -0
  35. data/lib/question_chain/models/ui_objects/radio_button.rb +5 -0
  36. data/lib/question_chain/models/ui_objects/radio_button_group.rb +5 -0
  37. data/lib/question_chain/models/ui_objects/relatable_category_drop_down.rb +70 -0
  38. data/lib/question_chain/models/ui_objects/text_field.rb +11 -0
  39. data/lib/question_chain/mongo_serialization.rb +62 -0
  40. data/lib/question_chain/mustache_handler.rb +16 -0
  41. data/lib/question_chain/mustache_rails.rb +50 -0
  42. data/lib/question_chain/state_machine.rb +29 -0
  43. data/lib/question_chain/stored_template.rb +30 -0
  44. data/lib/question_chain/version.rb +3 -0
  45. data/lib/question_chain/views/answers/_edit.html.haml +62 -0
  46. data/lib/question_chain/views/answers/_new.html.haml +62 -0
  47. data/lib/question_chain/views/answers/_question.html.mustache +11 -0
  48. data/lib/question_chain/views/answers/_ui_objects_check_box.html.mustache +19 -0
  49. data/lib/question_chain/views/answers/_ui_objects_drop_down.html.mustache +26 -0
  50. data/lib/question_chain/views/answers/_ui_objects_hidden_field.html.mustache +3 -0
  51. data/lib/question_chain/views/answers/_ui_objects_object_reference_drop_down.html.mustache +27 -0
  52. data/lib/question_chain/views/answers/_ui_objects_object_search.html.mustache +20 -0
  53. data/lib/question_chain/views/answers/_ui_objects_relatable_category_drop_down.html.mustache +26 -0
  54. data/lib/question_chain/views/answers/_ui_objects_text_field.html.mustache +19 -0
  55. data/lib/question_chain/views/layouts/application.html.haml +10 -0
  56. data/lib/question_chain.rb +35 -0
  57. data/question_chain.gemspec +31 -0
  58. data/test_app/.gitignore +4 -0
  59. data/test_app/Gemfile +29 -0
  60. data/test_app/Rakefile +16 -0
  61. data/test_app/app/controllers/answers_controller.rb +13 -0
  62. data/test_app/app/controllers/application_controller.rb +4 -0
  63. data/test_app/app/models/container.rb +10 -0
  64. data/test_app/app/models/flight.rb +20 -0
  65. data/test_app/app/views/answers/edit.html.haml +1 -0
  66. data/test_app/app/views/answers/new.html.haml +1 -0
  67. data/test_app/config/application.rb +18 -0
  68. data/test_app/config/boot.rb +13 -0
  69. data/test_app/config/database.yml +15 -0
  70. data/test_app/config/environment.rb +5 -0
  71. data/test_app/config/initializers/app.rb +5 -0
  72. data/test_app/config/initializers/cookie_verification_secret.rb +7 -0
  73. data/test_app/config/initializers/mongodb.rb +2 -0
  74. data/test_app/config/initializers/session_store.rb +3 -0
  75. data/test_app/config/routes.rb +30 -0
  76. data/test_app/config.ru +2 -0
  77. data/test_app/environments/development.rb +19 -0
  78. data/test_app/environments/test.rb +30 -0
  79. data/test_app/lib/tasks/rspec.rake +69 -0
  80. data/test_app/lib/tasks/yard.rake +4 -0
  81. data/test_app/public/.gitkeep +0 -0
  82. data/test_app/script/rails +10 -0
  83. data/test_app/spec/acceptance/new_spec +30 -0
  84. data/test_app/spec/factories.rb +81 -0
  85. data/test_app/spec/models/chain_template_spec.rb +53 -0
  86. data/test_app/spec/models/flight_spec.rb +101 -0
  87. data/test_app/spec/models/question_spec.rb +13 -0
  88. data/test_app/spec/models/rules/value_change_spec.rb +31 -0
  89. data/test_app/spec/models/ui_group_spec.rb +55 -0
  90. data/test_app/spec/models/ui_object_spec.rb +33 -0
  91. data/test_app/spec/models/ui_objects/drop_down_spec.rb +28 -0
  92. data/test_app/spec/models/ui_objects/relatable_category_drop_down_spec.rb +13 -0
  93. data/test_app/spec/spec_helper.rb +25 -0
  94. metadata +325 -0
@@ -0,0 +1,20 @@
1
+ class Flight
2
+ include MongoMapper::Document
3
+ include QuestionChain::Answerable
4
+
5
+ key :container_id, ObjectId
6
+
7
+ self._extra_keyword_methods = [:milk, :beans]
8
+
9
+ def object_reference_name
10
+ "flight"
11
+ end
12
+
13
+ def milk
14
+ "black rebel"
15
+ end
16
+
17
+ def beans
18
+ "motocycle"
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ = render :partial => "edit"
@@ -0,0 +1 @@
1
+ = render :partial => "new"
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ require "active_support/railtie"
4
+ require "active_model/railtie"
5
+ require "action_controller/railtie"
6
+ require "action_view/railtie"
7
+
8
+ Bundler.require :default, Rails.env
9
+
10
+ module TestApp
11
+ class Application < Rails::Application
12
+
13
+ # Configure sensitive parameters which will be filtered from the log file.
14
+ config.filter_parameters << :password
15
+ config.encoding = "utf-8"
16
+ config.cache_classes = true
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+
3
+ # Set up gems listed in the Gemfile.
4
+ gemfile = File.expand_path('../../Gemfile', __FILE__)
5
+ begin
6
+ ENV['BUNDLE_GEMFILE'] = gemfile
7
+ require 'bundler'
8
+ Bundler.setup
9
+ rescue Bundler::GemNotFound => e
10
+ STDERR.puts e.message
11
+ STDERR.puts "Try running `bundle install`."
12
+ exit!
13
+ end if File.exist?(gemfile)
@@ -0,0 +1,15 @@
1
+ development:
2
+ adapter: mongodb
3
+ database: carbon_calculated_test_app_development
4
+ host: localhost
5
+ username:
6
+ password:
7
+ port: 27017
8
+
9
+ test: &TEST
10
+ database: carbon_calculated_test_app_test
11
+ host: localhost
12
+ port: 27017
13
+
14
+ cucumber:
15
+ <<: *TEST
@@ -0,0 +1,5 @@
1
+ # Load the rails application
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the rails application
5
+ TestApp::Application.initialize!
@@ -0,0 +1,5 @@
1
+ module TestApp
2
+ def self.calculated_session
3
+ @session ||= Calculated::Session.create(:api_key => ENV["CALCULATED_API_KEY"], )
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ Rails.application.config.secret_token = '8a4af655c7d9d5ae1ea97f9bb91sdffb64c578ad16fbaaf88a5e26e7e9aa6f49a25de137f10ca99f74b3e891ede88c0818de9c47e4afaa2a3d8f0073'
@@ -0,0 +1,2 @@
1
+ mongo_config = Rails.configuration.database_configuration
2
+ MongoMapper.setup(mongo_config, Rails.env, :logger => Rails.logger)
@@ -0,0 +1,3 @@
1
+ Rails.application.config.session_store :cookie_store, {
2
+ :key => '_question_chain_test_app',
3
+ }
@@ -0,0 +1,30 @@
1
+ TestApp::Application.routes.draw do
2
+
3
+ match '/answers/fire_object_search' => 'answers#fire_object_search'
4
+ match '/answers/fire_populate_drop_down' => 'answers#fire_populate_drop_down'
5
+
6
+ chain_template_routes = lambda do
7
+ scope "/:context(/:question_id)" do
8
+ resources :answers, :only => [:new, :create, :index] do
9
+ collection do
10
+ post :fire_populate_drop_down
11
+ post :fire_object_search
12
+ end
13
+ end
14
+ end
15
+ scope "/:context" do
16
+ resources :answers, :only => [:edit, :update, :show] do
17
+ collection do
18
+ post :fire_populate_drop_down
19
+ post :fire_object_search
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ resources :containers do
26
+ chain_template_routes.call
27
+ end
28
+
29
+ root :to => "home#index"
30
+ end
@@ -0,0 +1,2 @@
1
+ require ::File.expand_path('../config/environment', __FILE__)
2
+ run TestApp::Application
@@ -0,0 +1,19 @@
1
+ TestApp::Application.configure do
2
+ # Settings specified here will take precedence over those in config/environment.rb
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the webserver when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Log error messages when you accidentally call methods on nil.
10
+ config.whiny_nils = true
11
+
12
+ # Show full error reports and disable caching
13
+ config.consider_all_requests_local = true
14
+ config.action_view.debug_rjs = true
15
+ config.action_controller.perform_caching = false
16
+
17
+ # Don't care if the mailer can't send
18
+ config.action_mailer.raise_delivery_errors = false
19
+ end
@@ -0,0 +1,30 @@
1
+ TestApp::Application.configure do
2
+ # Settings specified here will take precedence over those in config/environment.rb
3
+
4
+ # The test environment is used exclusively to run your application's
5
+ # test suite. You never need to work with it otherwise. Remember that
6
+ # your test database is "scratch space" for the test suite and is wiped
7
+ # and recreated between test runs. Don't rely on the data there!
8
+ config.cache_classes = true
9
+
10
+ # Log error messages when you accidentally call methods on nil.
11
+ config.whiny_nils = true
12
+
13
+ # Show full error reports and disable caching
14
+ config.consider_all_requests_local = true
15
+ config.action_controller.perform_caching = false
16
+
17
+ # Raise exceptions instead of rendering exception templates
18
+ config.action_dispatch.show_exceptions = false
19
+
20
+ # Disable request forgery protection in test environment
21
+ config.action_controller.allow_forgery_protection = false
22
+
23
+ # Tell Action Mailer not to deliver emails to the real world.
24
+ # The :test delivery method accumulates sent emails in the
25
+ # ActionMailer::Base.deliveries array.
26
+ config.action_mailer.delivery_method = :test
27
+
28
+ # Print deprecation notices to the stderr
29
+ config.active_support.deprecation to :stderr
30
+ end
@@ -0,0 +1,69 @@
1
+ begin
2
+ require 'rspec/core'
3
+ require 'rspec/core/rake_task'
4
+ rescue MissingSourceFile
5
+ module Rspec
6
+ module Core
7
+ class RakeTask
8
+ def initialize(name)
9
+ task name do
10
+ # if rspec-rails is a configured gem, this will output helpful material and exit ...
11
+ require File.expand_path(File.dirname(__FILE__) + "/../../config/environment")
12
+
13
+ # ... otherwise, do this:
14
+ raise <<-MSG
15
+
16
+ #{"*" * 80}
17
+ * You are trying to run an rspec rake task defined in
18
+ * #{__FILE__},
19
+ * but rspec can not be found in vendor/gems, vendor/plugins or system gems.
20
+ #{"*" * 80}
21
+ MSG
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ Rake.application.instance_variable_get('@tasks').delete('default')
30
+
31
+ spec_prereq = File.exist?(File.join(Rails.root, 'config', 'database.yml')) ? :noop : :noop
32
+ task :noop do
33
+ end
34
+
35
+ task :default => :spec
36
+ task :stats => "spec:statsetup"
37
+
38
+ desc "Run all specs in spec directory (excluding plugin specs)"
39
+ Rspec::Core::RakeTask.new(:spec => spec_prereq)
40
+
41
+ namespace :spec do
42
+ [:requests, :models, :controllers, :views, :helpers, :mailers, :lib].each do |sub|
43
+ desc "Run the code examples in spec/#{sub}"
44
+ Rspec::Core::RakeTask.new(sub => spec_prereq) do |t|
45
+ t.pattern = "./spec/#{sub}/**/*_spec.rb"
46
+ end
47
+ end
48
+
49
+ task :statsetup do
50
+ require 'rails/code_statistics'
51
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
52
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
53
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
54
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
55
+ ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
56
+ ::STATS_DIRECTORIES << %w(Mailer\ specs spec/mailers) if File.exist?('spec/mailers')
57
+ ::STATS_DIRECTORIES << %w(Routing\ specs spec/routing) if File.exist?('spec/routing')
58
+ ::STATS_DIRECTORIES << %w(Request\ specs spec/requests) if File.exist?('spec/requests')
59
+ ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
60
+ ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
61
+ ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
62
+ ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
63
+ ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
64
+ ::CodeStatistics::TEST_TYPES << "Mailer specs" if File.exist?('spec/mailer')
65
+ ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
66
+ ::CodeStatistics::TEST_TYPES << "Request specs" if File.exist?('spec/requests')
67
+ end
68
+ end
69
+
@@ -0,0 +1,4 @@
1
+ require 'yard/rake/yardoc_task'
2
+ YARD::Rake::YardocTask.new do |t|
3
+ t.files = ['/../lib/**/*.rb', '/../app/models/**/*.rb']
4
+ end
File without changes
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENV_PATH = File.expand_path('../../config/environment', __FILE__)
5
+ BOOT_PATH = File.expand_path('../../config/boot', __FILE__)
6
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
7
+ ROOT_PATH = File.expand_path('../..', __FILE__)
8
+
9
+ require BOOT_PATH
10
+ require 'rails/commands'
@@ -0,0 +1,30 @@
1
+ # Todo For Acceptance Specs
2
+
3
+ # Feature: New Answer (for a Flight)
4
+ # In order add a new answer for a resource that can have a co2 computation
5
+ # As an application user
6
+ # I want to be able create a new answer
7
+ #
8
+ # Scenario: New Answer for a flight resource (Question wants a distance and a flight)
9
+ # Given a flight context exists with a valid question
10
+ # When go to the new flight answers page
11
+ #
12
+ # Then show me the page
13
+ # And I should see "Flight Calculator" within "#question"
14
+ # And I should see "Please enter flight details" within "#question"
15
+ # And I should see "Distance" within "#ui_objects"
16
+ # And I should see "Flight" within "#ui_objects"
17
+ # And I should see "flight1" within ".ui-objects-object_reference-drop-down-template"
18
+ # And I should see "flight2" within ".ui-objects-object_reference-drop-down-template"
19
+ #
20
+ # Feature: Edit Answer (for a Flight)
21
+ # In order to change the the details of the resource for a carbon calculation so calculations are correct
22
+ # As an application user
23
+ # I want to be able create a edit a carbon calculated resource (Flight)
24
+ #
25
+ # Scenario: View the edit page for the flight resource
26
+ # Given a flight context exists with a valid question
27
+ # And a flight exists with the id: "3458234509854309534", distance: "12", :flight => "23432234234"
28
+ # When go to the edit flight answer page
29
+ #
30
+
@@ -0,0 +1,81 @@
1
+ # Read about factories at http://github.com/thoughtbot/factory_girl
2
+ Factory.sequence :name do |n|
3
+ "name_#{n}"
4
+ end
5
+
6
+ Factory.sequence :object_name do |n|
7
+ "object_name_#{n}"
8
+ end
9
+
10
+ Factory.sequence :label do |n|
11
+ "label_#{n}"
12
+ end
13
+
14
+ Factory.sequence :related_attribute do |n|
15
+ "related_attribute_#{n}"
16
+ end
17
+
18
+ Factory.define :flight do |f|
19
+ f.question_id {BSON::ObjectId.new}
20
+ f.result{ {"co2"=> "45.5", "object_references" => {"123" => {"identifier" => "beans"}}}}
21
+ f.answer_params {{"flight" => "123"}}
22
+ f.reference {Factory.next(:name)}
23
+ end
24
+
25
+ Factory.define :chain_template do |f|
26
+ f.for_resource "container"
27
+ end
28
+
29
+ Factory.define :question do |f|
30
+ f.name {Factory.next(:name)}
31
+ f.label {Factory.next(:label)}
32
+ f.description "this is a question it can be about anything that is carbon"
33
+ end
34
+
35
+ Factory.define :ui_group do |f|
36
+ f.name {Factory.next(:name)}
37
+ f.label {Factory.next(:label)}
38
+ f.description "this is a question it can be about anything that is carbon"
39
+ f.association :question
40
+ end
41
+
42
+ Factory.define :ui_object do |f|
43
+ f.label {Factory.next(:label)}
44
+ f.association :ui_group
45
+ end
46
+
47
+ Factory.define :drop_down, :class => UiObjects::DropDown do |f|
48
+ f.label {Factory.next(:label)}
49
+ f.association :ui_group
50
+ f.options {%w(what ever the egg says is true)}
51
+ end
52
+
53
+ Factory.define :check_box, :class => UiObjects::CheckBox do |f|
54
+ f.label {Factory.next(:label)}
55
+ f.association :ui_group
56
+ end
57
+
58
+ Factory.define :hidden_field, :class => UiObjects::HiddenField do |f|
59
+ f.label {Factory.next(:label)}
60
+ f.association :ui_group
61
+ end
62
+
63
+ Factory.define :object_reference_drop_down, :class => UiObjects::ObjectReferenceDropDown do |f|
64
+ f.label {Factory.next(:label)}
65
+ f.association :ui_group
66
+ f.object_name {Factory.next(:object_name)}
67
+ end
68
+
69
+ Factory.define :relatable_category_drop_down, :class => UiObjects::RelatableCategoryDropDown do |f|
70
+ f.association :ui_group
71
+ f.label {Factory.next(:label)}
72
+ f.related_attribute {Factory.next(:related_attribute)}
73
+ f.object_name {Factory.next(:object_name)}
74
+ end
75
+
76
+ Factory.define :text_field, :class => UiObjects::TextField do |f|
77
+ f.association :ui_group
78
+ f.label {Factory.next(:label)}
79
+ end
80
+
81
+
@@ -0,0 +1,53 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "ChainTemplate" do
4
+ describe "when validating" do
5
+ before(:each) do
6
+ @chain_template = Factory.build(:chain_template, :context => {"egg" => "123"})
7
+ end
8
+
9
+ it "should be cool from the factory" do
10
+ @chain_template.should be_valid
11
+ end
12
+
13
+ it "should not be cool without a for_resource" do
14
+ @chain_template.for_resource = nil
15
+ @chain_template.should_not be_valid
16
+ end
17
+ it "should not be cool if the context is empty" do
18
+ @chain_template.context = {}
19
+ @chain_template.should_not be_valid
20
+ end
21
+ end
22
+
23
+ describe "when activating" do
24
+ before(:each) do
25
+ @chain_template = Factory.build(:chain_template, :context => {"egg" => "123"})
26
+ end
27
+
28
+ it "should be in a pending state to start off with" do
29
+ @chain_template.should be_pending
30
+ end
31
+
32
+ it "should be in an active state one we have activated it" do
33
+ @chain_template.activate!
34
+ @chain_template.should be_active
35
+ end
36
+ end
37
+
38
+ describe "when there is an account_id" do
39
+ before(:each) do
40
+ @account_id = BSON::ObjectId.new.to_s
41
+ @chain_template = Factory(:chain_template, :account_id => @account_id, :context => {"egg" => "123"})
42
+ @chain_template2 = Factory(:chain_template, :context => {"egg" => "123"})
43
+ end
44
+
45
+ it "should find the account when specifying an account" do
46
+ ChainTemplate.first(:for_resource => "container", :account_id => @account_id).should_not be_nil
47
+ end
48
+
49
+ it "should find the default if the account_id nil" do
50
+ ChainTemplate.first(:for_resource => "container", :account_id => nil).should_not be_nil
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Flight (Test Model)" do
4
+ describe "when it is CarbonCalculated::Answerable" do
5
+ describe "initializing" do
6
+ before(:each) do
7
+ @flight = Flight.new
8
+ end
9
+
10
+ it "should have answerable keys" do
11
+ @flight.keys.should include(:question_id)
12
+ @flight.keys.should include(:result)
13
+ @flight.keys.should include(:answer_params)
14
+ @flight.keys.should include(:answer_json)
15
+ @flight.keys.should include(:user_id)
16
+ @flight.keys.should include(:reference)
17
+ @flight.keys.should include(:stored_identifier)
18
+ @flight.keys.should include(:_extra_keywords)
19
+ end
20
+
21
+ it "Should have access to _extra_keyword class method" do
22
+ Flight.should respond_to(:_extra_keyword_methods)
23
+ end
24
+ end
25
+
26
+ describe "when validating" do
27
+ before(:each) do
28
+ @flight = Factory.build(:flight)
29
+ end
30
+
31
+ it "should be cool from the factory" do
32
+ @flight.should be_valid
33
+ end
34
+
35
+ it "should not be cool if there is no question_id" do
36
+ @flight.question_id = nil
37
+ @flight.should_not be_valid
38
+ end
39
+
40
+ it "should not be cool without a result" do
41
+ @flight.result = nil
42
+ @flight.should_not be_valid
43
+ end
44
+
45
+ it "should not be cool without a answer_params" do
46
+ @flight.answer_params = nil
47
+ @flight.should_not be_valid
48
+ end
49
+ end
50
+
51
+ describe "when save", "given that the flight has object with an identifier of beans" do
52
+ before(:each) do
53
+ @flight = Factory.build(:flight)
54
+ @flight.save
55
+ end
56
+
57
+ it "should have a identifier of 'beans'" do
58
+ @flight.identifier.should == "beans"
59
+ end
60
+
61
+ it "should be searchable from the saved idenifier" do
62
+ flights = Flight.search "beans"
63
+ flights.first.should == @flight
64
+ end
65
+
66
+ it "should not be found on a silly search like eggs" do
67
+ flights = Flight.search "eggs"
68
+ flights.should be_empty
69
+ end
70
+ end
71
+
72
+ describe "when save", "given that the flight has more then 1 object reference" do
73
+ before(:each) do
74
+ @flight = Factory.build(:flight)
75
+ @flight.result = {"co2" => 234.234, "object_references" => {"1" => {"identifier" => "what"}, "2" => {"identifier" => "me"}}}
76
+ @flight.save
77
+ end
78
+
79
+ it "should have a identifier of 'beans'" do
80
+ @flight.identifier.should == "what me"
81
+ end
82
+ end
83
+
84
+ describe "when save", "with extra keyword methods that result in 'black rebel motocycle' keywords being added" do
85
+ before(:each) do
86
+ @flight = Factory.build(:flight)
87
+ @flight.result = {"co2" => 234.234, "object_references" => {"1" => {"identifier" => "what"}, "2" => {"identifier" => "me"}}}
88
+ @flight.save
89
+ end
90
+
91
+ it "should find the flight from the search 'black' OR 'motocycle'" do
92
+ flights = Flight.search "black"
93
+ flights.first.should == @flight
94
+
95
+ flights = Flight.search "motocycle"
96
+ flights.first.should == @flight
97
+ end
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Question" do
4
+ describe "when validating" do
5
+ before(:each) do
6
+ @question = Factory.build(:flight)
7
+ end
8
+
9
+ it "should be cool straight from the factory" do
10
+ @question.should be_valid
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe "ValueChange", "Given UiObject is cool" do
4
+ describe "when validating" do
5
+ before(:each) do
6
+ @ui_object = Factory(:text_field)
7
+ end
8
+
9
+ it "should be cool from the factory" do
10
+ @ui_object.rules << Rules::ValueChange.new(
11
+ :affecting_ui_object_id => Factory(:hidden_field).id,
12
+ :change_value => "egg"
13
+ )
14
+ @ui_object.should be_valid
15
+ end
16
+
17
+ it "should not be cool if the rule does not have an affecting_ui_object_id" do
18
+ @ui_object.rules << Rules::ValueChange.new(
19
+ :change_value => "egg"
20
+ )
21
+ @ui_object.should_not be_valid
22
+ end
23
+
24
+ it "should not be cool if the rule does not have an change value" do
25
+ @ui_object.rules << Rules::ValueChange.new(
26
+ :affecting_ui_object_id => Factory(:hidden_field).id
27
+ )
28
+ @ui_object.should_not be_valid
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "UiGroup" do
4
+ describe "when validating" do
5
+ before(:each) do
6
+ @ui_group = Factory.build(:ui_group)
7
+ end
8
+
9
+ it "should be cool from the blueprint" do
10
+ @ui_group.should be_valid
11
+ end
12
+
13
+ it "should not be cool without a name" do
14
+ @ui_group.name = nil
15
+ @ui_group.should_not be_valid
16
+
17
+ end
18
+
19
+ it "should not be cool without a label" do
20
+ @ui_group.label = nil
21
+ @ui_group.should_not be_valid
22
+ end
23
+
24
+ it "should not be cool if it does not have a question" do
25
+ @ui_group.question = nil
26
+ @ui_group.should_not be_valid
27
+ end
28
+ end
29
+
30
+ describe "when assign some ui_objects", "1 text field, 1 relatable_category_drop_down, 1 object_reference_drop_down" do
31
+ before(:each) do
32
+ @ui_group = Factory.build(:ui_group)
33
+ @text_field = @ui_group.text_fields.create!(Factory.attributes_for(:text_field))
34
+ @relatable_category_drop_down = @ui_group.relatable_category_drop_downs.create!(Factory.attributes_for(:relatable_category_drop_down))
35
+ @object_referenece_drop_down = @ui_group.object_reference_drop_down.create!(Factory.attributes_for(:object_reference_drop_down))
36
+ end
37
+
38
+ it "should have 3 ui_objects" do
39
+ @ui_group.ui_objects.size.should == 3
40
+ end
41
+
42
+ it "should have 1 relatable_category drop down" do
43
+ @ui_group.relatable_category_drop_downs.size.should == 1
44
+ end
45
+
46
+ it "should have 1 object_reference drop down" do
47
+ @ui_group.object_reference_drop_down.should_not be_nil
48
+ end
49
+
50
+ it "should have 1 text field" do
51
+ @ui_group.text_fields.size.should == 1
52
+ end
53
+
54
+ end
55
+ end