chassis 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +362 -0
- data/Rakefile +33 -0
- data/chassis.gemspec +41 -0
- data/examples/repo.rb +40 -0
- data/lib/chassis.rb +81 -0
- data/lib/chassis/array_utils.rb +8 -0
- data/lib/chassis/circuit_panel.rb +22 -0
- data/lib/chassis/core_ext/array.rb +5 -0
- data/lib/chassis/core_ext/hash.rb +5 -0
- data/lib/chassis/core_ext/string.rb +13 -0
- data/lib/chassis/delegate.rb +29 -0
- data/lib/chassis/dirty_session.rb +105 -0
- data/lib/chassis/error.rb +7 -0
- data/lib/chassis/faraday.rb +226 -0
- data/lib/chassis/form.rb +56 -0
- data/lib/chassis/hash_utils.rb +16 -0
- data/lib/chassis/heroku.rb +5 -0
- data/lib/chassis/initializable.rb +11 -0
- data/lib/chassis/logger.rb +8 -0
- data/lib/chassis/observable.rb +19 -0
- data/lib/chassis/persistence.rb +49 -0
- data/lib/chassis/rack/bouncer.rb +33 -0
- data/lib/chassis/rack/builder_shim_patch.rb +7 -0
- data/lib/chassis/rack/health_check.rb +45 -0
- data/lib/chassis/rack/instrumentation.rb +20 -0
- data/lib/chassis/rack/json_body_parser.rb +20 -0
- data/lib/chassis/rack/no_robots.rb +24 -0
- data/lib/chassis/registry.rb +30 -0
- data/lib/chassis/repo.rb +73 -0
- data/lib/chassis/repo/base_repo.rb +99 -0
- data/lib/chassis/repo/delegation.rb +78 -0
- data/lib/chassis/repo/lazy_association.rb +57 -0
- data/lib/chassis/repo/memory_repo.rb +7 -0
- data/lib/chassis/repo/null_repo.rb +64 -0
- data/lib/chassis/repo/pstore_repo.rb +54 -0
- data/lib/chassis/repo/record_map.rb +44 -0
- data/lib/chassis/repo/redis_repo.rb +55 -0
- data/lib/chassis/serializable.rb +52 -0
- data/lib/chassis/string_utils.rb +50 -0
- data/lib/chassis/version.rb +3 -0
- data/lib/chassis/web_service.rb +61 -0
- data/test/array_utils_test.rb +23 -0
- data/test/chassis_test.rb +7 -0
- data/test/circuit_panel_test.rb +22 -0
- data/test/core_ext/array_test.rb +8 -0
- data/test/core_ext/hash_test.rb +8 -0
- data/test/core_ext/string_test.rb +16 -0
- data/test/delegate_test.rb +41 -0
- data/test/dirty_session_test.rb +138 -0
- data/test/error_test.rb +12 -0
- data/test/faraday_test.rb +749 -0
- data/test/form_test.rb +29 -0
- data/test/hash_utils_test.rb +17 -0
- data/test/initializable_test.rb +22 -0
- data/test/logger_test.rb +43 -0
- data/test/observable_test.rb +27 -0
- data/test/persistence_test.rb +112 -0
- data/test/prox_test.rb +7 -0
- data/test/rack/bouncer_test.rb +42 -0
- data/test/rack/builder_patch_test.rb +36 -0
- data/test/rack/health_check_test.rb +35 -0
- data/test/rack/instrumentation_test.rb +38 -0
- data/test/rack/json_body_parser_test.rb +38 -0
- data/test/rack/no_robots_test.rb +34 -0
- data/test/registry_test.rb +26 -0
- data/test/repo/delegation_test.rb +101 -0
- data/test/repo/lazy_association_test.rb +115 -0
- data/test/repo/memory_repo_test.rb +25 -0
- data/test/repo/null_repo_test.rb +48 -0
- data/test/repo/pstore_repo_test.rb +28 -0
- data/test/repo/redis_repo_test.rb +26 -0
- data/test/repo/repo_tests.rb +120 -0
- data/test/repo_test.rb +76 -0
- data/test/serializable_test.rb +77 -0
- data/test/string_utils_test.rb +21 -0
- data/test/test_helper.rb +10 -0
- data/test/web_service_test.rb +107 -0
- metadata +426 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class NoRobotsTest < MiniTest::Unit::TestCase
|
4
|
+
include Rack::Test::Methods
|
5
|
+
|
6
|
+
class HelloWorld
|
7
|
+
def call(env)
|
8
|
+
[200, {'Content-Type' => 'text/plain' }, 'Hi']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_reader :log, :app
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@log = StringIO.new
|
16
|
+
builder = Rack::Builder.new
|
17
|
+
builder.use Chassis::Rack::NoRobots
|
18
|
+
builder.run HelloWorld.new
|
19
|
+
@app = builder.to_app
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_does_not_allow_any_robots
|
23
|
+
get '/robots.txt'
|
24
|
+
|
25
|
+
assert_includes last_response.body, 'Disallow: /'
|
26
|
+
assert_includes last_response.body, 'User Agent: *'
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_allows_other_requests
|
30
|
+
get '/foo'
|
31
|
+
|
32
|
+
assert_equal 'Hi', last_response.body
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class RegistryTest < MiniTest::Unit::TestCase
|
4
|
+
def test_can_get_and_set_values
|
5
|
+
registry = Chassis::Registry.new
|
6
|
+
registry[:foo] = 'bar'
|
7
|
+
assert_equal registry.fetch(:foo), 'bar'
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_fails_with_an_error_if_nothing_registred
|
11
|
+
registry = Chassis::Registry.new
|
12
|
+
assert_raises Chassis::UnregisteredError do
|
13
|
+
registry.fetch :foo
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_can_be_cleared
|
18
|
+
registry = Chassis::Registry.new
|
19
|
+
registry[:foo] = 'bar'
|
20
|
+
assert_equal registry.fetch(:foo), 'bar'
|
21
|
+
registry.clear
|
22
|
+
assert_raises Chassis::UnregisteredError do
|
23
|
+
registry.fetch :foo
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class RepoDelegationTest < MiniTest::Unit::TestCase
|
4
|
+
class PersonRepo
|
5
|
+
extend Chassis::Repo::Delegation
|
6
|
+
|
7
|
+
def self.obj_class
|
8
|
+
Person
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class SomethingSomething
|
13
|
+
extend Chassis::Repo::Delegation
|
14
|
+
end
|
15
|
+
|
16
|
+
Person = Struct.new :name
|
17
|
+
|
18
|
+
attr_reader :target, :person
|
19
|
+
|
20
|
+
def repo
|
21
|
+
PersonRepo
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup
|
25
|
+
@target = mock
|
26
|
+
@person = Person.new 'ahawkins'
|
27
|
+
Chassis::Repo.stubs(:default).returns(target)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_classes_that_dont_match_on_name_fail_with_a_helpful_error
|
31
|
+
assert_raises Chassis::UnknownObjectClassError do
|
32
|
+
SomethingSomething.object_class
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_find_delegates_to_the_target
|
37
|
+
target.expects(:find).with(Person, 1)
|
38
|
+
repo.find(1)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_delete_delegates_to_the_target
|
42
|
+
target.expects(:delete).with(person)
|
43
|
+
repo.delete(person)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_save_delegates_to_the_target
|
47
|
+
target.expects(:save).with(person)
|
48
|
+
repo.save(person)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_first_delegates_to_the_target
|
52
|
+
target.expects(:first).with(Person)
|
53
|
+
repo.first
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_last_delegates_to_the_target
|
57
|
+
target.expects(:last).with(Person)
|
58
|
+
repo.last
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_all_delegates_to_the_target
|
62
|
+
target.expects(:all).with(Person)
|
63
|
+
repo.all
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_count_delegates_to_the_target
|
67
|
+
target.expects(:count).with(Person)
|
68
|
+
repo.count
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_query_delegates_to_the_target
|
72
|
+
target.expects(:query).with(Person, :foo)
|
73
|
+
repo.query :foo
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_query_bang__delegates_to_the_target
|
77
|
+
target.expects(:query!).with(Person, :foo)
|
78
|
+
repo.query! :foo
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_graph_query_delegates_to_the_target
|
82
|
+
target.expects(:graph_query).with(Person, :foo)
|
83
|
+
repo.graph_query(:foo)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_sample_delegates_to_the_backend
|
87
|
+
target.expects(:sample).with(Person)
|
88
|
+
repo.sample
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_empty_delegates_to_the_backend
|
92
|
+
target.expects(:empty?).with(Person)
|
93
|
+
repo.empty?
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_lazy_returns_new_lazy_associations
|
97
|
+
target.expects(:find).never
|
98
|
+
person = repo.lazy 'ahawkins'
|
99
|
+
assert_equal 'ahawkins', person.id
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class LazyAssociationTest < MiniTest::Unit::TestCase
|
4
|
+
class Person
|
5
|
+
attr_reader :id, :name
|
6
|
+
|
7
|
+
def initialize(id, name = nil)
|
8
|
+
@id, @name = id, name
|
9
|
+
end
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
other.instance_of?(self.class) && other.id == id
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class PersonRepo
|
17
|
+
class << self
|
18
|
+
def object_class
|
19
|
+
Person
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :repo
|
25
|
+
|
26
|
+
def lazy(repo, id)
|
27
|
+
Chassis::Repo::LazyAssociation.new repo, id
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup
|
31
|
+
@repo = PersonRepo
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_inspect_does_not_materialize
|
35
|
+
repo.expects(:find).never
|
36
|
+
lazy(repo, 1).inspect
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_does_not_materialize_for_the_id
|
40
|
+
repo.expects(:find).never
|
41
|
+
|
42
|
+
association = lazy repo, 1
|
43
|
+
assert_equal 1, association.id
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_reports_the_materialized_class
|
47
|
+
repo.expects(:find).never
|
48
|
+
|
49
|
+
association = lazy repo, 1
|
50
|
+
assert_equal repo.object_class, association.class
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_works_with_equality
|
54
|
+
repo.expects(:find).never
|
55
|
+
|
56
|
+
a = lazy repo, 1
|
57
|
+
b = lazy repo, 1
|
58
|
+
c = lazy repo, 2
|
59
|
+
|
60
|
+
assert_equal a, b
|
61
|
+
assert_equal b, a
|
62
|
+
|
63
|
+
refute_equal c, a
|
64
|
+
refute_equal a, c
|
65
|
+
|
66
|
+
assert a.eql?(b)
|
67
|
+
assert b.eql?(a)
|
68
|
+
|
69
|
+
refute b.eql?(c)
|
70
|
+
refute c.eql?(b)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_completes_impersonates_the_materialized_class
|
74
|
+
repo.expects(:find).never
|
75
|
+
|
76
|
+
association = lazy repo, 1
|
77
|
+
assert_instance_of repo.object_class, association
|
78
|
+
assert_kind_of repo.object_class, association
|
79
|
+
assert association.is_a?(repo.object_class), "is_a? not implemented correctly"
|
80
|
+
assert_equal repo.object_class, association.class
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_can_be_compared_to_materialized_objects
|
84
|
+
repo.expects(:find).never
|
85
|
+
|
86
|
+
person = Person.new 1
|
87
|
+
|
88
|
+
association = lazy repo, person.id
|
89
|
+
|
90
|
+
assert_equal association, person
|
91
|
+
assert_equal person, association
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_does_not_materialize_twice_when_cached
|
95
|
+
person = Person.new 1, 'ahawkins'
|
96
|
+
repo.expects(:find).with(person.id).returns(person).once
|
97
|
+
|
98
|
+
association = lazy repo, person.id
|
99
|
+
association.materialize
|
100
|
+
|
101
|
+
assert_equal person.name, association.name
|
102
|
+
|
103
|
+
reloaded = Marshal.load(Marshal.dump(association))
|
104
|
+
|
105
|
+
assert_equal person.name, reloaded.name
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_calls_to_unknown_methods_materialize_the_object
|
109
|
+
person = Person.new 1, 'ahawkins'
|
110
|
+
repo.expects(:find).with(person.id).returns(person).once
|
111
|
+
|
112
|
+
association = lazy repo, person.id
|
113
|
+
assert_equal person.name, association.name
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative 'repo_tests'
|
3
|
+
|
4
|
+
class MemoryRepoTest < MiniTest::Unit::TestCase
|
5
|
+
class TestRepo < Chassis::MemoryRepo
|
6
|
+
def query_person_named(klass, selector)
|
7
|
+
all(klass).select do |person|
|
8
|
+
person.name == selector.name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def graph_query_person_named(klass, selector)
|
13
|
+
all(klass).select do |person|
|
14
|
+
person.name == selector.name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
include RepoTests
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@repo = TestRepo.new
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class NullRepoTest < MiniTest::Unit::TestCase
|
4
|
+
Person = Struct.new :name do
|
5
|
+
attr_accessor :id
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :repo
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@repo = Chassis::NullRepo.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_create_sets_the_id
|
15
|
+
person = Person.new 'ahawkins'
|
16
|
+
repo.create person
|
17
|
+
|
18
|
+
assert person.id, "Repo must set the ID after creating"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_all_returns_an_empty_array
|
22
|
+
assert_equal [], repo.all(Person)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_implements_required_interface
|
26
|
+
assert_respond_to repo, :update
|
27
|
+
assert_respond_to repo, :delete
|
28
|
+
assert_respond_to repo, :find
|
29
|
+
assert_respond_to repo, :all
|
30
|
+
assert_respond_to repo, :count
|
31
|
+
assert_respond_to repo, :first
|
32
|
+
assert_respond_to repo, :last
|
33
|
+
assert_respond_to repo, :sample
|
34
|
+
assert_respond_to repo, :query
|
35
|
+
assert_respond_to repo, :graph_query
|
36
|
+
assert_respond_to repo, :graph_query
|
37
|
+
assert_respond_to repo, :clear
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_count_returns_no
|
41
|
+
assert_equal 0, repo.count(Person)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_first_and_last_return_nil
|
45
|
+
assert_nil repo.first(Person)
|
46
|
+
assert_nil repo.first(Person)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative 'repo_tests'
|
3
|
+
require 'pstore'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
class PStoreRepoTest < MiniTest::Unit::TestCase
|
7
|
+
class TestRepo < Chassis::PStoreRepo
|
8
|
+
def query_person_named(klass, selector)
|
9
|
+
all(klass).select do |person|
|
10
|
+
person.name == selector.name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def graph_query_person_named(klass, selector)
|
15
|
+
all(klass).select do |person|
|
16
|
+
person.name == selector.name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
include RepoTests
|
22
|
+
|
23
|
+
def setup
|
24
|
+
tempfile = Tempfile.new 'pstore.test'
|
25
|
+
@repo = TestRepo.new PStore.new(tempfile.path)
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative 'repo_tests'
|
3
|
+
require 'redis'
|
4
|
+
|
5
|
+
class RedisRepoTest < MiniTest::Unit::TestCase
|
6
|
+
class TestRepo < Chassis::RedisRepo
|
7
|
+
def query_person_named(klass, selector)
|
8
|
+
all(klass).select do |person|
|
9
|
+
person.name == selector.name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def graph_query_person_named(klass, selector)
|
14
|
+
all(klass).select do |person|
|
15
|
+
person.name == selector.name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
include RepoTests
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@repo = TestRepo.new Redis.new
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module RepoTests
|
2
|
+
Person = Struct.new :name do
|
3
|
+
attr_accessor :id
|
4
|
+
end
|
5
|
+
|
6
|
+
PersonNamed = Struct.new :name
|
7
|
+
PersonFooBarBaz = Class.new
|
8
|
+
|
9
|
+
def repo
|
10
|
+
fail "test class must assign @repo" unless @repo
|
11
|
+
@repo
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup
|
15
|
+
repo.clear
|
16
|
+
repo.initialize_storage
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_crud_operations
|
20
|
+
assert_equal 0, repo.count(Person), "Precondition: there should be no records"
|
21
|
+
|
22
|
+
person = Person.new 'ahawkins'
|
23
|
+
repo.create person
|
24
|
+
|
25
|
+
assert person.id, "repo must set the ID after creating"
|
26
|
+
|
27
|
+
assert_equal 1, repo.count(Person)
|
28
|
+
|
29
|
+
assert_equal person, repo.find(Person, person.id)
|
30
|
+
|
31
|
+
assert_equal [person], repo.all(Person)
|
32
|
+
|
33
|
+
person.name = 'adam'
|
34
|
+
repo.update person
|
35
|
+
assert_equal 'adam', repo.find(Person, person.id).name
|
36
|
+
|
37
|
+
repo.delete(person)
|
38
|
+
|
39
|
+
assert_equal 0, repo.count(Person)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_raises_error_when_no_reecord_exists
|
43
|
+
assert_equal 0, repo.count(Person)
|
44
|
+
|
45
|
+
assert_raises Chassis::RecordNotFoundError do
|
46
|
+
repo.find Person, 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_first_and_last
|
51
|
+
assert_equal 0, repo.count(Person), "Precondition: there should be no records"
|
52
|
+
|
53
|
+
adam = Person.new 'ahawkins'
|
54
|
+
peter = Person.new 'pepps'
|
55
|
+
|
56
|
+
repo.create adam
|
57
|
+
repo.create peter
|
58
|
+
|
59
|
+
assert_equal adam, repo.first(Person)
|
60
|
+
assert_equal peter, repo.last(Person)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_clear_wipes_data
|
64
|
+
assert_equal 0, repo.count(Person), "Precondition: there should be no records"
|
65
|
+
|
66
|
+
adam = Person.new 'ahawkins'
|
67
|
+
repo.create adam
|
68
|
+
|
69
|
+
refute_empty repo.all(Person)
|
70
|
+
assert_equal 1, repo.count(Person)
|
71
|
+
assert repo.find(Person, adam.id)
|
72
|
+
|
73
|
+
repo.clear
|
74
|
+
|
75
|
+
assert_empty repo.all(Person)
|
76
|
+
assert_equal 0, repo.count(Person)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_raises_an_error_when_query_not_implemented
|
80
|
+
assert_raises Chassis::QueryNotImplementedError do
|
81
|
+
repo.query Person, PersonFooBarBaz.new
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_uses_query_method_to_implement_queries
|
86
|
+
assert_equal 0, repo.count(Person), "Precondition: there should be no records"
|
87
|
+
|
88
|
+
adam = Person.new 'ahawkins'
|
89
|
+
peter = Person.new 'pepp'
|
90
|
+
|
91
|
+
repo.create adam
|
92
|
+
repo.create peter
|
93
|
+
|
94
|
+
assert_equal 2, repo.count(Person)
|
95
|
+
|
96
|
+
query = repo.query(Person, PersonNamed.new('ahawkins'))
|
97
|
+
refute_empty query
|
98
|
+
assert_equal adam, query.first
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_raises_an_error_when_a_graph_query_is_not_implemented
|
102
|
+
assert_raises Chassis::GraphQueryNotImplementedError do
|
103
|
+
repo.graph_query Person, PersonFooBarBaz.new
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_uses_the_specific_graph_query_method_for_graph_query
|
108
|
+
assert_equal 0, repo.count(Person), "Precondition: there should be no records"
|
109
|
+
|
110
|
+
adam = Person.new 'ahawkins'
|
111
|
+
peter = Person.new 'pepp'
|
112
|
+
|
113
|
+
repo.create adam
|
114
|
+
repo.create peter
|
115
|
+
|
116
|
+
query = repo.query(Person, PersonNamed.new('ahawkins'))
|
117
|
+
refute_empty query
|
118
|
+
assert_equal adam, query.first
|
119
|
+
end
|
120
|
+
end
|