active_record_mocks 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 88990a18f8fe9b7a17990eb080e7a8e15978997b
4
+ data.tar.gz: d44b699b89a26142df44a62ed86ab10f774bf1c1
5
+ SHA512:
6
+ metadata.gz: aae5f6701fb3066ea610c9b6ce3ea9b0d04e3aab5c8c0094afa46dd0c7865f1bf03191a9e2ea2e64d02487721228fadd301dc9b23c21cba5651b71899443bff7
7
+ data.tar.gz: 7b7f0ba4382f1e25a4633dd68c634cfbd272bba1546619fcad78f9538b7ba5dff27f29961916ebb54b7a2d9a13fa25bbd824bda7b7ce8b89861687d6b24d13d3
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+ gemspec :name => "Gem1"
3
+
4
+ group :development do
5
+ unless ENV["CI"]
6
+ gem "pry"
7
+ end
8
+
9
+ gem "rake"
10
+
11
+ # ---------------------------------------------------------------------------
12
+ # So we can test a bunch of database platforms.
13
+ # ---------------------------------------------------------------------------
14
+
15
+ gem "pg", :platforms => [:mswin, :mingw, :ruby]
16
+ gem "activerecord-jdbcpostgresql-adapter", :platforms => :jruby
17
+ gem "activerecord-jdbcmysql-adapter", :platforms => :jruby
18
+ gem "mysql2", :platforms => [:mswin, :mingw, :ruby]
19
+ end
data/License ADDED
@@ -0,0 +1,11 @@
1
+ Copyright 2013 Jordon Bedwell
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ use this file except in compliance with the License. You may obtain a copy of
5
+ the License at: http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software
8
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ License for the specific language governing permissions and limitations under
11
+ the License.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "rspec/core/rake_task"
2
+
3
+ task :default => [:spec]
4
+ task :test => :spec
5
+ RSpec::Core::RakeTask.new :spec
data/Readme.md ADDED
@@ -0,0 +1,149 @@
1
+ # Active Record Mocks.
2
+
3
+ [![Build Status](https://travis-ci.org/envygeeks/active_record_mocks.png?branch=master)](https://travis-ci.org/envygeeks/active_record_mocks) [![Coverage Status](https://coveralls.io/repos/envygeeks/active_record_mocks/badge.png?branch=master)](https://coveralls.io/r/envygeeks/active_record_mocks) [![Code Climate](https://codeclimate.com/github/envygeeks/active_record_mocks.png)](https://codeclimate.com/github/envygeeks/active_record_mocks) [![Dependency Status](https://gemnasium.com/envygeeks/active_record_mocks.png)](https://gemnasium.com/envygeeks/active_record_mocks)
4
+
5
+ ActiveRecord Mocks is designed to aide you in testing your ActiveRecord
6
+ concerns by creating random models (or even named models) that are
7
+ removed after each test. It was originally concieved to test concerns,
8
+ includes and other types of things that normally aren't tied to a
9
+ model specifically.
10
+
11
+ ## Installing
12
+
13
+ ```ruby
14
+ gem "active_record_mocks"
15
+ ```
16
+
17
+ ## Using
18
+
19
+ ```ruby
20
+ with_mocked_tables do |m|
21
+ m.enable_extension "uuid-ossp"
22
+ m.enable_extension "hstore"
23
+
24
+ t1 = m.create_table do |t|
25
+ t.model_name :Foo
26
+ t.belongs_to :bar
27
+
28
+ t.layout do |l|
29
+ l.integer :bar_id
30
+ end
31
+ end
32
+
33
+ t2 = m.create_table do |t|
34
+ t.model_name :Bar
35
+ t.has_many :foo
36
+
37
+ t.layout do |l|
38
+ l.text :bar_text
39
+ end
40
+ end
41
+
42
+ # Do Work Here
43
+ end
44
+ ```
45
+
46
+ ---
47
+
48
+ ### Extensions
49
+
50
+ You can enable PostgreSQL extensions inside of your models using the
51
+ `enable_extension` method when inside of `with_mocked_tables` or
52
+ `with_mocked_models` like so:
53
+
54
+ ```ruby
55
+ with_mocked_tables do |m|
56
+ m.enable_extension "extension-name"
57
+ end
58
+ ```
59
+
60
+ ---
61
+
62
+ ### Creating Tables and Layouts
63
+
64
+ To create tables you use the `create_table` method when inside of
65
+ `with_mocked_tables` or `with_mocked_models`, like so:
66
+
67
+ ```ruby
68
+ with_mocked_tables do |m|
69
+ m.create_table migration_arguments do |t|
70
+ t.layout do |l|
71
+ l.text :foo_text
72
+ end
73
+ end
74
+ end
75
+ ```
76
+
77
+ #### Belongs to, Has Many and other methods
78
+
79
+ Any method that `ActiveRecordMocks` does not know or understand is
80
+ passed on to the model itself, so if you need for example `belongs_to`
81
+ then you would simply use belongs to when creating your table:
82
+
83
+ ```ruby
84
+ with_mocked_tables do |m|
85
+ m.create_table migration_arguments do |t|
86
+ t.belongs_to :bar_model
87
+ t.layout do |l|
88
+ l.text :foo_text
89
+ end
90
+ end
91
+ end
92
+ ```
93
+
94
+ #### Named models and tables
95
+
96
+ If you need a named model or a named table or a model whose table is
97
+ different than it's model you can use the methods `model_name` and
98
+ `table_name`, if you simply need a named model and you use standard
99
+ naming conventions than you can simply leave out the `table_name`
100
+ when using model name and `ActiveRecordMocks` will tabelize the name
101
+ of your model automatically the same as `Rails` would.
102
+
103
+ ```ruby
104
+ with_mocked_tables do |m|
105
+ t1 = m.create_table migration_arguments do |t|
106
+ t.model_name :Foo
107
+ t.layout do |l|
108
+ l.text :foo_text
109
+ end
110
+ end
111
+ end
112
+
113
+ # Results in:
114
+ # - Foo (Model)
115
+ # - foos (Table)
116
+ ```
117
+
118
+ ```ruby
119
+ with_mocked_tables do |m|
120
+ t1 = m.create_table migration_arguments do |t|
121
+ t.table_name :old_foo
122
+ t.model_name :Foo
123
+ t.layout do |l|
124
+ l.text :foo_text
125
+ end
126
+ end
127
+ end
128
+
129
+ # Results in:
130
+ # - Foo (Model)
131
+ # - old_foo (Table)
132
+ ```
133
+
134
+ #### Model Includes
135
+
136
+ If you need to include anything into your model you can use the
137
+ `includes` method when inside of `with_mocked_models` or
138
+ `with_mocked_tables`, like so:
139
+
140
+ ```ruby
141
+ with_mocked_tables do |m|
142
+ m.create_table migration_arguments do |t|
143
+ t.includes Bar1, Bar2
144
+ t.layout do |l|
145
+ l.text :foo_text
146
+ end
147
+ end
148
+ end
149
+ ```
@@ -0,0 +1,148 @@
1
+ require "active_support/core_ext/string/inflections"
2
+
3
+ module ActiveRecordMocks
4
+ class Mock
5
+ class Table
6
+ attr_reader :model_methods
7
+ attr_reader :args
8
+
9
+ def initialize(*args, &block)
10
+ @model_methods = []
11
+ @table_name = nil
12
+ @includes = []
13
+ @args = args
14
+ @layout = nil
15
+ @model_name = nil
16
+ end
17
+
18
+ # ---------------------------------------------------------------
19
+ # Tells us if we have already setup this model and object so
20
+ # that we don't keep setting stuff up.
21
+ # ---------------------------------------------------------------
22
+
23
+ def setup?
24
+ @already_setup ? true : false
25
+ end
26
+
27
+ # ---------------------------------------------------------------
28
+ # Gives the proper object of the model for you.
29
+ # ---------------------------------------------------------------
30
+
31
+ def model
32
+ if setup?
33
+ Object.const_get(@model_name)
34
+ end
35
+ end
36
+
37
+ # ---------------------------------------------------------------
38
+ # Allows you to set the files that should be included into the
39
+ # model, you must use t.includes because t.include is already
40
+ # a method on the object you are in.
41
+ # ---------------------------------------------------------------
42
+
43
+ def includes(*incs)
44
+ if setup? || incs.size == 0
45
+ @includes
46
+ else
47
+ incs.each do |i|
48
+ unless i.blank?
49
+ @includes.push(i)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # ---------------------------------------------------------------
56
+ # Allows you to set the layout for the table you are building.
57
+ # ---------------------------------------------------------------
58
+
59
+ def layout(&block)
60
+ setup? || ! block_given? ? @layout ||= nil : @layout = block
61
+ end
62
+
63
+ # ---------------------------------------------------------------
64
+ # Allows the setting of or setuping up of and returning of the
65
+ # name of the table that is being used for the model. If
66
+ # you do not customize this then it will be a tabelized name
67
+ # of the model, the same way that normal active_record would do.
68
+ # ---------------------------------------------------------------
69
+
70
+ def table_name(tname = nil)
71
+ if setup? || (! tname && @table_name)
72
+ @table_name
73
+ else
74
+ @table_name = \
75
+ tname ? tname : model_name.to_s.tableize
76
+ end
77
+ end
78
+
79
+ # ---------------------------------------------------------------
80
+ # Allows for the setting of or setup of and returning of the name
81
+ # of the model being used, this should not be confused with model
82
+ # which returns the actual object. The model need not match the
83
+ # table and sometimes it won't if you chose to be that way.
84
+ # ---------------------------------------------------------------
85
+
86
+ def model_name(mname = nil)
87
+ if setup? || (! mname && @model_name)
88
+ @model_name
89
+ else
90
+ @model_name = mname ? mname : \
91
+ SecureRandom.hex(10).tr("^a-z", "").capitalize
92
+ end
93
+ end
94
+
95
+ def setup_mocking!
96
+ if ! setup?
97
+ setup_table!
98
+ setup_model!
99
+ @already_setup = true
100
+ end
101
+ end
102
+
103
+ private
104
+ def setup_table!
105
+ ActiveRecord::Migration.tap do |o|
106
+ o.suppress_messages do
107
+ o.create_table table_name, *args do |t|
108
+ layout.call(t) if layout.is_a?(Proc)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ private
115
+ def setup_model!
116
+ Object.const_set(model_name,
117
+ Class.new(ActiveRecord::Base)).tap do |o|
118
+ o.table_name = table_name
119
+ setup_includes(o)
120
+ run_model_methods(o)
121
+ end
122
+ end
123
+
124
+ private
125
+ def setup_includes(obj)
126
+ includes.each do |i|
127
+ obj.send(:include, i)
128
+ end
129
+ end
130
+
131
+ private
132
+ def run_model_methods(obj)
133
+ model_methods.each do |m|
134
+ obj.send(m[:method], *m[:args], &m[:block])
135
+ end
136
+ end
137
+
138
+ public
139
+ def method_missing(methud, *args, &block)
140
+ model_methods.push({
141
+ :block => block,
142
+ :method => methud,
143
+ :args => args
144
+ })
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,55 @@
1
+ require_relative "mock/table"
2
+ require "active_record"
3
+
4
+ module ActiveRecordMocks
5
+ class Mock
6
+ class ExtensionsUnsupported < StandardError
7
+ def initialize
8
+ super "Your database server does not support extensions."
9
+ end
10
+ end
11
+
12
+ attr_accessor :tables
13
+
14
+ def enable_extension(ext)
15
+ raise_if_extensions_unsupported!
16
+ ActiveRecord::Migration.tap do |o|
17
+ o.suppress_messages do
18
+ o.enable_extension(ext)
19
+ end
20
+ end
21
+ end
22
+
23
+ def create_table(*args, &block)
24
+ Table.new(*args).tap do |o|
25
+ if block_given?
26
+ block.call(o)
27
+ end
28
+
29
+ o.setup_mocking!
30
+ tables.push(o)
31
+ return o.model
32
+ end
33
+ end
34
+
35
+ def initialize
36
+ @tables = [
37
+ ]
38
+ end
39
+
40
+ def delete_tables
41
+ tables.each do |t|
42
+ Object.send(:remove_const, t.model_name)
43
+ ActiveRecord::Base.connection.drop_table(t.table_name)
44
+ end
45
+ nil
46
+ end
47
+
48
+ private
49
+ def raise_if_extensions_unsupported!
50
+ if ! ActiveRecord::Base.connection.respond_to?(:enable_extension)
51
+ raise ExtensionsUnsupported
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,5 @@
1
+ require_relative "../active_record_mocks"
2
+
3
+ class ActiveSupport::TestCase
4
+ include ActiveRecordMocks::IncludeMe
5
+ end
@@ -0,0 +1,6 @@
1
+ require_relative "../active_record_mocks"
2
+ require "rspec"
3
+
4
+ RSpec.configure do |config|
5
+ config.include ActiveRecordMocks::IncludeMe
6
+ end
@@ -0,0 +1,3 @@
1
+ module ActiveRecordMocks
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ require "active_record"
2
+
3
+ module ActiveRecordMocks
4
+ require_relative "active_record_mocks/mock"
5
+
6
+ module IncludeMe
7
+ def mocked_active_record
8
+ Mock.new
9
+ end
10
+
11
+ def with_mocked_tables(&block)
12
+ if block_given?
13
+ mocked_active_record.tap do |o|
14
+ block.call(o)
15
+ o.delete_tables
16
+ end
17
+ end
18
+ nil
19
+ end
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_record_mocks
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jordon Bedwell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '2.14'
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '3.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '2.14'
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '3.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activerecord
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '3.2'
40
+ - - <=
41
+ - !ruby/object:Gem::Version
42
+ version: '4.1'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '3.2'
50
+ - - <=
51
+ - !ruby/object:Gem::Version
52
+ version: '4.1'
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec-expect_error
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: '0.0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: '0.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: envygeeks-coveralls
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ version: '0.1'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: '0.1'
81
+ - !ruby/object:Gem::Dependency
82
+ name: luna-rspec-formatters
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '0.4'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '0.4'
95
+ description: Mock ActiveRecord tables to test concerns and other code.
96
+ email: envygeeks@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - Readme.md
102
+ - License
103
+ - Rakefile
104
+ - Gemfile
105
+ - lib/active_record_mocks.rb
106
+ - lib/active_record_mocks/rails.rb
107
+ - lib/active_record_mocks/version.rb
108
+ - lib/active_record_mocks/mock/table.rb
109
+ - lib/active_record_mocks/mock.rb
110
+ - lib/active_record_mocks/rspec.rb
111
+ homepage: https://github.com/envygeeks/active_record_mocks
112
+ licenses:
113
+ - Apache 2.0
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.1.3
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: Mock ActiveRecord tables to test.
135
+ test_files: []