-
Notifications
You must be signed in to change notification settings - Fork 17
/
dataset.rb
129 lines (121 loc) · 4.12 KB
/
dataset.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
require 'activesupport'
require 'activerecord'
require 'dataset/version'
require 'dataset/instance_methods'
require 'dataset/base'
require 'dataset/database/base'
require 'dataset/database/mysql'
require 'dataset/database/sqlite3'
require 'dataset/database/postgresql'
require 'dataset/collection'
require 'dataset/load'
require 'dataset/resolver'
require 'dataset/session'
require 'dataset/session_binding'
require 'dataset/record/heirarchy'
require 'dataset/record/meta'
require 'dataset/record/fixture'
require 'dataset/record/model'
# == Quick Start
#
# Write a test. If you want some data in your database, create a dataset.
# Start simple.
#
# describe States do
# dataset do
# [%w(Colorado CO), %w(North\ Carolina NC), %w(South\ Carolina SC)].each do |name,abbrev|
# create_record :state, abbrev.downcase, :name => name, :abbrev => abbrev
# end
# end
#
# it 'should have an abbreviated name'
# states(:nc).abbrev.should be('NC')
# end
#
# it 'should have a name'
# states(:nc).name.should be('North Carolin')
# end
# end
#
# Notice that you won't be using _find_id_ or _find_model_ in your tests. You
# use methods like _states_ and _state_id_, as in the example above.
#
# When you find that you're seeing patterns in the data you are creating, pull it into a class.
#
# spec/datasets/states.rb
# class StatesDataset < Dataset::Base
# def load
# # create useful data
# end
# end
#
# spec/models/state.rb
# describe State do
# dataset :states
# end
#
# == Installation
#
# Dataset is installed into your testing environment by requiring the library,
# then including it into the class that will be the context of your test
# methods.
#
# require 'dataset'
# class Test::Unit::TestCase
# include Dataset
# datasets_directory "#{RAILS_ROOT}/test/datasets"
# end
#
# Note that should you desire your Dataset::Base subclasses be
# auto-discovered, you can set the _datasets_directory_.
#
module Dataset
def self.included(test_context) # :nodoc:
if test_context.name =~ /World\Z/
require 'dataset/extensions/cucumber'
elsif test_context.name =~ /TestCase\Z/
require 'dataset/extensions/test_unit'
elsif test_context.name =~ /ExampleGroup\Z/
require 'dataset/extensions/rspec'
else
raise "I don't understand your test framework"
end
test_context.extend ContextClassMethods
end
# Methods that are added to the class that Dataset is included in (the test
# context class).
#
module ContextClassMethods
def self.extended(context_class) # :nodoc:
context_class.module_eval do
include InstanceMethods
superclass_delegating_accessor :dataset_session
end
end
mattr_accessor :datasets_database_dump_path
self.datasets_database_dump_path = File.expand_path(RAILS_ROOT + '/tmp/dataset') if defined?(RAILS_ROOT)
# Replaces the default Dataset::Resolver with one that will look for
# dataset class definitions in the specified directory. Captures of the
# database will be stored in a subdirectory 'tmp' (see
# Dataset::Database::Base).
def datasets_directory(path)
Dataset::Resolver.default = Dataset::DirectoryResolver.new(path)
Dataset::ContextClassMethods.datasets_database_dump_path = File.join(path, '/tmp/dataset')
end
def add_dataset(*datasets, &block) # :nodoc:
dataset_session = dataset_session_in_hierarchy
datasets.each { |dataset| dataset_session.add_dataset(self, dataset) }
dataset_session.add_dataset(self, Class.new(Dataset::Block) {
define_method :doload, block
}) unless block.nil?
end
def dataset_session_in_hierarchy # :nodoc:
self.dataset_session ||= begin
database_spec = ActiveRecord::Base.configurations['test'].with_indifferent_access
database_class = Dataset::Database.const_get(database_spec[:adapter].classify)
database = database_class.new(database_spec, Dataset::ContextClassMethods.datasets_database_dump_path)
Dataset::Session.new(database)
end
end
end
end