axiom-arango-adapter 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +5 -0
- data/.travis.yml +25 -0
- data/Gemfile +9 -0
- data/Gemfile.devtools +57 -0
- data/Guardfile +18 -0
- data/LICENSE +20 -0
- data/README.md +92 -0
- data/Rakefile +2 -0
- data/TODO +1 -0
- data/axiom-arango-adapter.gemspec +26 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +3 -0
- data/config/roodi.yml +18 -0
- data/config/site.reek +102 -0
- data/config/yardstick.yml +2 -0
- data/lib/axiom-arango-adapter.rb +2 -0
- data/lib/axiom/adapter/arango.rb +40 -0
- data/lib/axiom/adapter/arango/adapter.rb +68 -0
- data/lib/axiom/adapter/arango/gateway.rb +356 -0
- data/lib/axiom/adapter/arango/reader.rb +98 -0
- data/lib/axiom/adapter/arango/visitor.rb +100 -0
- data/lib/axiom/adapter/arango/visitor/aggregate.rb +132 -0
- data/lib/axiom/adapter/arango/visitor/attribute.rb +26 -0
- data/lib/axiom/adapter/arango/visitor/binary.rb +77 -0
- data/lib/axiom/adapter/arango/visitor/for.rb +75 -0
- data/lib/axiom/adapter/arango/visitor/for/base.rb +40 -0
- data/lib/axiom/adapter/arango/visitor/for/binary.rb +108 -0
- data/lib/axiom/adapter/arango/visitor/for/binary/join.rb +131 -0
- data/lib/axiom/adapter/arango/visitor/for/binary/product.rb +48 -0
- data/lib/axiom/adapter/arango/visitor/for/summarization.rb +113 -0
- data/lib/axiom/adapter/arango/visitor/for/unary.rb +29 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/extension.rb +72 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/limit.rb +31 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/offset.rb +34 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/order.rb +63 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/projection.rb +32 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/rename.rb +88 -0
- data/lib/axiom/adapter/arango/visitor/for/unary/restriction.rb +42 -0
- data/lib/axiom/adapter/arango/visitor/function.rb +33 -0
- data/lib/axiom/adapter/arango/visitor/header.rb +55 -0
- data/lib/axiom/adapter/arango/visitor/literal.rb +26 -0
- data/lib/axiom/adapter/arango/visitor/reverse.rb +27 -0
- data/spec/fuzzer.rb +53 -0
- data/spec/integration/arango/read_spec.rb +166 -0
- data/spec/setup/arangodb.sh +61 -0
- data/spec/setup/run.sh +23 -0
- data/spec/shared/aql_behavior.rb +7 -0
- data/spec/shared/binary_relation_method_behaviour.rb +53 -0
- data/spec/shared/unary_relation_method_behaviour.rb +21 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/ice_nine_config.rb +6 -0
- data/spec/unit/axiom/adapter/arango/adapter/class_methods/new_spec.rb +24 -0
- data/spec/unit/axiom/adapter/arango/adapter/gateway_spec.rb +11 -0
- data/spec/unit/axiom/adapter/arango/adapter/reader_spec.rb +12 -0
- data/spec/unit/axiom/adapter/arango/gateway/class_methods/new_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/gateway/difference_spec.rb +16 -0
- data/spec/unit/axiom/adapter/arango/gateway/drop_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/each_spec.rb +78 -0
- data/spec/unit/axiom/adapter/arango/gateway/extend_spec.rb +26 -0
- data/spec/unit/axiom/adapter/arango/gateway/intersect_spec.rb +16 -0
- data/spec/unit/axiom/adapter/arango/gateway/join_spec.rb +43 -0
- data/spec/unit/axiom/adapter/arango/gateway/materialize_spec.rb +26 -0
- data/spec/unit/axiom/adapter/arango/gateway/optimize_spec.rb +22 -0
- data/spec/unit/axiom/adapter/arango/gateway/product_spec.rb +16 -0
- data/spec/unit/axiom/adapter/arango/gateway/project_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/remove_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/rename_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/respond_to_predicate_spec.rb +28 -0
- data/spec/unit/axiom/adapter/arango/gateway/restrict_spec.rb +26 -0
- data/spec/unit/axiom/adapter/arango/gateway/reverse_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/sort_by_spec.rb +26 -0
- data/spec/unit/axiom/adapter/arango/gateway/summarize_spec.rb +150 -0
- data/spec/unit/axiom/adapter/arango/gateway/take_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/gateway/unhandled_message_spec.rb +17 -0
- data/spec/unit/axiom/adapter/arango/gateway/union_spec.rb +16 -0
- data/spec/unit/axiom/adapter/arango/reader/each_spec.rb +43 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/count/root_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/count_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/maximum/root_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/maximum_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/minimum/root_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/minimum_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/sum/root_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/aggregate/sum_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/attribute/root_spec.rb +12 -0
- data/spec/unit/axiom/adapter/arango/visitor/binary/root_spec.rb +15 -0
- data/spec/unit/axiom/adapter/arango/visitor/class_methods/build_spec.rb +37 -0
- data/spec/unit/axiom/adapter/arango/visitor/class_methods/run_spec.rb +26 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/base/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/join/local_name_spec.rb +20 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/join/right/root_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/join/root_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/join_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/local_name_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/product/right/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/product/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/product_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/right/join_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/right/local_name_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/binary/right/product_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/local_name_spec.rb +21 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/root_spec.rb +29 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/summarization/root_spec.rb +53 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/extension/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/extension_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/limit/root_spec.rb +17 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/limit_spec.rb +17 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/offset/root_spec.rb +17 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/offset_spec.rb +17 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/order/root_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/order_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/projection/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/projection_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/rename/root_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/rename_spec.rb +13 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/restriction/root_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/for/unary/restriction_spec.rb +14 -0
- data/spec/unit/axiom/adapter/arango/visitor/header/root_spec.rb +12 -0
- data/spec/unit/axiom/adapter/arango/visitor/literal/root_spec.rb +10 -0
- data/spec/unit/axiom/adapter/arango/visitor/static/root_spec.rb +19 -0
- data/spec/unit/axiom/adapter/arango/visitor/visit_spec.rb +52 -0
- data/spec/unit/axiom/adapter/arango/visitor/visitor_spec.rb +39 -0
- metadata +379 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
describe Axiom::Adapter::Arango, 'read' do
|
5
|
+
let(:logger) do
|
6
|
+
Logger.new($stderr, :debug)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:projects) do
|
10
|
+
header = Axiom::Relation::Header.coerce(
|
11
|
+
[
|
12
|
+
[ :id, Integer ],
|
13
|
+
[ :name, String ]
|
14
|
+
]
|
15
|
+
)
|
16
|
+
|
17
|
+
Axiom::Relation.new(header,
|
18
|
+
[
|
19
|
+
[ 1, 'dm-mapper' ],
|
20
|
+
[ 2, 'axiom' ],
|
21
|
+
[ 3, 'dm-session'],
|
22
|
+
]
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:people) do
|
27
|
+
header = Axiom::Relation::Header.coerce(
|
28
|
+
[
|
29
|
+
[ :id, Integer ],
|
30
|
+
[ :name, String ]
|
31
|
+
]
|
32
|
+
)
|
33
|
+
|
34
|
+
Axiom::Relation.new(header,
|
35
|
+
[
|
36
|
+
[ 1, 'Dan Kubb' ],
|
37
|
+
[ 2, 'Piotr Solnica' ],
|
38
|
+
[ 3, 'Martin Gamsjaeger' ],
|
39
|
+
[ 4, 'Markus Schirp' ]
|
40
|
+
]
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:tasks) do
|
45
|
+
header = Axiom::Relation::Header.coerce(
|
46
|
+
[
|
47
|
+
[ :id, Integer ],
|
48
|
+
[ :name, String ],
|
49
|
+
[ :project_id, Integer ]
|
50
|
+
]
|
51
|
+
)
|
52
|
+
|
53
|
+
Axiom::Relation::new(header,
|
54
|
+
[
|
55
|
+
[ 1, 'Add full mutation coverage', 1],
|
56
|
+
[ 2, 'Finish dm-session integration', 1],
|
57
|
+
[ 3, 'Rename to axiom', 2],
|
58
|
+
[ 4, 'Add UoW Interface', 3]
|
59
|
+
]
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
let(:relations) do
|
64
|
+
{
|
65
|
+
:tasks => tasks,
|
66
|
+
:people => people,
|
67
|
+
:projects => projects
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
let(:database) do
|
72
|
+
Ashikawa::Core::Database.new do |config|
|
73
|
+
config.url = 'http://localhost:8529'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
let(:adapter) do
|
78
|
+
Axiom::Adapter::Arango::Adapter.new(database, logger)
|
79
|
+
end
|
80
|
+
|
81
|
+
before :all do
|
82
|
+
relations.each do |name, relation|
|
83
|
+
database[name].delete
|
84
|
+
collection = database[name]
|
85
|
+
relation.each do |tuple|
|
86
|
+
document = relation.header.each_with_object({}) do |attribute, document|
|
87
|
+
document[attribute.name.to_s]=tuple[attribute]
|
88
|
+
end
|
89
|
+
collection.create_document(document)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def assert_eql_tuples_order(example, expected)
|
95
|
+
expected.to_a.map(&:to_ary).should eql(example.to_a.map(&:to_ary))
|
96
|
+
end
|
97
|
+
|
98
|
+
def assert_eql_tuples(expected, example)
|
99
|
+
expected_tuples = expected.to_a.map(&:to_ary).to_set
|
100
|
+
example_tuples = example.to_a.map(&:to_ary).to_set
|
101
|
+
example_tuples.should eql(expected_tuples)
|
102
|
+
end
|
103
|
+
|
104
|
+
def gateway(name)
|
105
|
+
adapter.gateway(Axiom::Relation::Base.new(name, relations.fetch(name).header))
|
106
|
+
end
|
107
|
+
|
108
|
+
specify 'projection' do
|
109
|
+
assert_eql_tuples(gateway(:tasks).project([:id, :name]), tasks.project([:id, :name]))
|
110
|
+
end
|
111
|
+
|
112
|
+
specify 'restriction' do
|
113
|
+
assert_eql_tuples(gateway(:tasks).restrict { |r| r.project_id.eq(1) }, tasks.restrict { |r| r.project_id.eq(1) })
|
114
|
+
end
|
115
|
+
|
116
|
+
specify 'join' do
|
117
|
+
expected = projects.rename(:id => :project_id).join(tasks)
|
118
|
+
|
119
|
+
assert_eql_tuples(
|
120
|
+
projects.rename(:id => :project_id, :name => :project_name).join(tasks),
|
121
|
+
gateway(:projects).rename(:id => :project_id, :name => :project_name).join(tasks)
|
122
|
+
)
|
123
|
+
end
|
124
|
+
|
125
|
+
specify 'nested joins' do
|
126
|
+
assert_eql_tuples(
|
127
|
+
projects.join(projects).join(projects),
|
128
|
+
gateway(:projects).join(gateway(:projects)).join(gateway(:projects))
|
129
|
+
)
|
130
|
+
end
|
131
|
+
|
132
|
+
specify 'sort' do
|
133
|
+
assert_eql_tuples_order(
|
134
|
+
projects.sort_by { |r| [r.id.asc, r.name.asc] },
|
135
|
+
gateway(:projects).sort_by { |r| [r.id.asc, r.name.asc] }
|
136
|
+
)
|
137
|
+
end
|
138
|
+
|
139
|
+
specify 'limit' do
|
140
|
+
assert_eql_tuples_order(
|
141
|
+
projects.sort_by { |r| [r.id.asc, r.name.asc] }.take(1),
|
142
|
+
gateway(:projects).sort_by { |r| [r.id.asc, r.name.asc] }.take(1)
|
143
|
+
)
|
144
|
+
end
|
145
|
+
|
146
|
+
specify 'offset' do
|
147
|
+
assert_eql_tuples_order(
|
148
|
+
projects.sort_by { |r| [r.id.asc, r.name.asc] }.drop(1),
|
149
|
+
gateway(:projects).sort_by { |r| [r.id.asc, r.name.asc] }.drop(1)
|
150
|
+
)
|
151
|
+
end
|
152
|
+
|
153
|
+
specify 'summarize' do
|
154
|
+
assert_eql_tuples(
|
155
|
+
tasks.summarize([:project_id]) { |r| r.add(:count, r.name.count) },
|
156
|
+
gateway(:tasks).summarize([:project_id]) { |r| [r.add(:count, r.name.count)] }
|
157
|
+
)
|
158
|
+
end
|
159
|
+
|
160
|
+
specify 'extend' do
|
161
|
+
assert_eql_tuples(
|
162
|
+
tasks.extend { |r| r.add(:extend, r.project_id % 2) },
|
163
|
+
gateway(:tasks).extend { |r| r.add(:extend, r.project_id % 2) }
|
164
|
+
)
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
4
|
+
cd $DIR
|
5
|
+
|
6
|
+
VERSION=1.2.0
|
7
|
+
NAME=ArangoDB-$VERSION
|
8
|
+
|
9
|
+
if [ ! -d "$DIR/$NAME" ]; then
|
10
|
+
# download ArangoDB
|
11
|
+
echo "wget http://www.arangodb.org/travisCI/$NAME.tar.gz"
|
12
|
+
wget http://www.arangodb.org/travisCI/$NAME.tar.gz
|
13
|
+
echo "tar zxf $NAME.tar.gz"
|
14
|
+
tar zvxf $NAME.tar.gz
|
15
|
+
fi
|
16
|
+
|
17
|
+
ARCH=$(arch)
|
18
|
+
PID=$(echo $PPID)
|
19
|
+
TMP_DIR="/tmp/arangodb.$PID"
|
20
|
+
PID_FILE="/tmp/arangodb.$PID.pid"
|
21
|
+
ARANGODB_DIR="$DIR/$NAME"
|
22
|
+
|
23
|
+
ARANGOD="${ARANGODB_DIR}/bin/arangod"
|
24
|
+
if [ "$ARCH" == "x86_64" ]; then
|
25
|
+
ARANGOD="${ARANGOD}_x86_64"
|
26
|
+
fi
|
27
|
+
|
28
|
+
# create database directory
|
29
|
+
mkdir ${TMP_DIR}
|
30
|
+
|
31
|
+
echo "Starting arangodb '${ARANGOD}'"
|
32
|
+
|
33
|
+
${ARANGOD} \
|
34
|
+
--database.directory ${TMP_DIR} \
|
35
|
+
--configuration none \
|
36
|
+
--server.endpoint tcp://127.0.0.1:8529 \
|
37
|
+
--javascript.startup-directory ${ARANGODB_DIR}/js \
|
38
|
+
--javascript.modules-path ${ARANGODB_DIR}/js/server/modules:${ARANGODB_DIR}/js/common/modules \
|
39
|
+
--javascript.action-directory ${ARANGODB_DIR}/js/actions/system \
|
40
|
+
--database.maximal-journal-size 1048576 \
|
41
|
+
--server.disable-admin-interface true \
|
42
|
+
--server.disable-authentication true &
|
43
|
+
|
44
|
+
sleep 5
|
45
|
+
|
46
|
+
echo "Check for arangod process"
|
47
|
+
process=$(ps auxww | grep "bin/arangod" | grep -v grep)
|
48
|
+
|
49
|
+
if [ "x$process" == "x" ]; then
|
50
|
+
echo "no 'arangod' process found"
|
51
|
+
echo "ARCH = $ARCH"
|
52
|
+
exit 1
|
53
|
+
fi
|
54
|
+
|
55
|
+
echo "Waiting until ArangoDB is ready on port 8529"
|
56
|
+
while [[ -z `curl -s 'http://127.0.0.1:8529/_api/version' ` ]] ; do
|
57
|
+
echo -n "."
|
58
|
+
sleep 2s
|
59
|
+
done
|
60
|
+
|
61
|
+
echo "ArangoDB is up"
|
data/spec/setup/run.sh
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
# Run arango under my archlinux machine
|
3
|
+
|
4
|
+
PID=$(echo $PPID)
|
5
|
+
TMP_DIR="/tmp/arangodb.$PID"
|
6
|
+
PID_FILE="/tmp/arangodb.$PID.pid"
|
7
|
+
ARANGODB_DIR="/usr/share/arangodb"
|
8
|
+
|
9
|
+
# create database directory
|
10
|
+
mkdir ${TMP_DIR}
|
11
|
+
|
12
|
+
arangod \
|
13
|
+
--database.directory ${TMP_DIR} \
|
14
|
+
--configuration none \
|
15
|
+
--server.endpoint tcp://127.0.0.1:8529 \
|
16
|
+
--javascript.startup-directory ${ARANGODB_DIR}/js \
|
17
|
+
--javascript.modules-path ${ARANGODB_DIR}/js/server/modules:${ARANGODB_DIR}/js/common/modules \
|
18
|
+
--javascript.action-directory ${ARANGODB_DIR}/js/actions/system \
|
19
|
+
--log debug \
|
20
|
+
--database.maximal-journal-size 1048576 \
|
21
|
+
--server.disable-admin-interface true \
|
22
|
+
--server.disable-authentication true \
|
23
|
+
--javascript.gc-interval 1
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
shared_examples_for 'a binary relation method' do
|
4
|
+
describe 'when other has the same adapter' do
|
5
|
+
let(:other_relation) { mock('Other Relation') }
|
6
|
+
let(:other) { described_class.new(adapter, other_relation) }
|
7
|
+
let(:gateway) { mock('Other Gateway') }
|
8
|
+
|
9
|
+
before do
|
10
|
+
relation.stub(operation).and_return(gateway)
|
11
|
+
end
|
12
|
+
|
13
|
+
it { should be(gateway) }
|
14
|
+
|
15
|
+
it 'passes the other relation to the binary operation' do
|
16
|
+
relation.should_receive(operation) do |argument|
|
17
|
+
argument.should be(other_relation)
|
18
|
+
end
|
19
|
+
subject
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'when other has a different adapter' do
|
24
|
+
let(:other_adapter) { mock('Other Adapter') }
|
25
|
+
let(:other) { described_class.new(other_adapter, stub) }
|
26
|
+
|
27
|
+
before do
|
28
|
+
factory.stub!(:new).and_return(binary_relation)
|
29
|
+
end
|
30
|
+
|
31
|
+
it { should equal(binary_relation) }
|
32
|
+
|
33
|
+
it 'initializes the binary operation with the gateways' do
|
34
|
+
factory.should_receive(:new).with(object, other)
|
35
|
+
subject
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'when other has no adapter' do
|
40
|
+
let(:other) { mock('Other Relation') }
|
41
|
+
|
42
|
+
before do
|
43
|
+
factory.stub!(:new).and_return(binary_relation)
|
44
|
+
end
|
45
|
+
|
46
|
+
it { should equal(binary_relation) }
|
47
|
+
|
48
|
+
it 'initializes the binary operation with the gateway and other relation' do
|
49
|
+
factory.should_receive(:new).with(object, other)
|
50
|
+
subject
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
shared_examples_for 'a unary relation method' do
|
4
|
+
let(:gateway) { mock('New Gateway') }
|
5
|
+
|
6
|
+
before do
|
7
|
+
described_class.stub!(:new).and_return(gateway)
|
8
|
+
end
|
9
|
+
|
10
|
+
it { should equal(gateway) }
|
11
|
+
|
12
|
+
it 'tests the response is a relation' do
|
13
|
+
response.should_receive(:kind_of?).with(Axiom::Relation)
|
14
|
+
subject
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'initializes the new gateway with the adapter and response' do
|
18
|
+
described_class.should_receive(:new).with(adapter, response)
|
19
|
+
subject
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'axiom-arango-adapter'
|
4
|
+
require 'timeout'
|
5
|
+
require 'devtools'
|
6
|
+
Devtools.init_spec_helper
|
7
|
+
|
8
|
+
module InstanceMethodHelper
|
9
|
+
def instance_method_defined?(name)
|
10
|
+
instance_methods.map(&:to_sym).include?(name)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module AQLHelper
|
15
|
+
def compress_aql(string)
|
16
|
+
string.gsub(/^[ ]*/, '').split("\n").join(' ')
|
17
|
+
end
|
18
|
+
|
19
|
+
def expect_aql(string)
|
20
|
+
let(:header) { Axiom::Relation::Header.coerce([[:foo, String], [:bar, Integer]]) }
|
21
|
+
let(:base) { Axiom::Relation::Base.new(:name, header) }
|
22
|
+
let(:object) { described_class.new(relation, context) }
|
23
|
+
|
24
|
+
# Disjunct header for projection
|
25
|
+
let(:header_b) { Axiom::Relation::Header.coerce([[:baz, String]]) }
|
26
|
+
let(:base_b) { Axiom::Relation::Base.new(:name_b, header_b) }
|
27
|
+
|
28
|
+
# Overlapping header for join
|
29
|
+
let(:header_c) { Axiom::Relation::Header.coerce([[:baz, String], [:bar, Integer]]) }
|
30
|
+
let(:base_c) { Axiom::Relation::Base.new(:name_c, header_c) }
|
31
|
+
|
32
|
+
unless instance_method_defined?(:context)
|
33
|
+
let(:context) { nil }
|
34
|
+
end
|
35
|
+
|
36
|
+
expected_aql = compress_aql(string)
|
37
|
+
it_should_behave_like 'an idempotent method'
|
38
|
+
its(:aql) { should eql(expected_aql) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
RSpec.configure do |config|
|
43
|
+
config.include(Axiom)
|
44
|
+
config.extend(AQLHelper)
|
45
|
+
config.extend(InstanceMethodHelper)
|
46
|
+
config.around do |example|
|
47
|
+
Timeout.timeout(1) do
|
48
|
+
example.run
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Axiom::Adapter::Arango::Adapter, '.new' do
|
4
|
+
subject { object.new(*arguments) }
|
5
|
+
|
6
|
+
let(:object) { described_class }
|
7
|
+
|
8
|
+
let(:database) { mock('Database') }
|
9
|
+
let(:logger) { mock('Logger') }
|
10
|
+
|
11
|
+
context 'with single argument' do
|
12
|
+
let(:arguments) { [database] }
|
13
|
+
|
14
|
+
its(:database) { should be(database) }
|
15
|
+
its(:logger) { should be(NullLogger.instance) }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with two arguments' do
|
19
|
+
let(:arguments) { [database, logger] }
|
20
|
+
|
21
|
+
its(:database) { should be(database) }
|
22
|
+
its(:logger) { should be(logger) }
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Axiom::Adapter::Arango::Adapter, '#gateway' do
|
4
|
+
subject { object.gateway(relation) }
|
5
|
+
|
6
|
+
let(:object) { described_class.new(database) }
|
7
|
+
let(:relation) { mock('Relation') }
|
8
|
+
let(:database) { mock('Database') }
|
9
|
+
|
10
|
+
it { should eql(Axiom::Adapter::Arango::Gateway.new(object, relation)) }
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Axiom::Adapter::Arango::Adapter, '#reader' do
|
4
|
+
|
5
|
+
let(:object) { described_class.new(database) }
|
6
|
+
let(:database) { mock('Database') }
|
7
|
+
let(:relation) { mock('Relation') }
|
8
|
+
|
9
|
+
subject { object.reader(relation) }
|
10
|
+
|
11
|
+
it { should eql(Axiom::Adapter::Arango::Reader.new(object, relation)) }
|
12
|
+
end
|