couch_tap 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ module Destroyers
4
+ class CollectionTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @parent = mock()
8
+ end
9
+
10
+ def test_initialize_collection
11
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
12
+ # nothing
13
+ end
14
+ assert_equal @collection.parent, @parent
15
+ end
16
+
17
+ def test_raise_error_if_no_block
18
+ assert_raise ArgumentError do
19
+ @collection = CouchTap::Destroyers::Collection.new(@parent)
20
+ end
21
+ end
22
+
23
+ def test_defining_table
24
+ @table = mock()
25
+ CouchTap::Destroyers::Table.expects(:new).with(@parent, :invoice_items, {}).returns(@table)
26
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
27
+ table :invoice_items
28
+ end
29
+ tables = @collection.instance_eval("@_tables")
30
+ assert_equal tables.length, 1
31
+ assert_equal tables.first, @table
32
+ end
33
+
34
+ def test_defining_tables
35
+ CouchTap::Destroyers::Table.expects(:new).twice
36
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
37
+ table :invoice_items
38
+ table :invoice_entries
39
+ end
40
+ tables = @collection.instance_eval("@_tables")
41
+ assert_equal tables.length, 2
42
+ end
43
+
44
+ def test_execution
45
+ @table = mock()
46
+ CouchTap::Destroyers::Table.expects(:new).returns(@table)
47
+ @collection = CouchTap::Destroyers::Collection.new(@parent) do
48
+ table :invoice_items
49
+ end
50
+ @table.expects(:execute)
51
+ @collection.execute
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,120 @@
1
+
2
+ require 'test_helper'
3
+
4
+ module Destroyers
5
+ class TableTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @database = create_database
9
+ @changes = mock()
10
+ @changes.stubs(:database).returns(@database)
11
+ @changes.stubs(:schema).returns(CouchTap::Schema.new(@database, :items))
12
+ @handler = CouchTap::DocumentHandler.new(@changes)
13
+ @handler.document = {'_id' => '12345'}
14
+ end
15
+
16
+ def test_init
17
+ keys = []
18
+ @handler.expects(:primary_keys).returns(keys)
19
+ @row = CouchTap::Destroyers::Table.new(@handler, 'items')
20
+
21
+ assert_not_equal keys, @row.primary_keys
22
+ assert_equal @row.primary_keys, [:item_id]
23
+ end
24
+
25
+ def test_init_override_primary_key
26
+ @row = CouchTap::Destroyers::Table.new(@handler, 'items', :primary_key => 'foo_item_id')
27
+ assert_equal @row.primary_keys, [:foo_item_id]
28
+ end
29
+
30
+ def test_handler
31
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
32
+ assert_equal @row.handler, @handler
33
+ end
34
+
35
+ def test_key_filter
36
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
37
+ assert_equal @row.key_filter, {:item_id => '12345'}
38
+ end
39
+
40
+ def test_defining_collections
41
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
42
+ collection :items do
43
+ # Nothing
44
+ end
45
+ end
46
+ assert_equal @row.instance_eval("@_collections.length"), 1
47
+ end
48
+
49
+ def test_defining_multiple_collections
50
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
51
+ collection :items do
52
+ # Nothing
53
+ end
54
+ collection :groups do
55
+ # Nothing
56
+ end
57
+ end
58
+ assert_equal @row.instance_eval("@_collections.length"), 2
59
+ end
60
+
61
+ def test_execution_deletes_rows
62
+ @database[:items].insert(:name => "Test Item 1", :item_id => "12345")
63
+ assert_equal @database[:items].count, 1, "Did not create sample row correctly!"
64
+ @row = CouchTap::Destroyers::Table.new(@handler, :items)
65
+ @row.execute
66
+ assert_equal 0, @database[:items].count
67
+ end
68
+
69
+ def test_execution_on_collections
70
+ @col = mock()
71
+ CouchTap::Destroyers::Collection.expects(:new).twice.returns(@col)
72
+ @row = CouchTap::Destroyers::Table.new @handler, :groups do
73
+ collection :items do
74
+ # Nothing
75
+ end
76
+ collection :groups do
77
+ # Nothing
78
+ end
79
+ end
80
+ @col.expects(:execute).twice
81
+ @row.execute
82
+ end
83
+
84
+ def test_column_returns_nil
85
+ @row = CouchTap::Destroyers::Table.new @handler, :item
86
+ assert_nil @row.column
87
+ end
88
+
89
+ def test_document_returns_empty
90
+ @row = CouchTap::Destroyers::Table.new @handler, :item
91
+ assert_empty @row.document
92
+ assert_empty @row.doc
93
+ end
94
+
95
+ def test_data_returns_empty
96
+ @row = CouchTap::Destroyers::Table.new @handler, :item
97
+ assert_empty @row.data
98
+ end
99
+
100
+
101
+ protected
102
+
103
+ def create_database
104
+ database = Sequel.sqlite
105
+ database.create_table :items do
106
+ String :item_id
107
+ String :name
108
+ Time :created_at
109
+ index :item_id, :unique => true
110
+ end
111
+ database.create_table :groups do
112
+ String :group_id
113
+ String :name
114
+ Time :created_at
115
+ index :group_id, :unique => true
116
+ end
117
+ database
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,80 @@
1
+
2
+ require 'test_helper'
3
+
4
+ class DocumentHandlerTest < Test::Unit::TestCase
5
+
6
+ def test_init
7
+ @handler = CouchTap::DocumentHandler.new 'changes' do
8
+ #nothing
9
+ end
10
+ assert_equal @handler.changes, 'changes'
11
+ end
12
+
13
+ def test_handles_with_basic_hash
14
+ @handler = CouchTap::DocumentHandler.new 'changes', :type => 'Item'
15
+ doc = {'type' => 'Item', '_id' => '1234'}
16
+ assert @handler.handles?(doc)
17
+ doc = {'type' => 'Client', '_id' => '1234'}
18
+ assert !@handler.handles?(doc)
19
+ end
20
+
21
+ def test_handles_with_multi_level_hash
22
+ @handler = CouchTap::DocumentHandler.new 'changes', :type => 'Item', :foo => 'bar'
23
+ doc = {'type' => 'Item', 'foo' => 'bar', '_id' => '1234'}
24
+ assert @handler.handles?(doc)
25
+ doc = {'type' => 'Item', '_id' => '1234'}
26
+ assert !@handler.handles?(doc)
27
+ doc = {'foor' => 'bar', '_id' => '1234'}
28
+ assert !@handler.handles?(doc)
29
+ end
30
+
31
+ def test_id
32
+ @handler = CouchTap::DocumentHandler.new 'changes' do
33
+ table :items
34
+ end
35
+ @handler.document = {'_id' => '12345'}
36
+ assert_equal @handler.id, '12345'
37
+ end
38
+
39
+ def test_insert
40
+ @handler = CouchTap::DocumentHandler.new 'changes' do
41
+ table :items
42
+ end
43
+ @handler.expects(:table).with(:items)
44
+ doc = {'type' => 'Foo', '_id' => '1234'}
45
+ @handler.insert(doc)
46
+ assert_equal @handler.document, doc
47
+ end
48
+
49
+ def test_delete
50
+ @handler = CouchTap::DocumentHandler.new 'changes' do
51
+ table :items
52
+ end
53
+ @handler.expects(:table).with(:items)
54
+ @handler.delete('_id' => '1234')
55
+ assert_equal @handler.id, '1234'
56
+ end
57
+
58
+ def test_table_definition_on_delete
59
+ @handler = CouchTap::DocumentHandler.new 'changes' do
60
+ @mode = :delete # Force delete mode!
61
+ end
62
+ @handler.instance_eval("@mode = :delete")
63
+ @table = mock()
64
+ @table.expects(:execute)
65
+ CouchTap::Destroyers::Table.expects(:new).with(@handler, :items, {}).returns(@table)
66
+ @handler.table(:items)
67
+ end
68
+
69
+ def test_table_definition_on_insert
70
+ @handler = CouchTap::DocumentHandler.new 'changes' do
71
+ # Force insert mode!
72
+ end
73
+ @handler.instance_eval("@mode = :insert")
74
+ @table = mock()
75
+ @table.expects(:execute)
76
+ CouchTap::Builders::Table.expects(:new).with(@handler, :items, {}).returns(@table)
77
+ @handler.table(:items)
78
+ end
79
+
80
+ end
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+
3
+ class SchemaTest < Test::Unit::TestCase
4
+
5
+ def test_init
6
+ database = create_database
7
+ @schema = CouchTap::Schema.new(database, 'items')
8
+
9
+ assert_equal @schema.name, :items
10
+ assert_equal @schema.database, database
11
+ end
12
+
13
+ def test_init_when_table_does_not_exist
14
+ database = Sequel.sqlite
15
+ assert_raises Sequel::Error do
16
+ CouchTap::Schema.new(database, :items)
17
+ end
18
+ end
19
+
20
+ def test_dataset
21
+ database = create_database
22
+ @schema = CouchTap::Schema.new(database, 'items')
23
+ database.expects(:[]).with(:items)
24
+ @schema.dataset
25
+ end
26
+
27
+ def test_prepares_columns
28
+ database = create_database
29
+ @schema = CouchTap::Schema.new(database, 'items')
30
+ assert_equal @schema.columns.keys, [:id, :name]
31
+ obj = database.schema(:items)
32
+ assert_equal @schema.columns.values, [obj[0][1], obj[1][1]]
33
+ end
34
+
35
+ def test_prepares_column_names
36
+ database = create_database
37
+ @schema = CouchTap::Schema.new(database, 'items')
38
+ assert_equal @schema.column_names, [:id, :name]
39
+ end
40
+
41
+ protected
42
+
43
+ def create_database
44
+ database = Sequel.sqlite
45
+ database.create_table :items do
46
+ primary_key :id
47
+ String :name
48
+ end
49
+ database
50
+ end
51
+
52
+ end
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: couch_tap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Sam Lown
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: couchrest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: em-http-request
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: yajl-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: sequel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 3.45.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 3.45.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Couch Tap provides a DSL that allows complex CouchDB documents to be
112
+ converted into rows in a RDBMS' table. The stream of events received from the CouchDB
113
+ changes feed will trigger documents to be fed into a matching filter block and saved
114
+ in the database.
115
+ email: me@samlown.com
116
+ executables:
117
+ - couch_tap
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - .gitignore
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - README.md
125
+ - Rakefile
126
+ - VERSION
127
+ - bin/couch_tap
128
+ - couch_tap.gemspec
129
+ - examples/feed.rb
130
+ - lib/couch_tap.rb
131
+ - lib/couch_tap/builders/collection.rb
132
+ - lib/couch_tap/builders/table.rb
133
+ - lib/couch_tap/changes.rb
134
+ - lib/couch_tap/destroyers/collection.rb
135
+ - lib/couch_tap/destroyers/table.rb
136
+ - lib/couch_tap/document_handler.rb
137
+ - lib/couch_tap/schema.rb
138
+ - test/functional/functional_changes_test.rb
139
+ - test/test_helper.rb
140
+ - test/unit/builders/collection_test.rb
141
+ - test/unit/builders/table_test.rb
142
+ - test/unit/changes_test.rb
143
+ - test/unit/destroyers/collection_test.rb
144
+ - test/unit/destroyers/table_test.rb
145
+ - test/unit/document_handler_test.rb
146
+ - test/unit/schema_test.rb
147
+ homepage:
148
+ licenses: []
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.0.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Listen to a CouchDB changes feed and create rows in a relational database
170
+ in real-time.
171
+ test_files:
172
+ - test/functional/functional_changes_test.rb
173
+ - test/test_helper.rb
174
+ - test/unit/builders/collection_test.rb
175
+ - test/unit/builders/table_test.rb
176
+ - test/unit/changes_test.rb
177
+ - test/unit/destroyers/collection_test.rb
178
+ - test/unit/destroyers/table_test.rb
179
+ - test/unit/document_handler_test.rb
180
+ - test/unit/schema_test.rb