ccp 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +3 -1
- data/lib/ccp/commands/composite.rb +3 -4
- data/lib/ccp/commands/core.rb +3 -5
- data/lib/ccp/commands/executable.rb +7 -11
- data/lib/ccp/commands/fixturable.rb +3 -11
- data/lib/ccp/persistent/loadable.rb +1 -0
- data/lib/ccp/receivers/fixtures.rb +32 -17
- data/lib/ccp/version.rb +1 -1
- data/spec/commands/composite_spec.rb +1 -1
- data/spec/commands/core_spec.rb +1 -1
- data/spec/commands/fixturable_test_composite_spec.rb +93 -0
- data/spec/examples/fixture_save_dir_and_test_spec.rb +79 -0
- data/spec/persistent/loadable_spec.rb +23 -0
- metadata +5 -3
data/README.rdoc
CHANGED
@@ -271,7 +271,9 @@ This generates "tmp/stub.json", "tmp/mock.json".
|
|
271
271
|
Once you got fixtures, call "test" method to test it.
|
272
272
|
|
273
273
|
Cmd.test
|
274
|
+
# or
|
275
|
+
# Cmd.execute(:fixture_test=>true)
|
274
276
|
|
275
277
|
This automatically searchs fixtures when no fixture files are explicitly given.
|
276
|
-
|
278
|
+
This mechanism is as same as 'fixture_save'.
|
277
279
|
|
@@ -4,9 +4,8 @@ module Ccp
|
|
4
4
|
def self.included(base)
|
5
5
|
super
|
6
6
|
base.class_eval do
|
7
|
-
|
8
|
-
extend
|
9
|
-
include Fixturable
|
7
|
+
include Core
|
8
|
+
extend CommandManager
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
@@ -25,7 +24,7 @@ module Ccp
|
|
25
24
|
######################################################################
|
26
25
|
### Class Methods
|
27
26
|
|
28
|
-
module
|
27
|
+
module CommandManager
|
29
28
|
include Resolvable
|
30
29
|
|
31
30
|
def prepend_command(klass, *args, &block)
|
data/lib/ccp/commands/core.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
module Ccp
|
2
2
|
module Commands
|
3
3
|
module Core
|
4
|
-
include Receivable
|
5
|
-
include Commentable
|
6
|
-
include Executable
|
7
|
-
|
8
4
|
def self.included(base)
|
9
5
|
super
|
10
6
|
base.class_eval do
|
11
|
-
|
7
|
+
include Receivable
|
8
|
+
include Commentable
|
9
|
+
include Executable
|
12
10
|
include Fixturable
|
13
11
|
end
|
14
12
|
end
|
@@ -3,17 +3,13 @@ module Ccp
|
|
3
3
|
module Executable
|
4
4
|
def self.included(base)
|
5
5
|
base.class_eval do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
c.receiver = options.delete(:receiver)
|
14
|
-
c.receiver.parse!(options)
|
15
|
-
c.receiver.execute(c)
|
16
|
-
return c
|
6
|
+
def self.execute(options = {})
|
7
|
+
c = new
|
8
|
+
c.receiver = options.delete(:receiver)
|
9
|
+
c.receiver.parse!(options)
|
10
|
+
c.receiver.execute(c)
|
11
|
+
return c
|
12
|
+
end
|
17
13
|
end
|
18
14
|
end
|
19
15
|
|
@@ -6,17 +6,9 @@ module Ccp
|
|
6
6
|
include Ccp::Utils::Options
|
7
7
|
dsl_accessor :fixture, options(:stub, :mock, :fail, :save, :keys, :dir, :kvs, :ext)
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
module Testable
|
14
|
-
def test(options = {})
|
15
|
-
c = new
|
16
|
-
c.receiver = options.delete(:receiver)
|
17
|
-
c.receiver.parse!(options)
|
18
|
-
c.receiver.test(c)
|
19
|
-
return c
|
9
|
+
def self.test(options = {})
|
10
|
+
execute({:fixture_test=>true}.merge(options))
|
11
|
+
end
|
20
12
|
end
|
21
13
|
end
|
22
14
|
end
|
@@ -8,10 +8,18 @@ module Ccp
|
|
8
8
|
super
|
9
9
|
observer.stop
|
10
10
|
fixture_save(cmd, observer.read, observer.write)
|
11
|
+
|
12
|
+
elsif fixture_test?(cmd)
|
13
|
+
stub = fixture_versioned_for(cmd)["stub"].path
|
14
|
+
fixture_stub(cmd.class.stub || (stub.exist? ? stub : nil))
|
15
|
+
super
|
16
|
+
mock = fixture_versioned_for(cmd)["mock"].path
|
17
|
+
fixture_mock(cmd, cmd.class.mock || mock)
|
18
|
+
|
11
19
|
else
|
12
|
-
fixture_stub(cmd)
|
20
|
+
fixture_stub(cmd.class.stub)
|
13
21
|
super
|
14
|
-
fixture_mock(cmd)
|
22
|
+
fixture_mock(cmd, cmd.class.mock)
|
15
23
|
end
|
16
24
|
end
|
17
25
|
|
@@ -20,6 +28,7 @@ module Ccp
|
|
20
28
|
|
21
29
|
# Schema
|
22
30
|
self[:fixture_save] = Object # Define schema explicitly to accept true|false|Proc
|
31
|
+
self[:fixture_test] = Object # Define schema explicitly to accept true|false|Proc
|
23
32
|
self[:fixture_keys] = Object # Define schema explicitly to accept true|[String]
|
24
33
|
|
25
34
|
# Values
|
@@ -27,6 +36,7 @@ module Ccp
|
|
27
36
|
self[:fixture_kvs] = :file
|
28
37
|
self[:fixture_ext] = :json
|
29
38
|
self[:fixture_save] = false
|
39
|
+
self[:fixture_test] = false
|
30
40
|
self[:fixture_keys] = true
|
31
41
|
self[:fixture_path_for] = default_fixture_path_for
|
32
42
|
end
|
@@ -39,27 +49,16 @@ module Ccp
|
|
39
49
|
super
|
40
50
|
end
|
41
51
|
|
42
|
-
def
|
43
|
-
|
44
|
-
stub = fixture_versioned_for(cmd)["stub"].path
|
45
|
-
runtime_stubs[cmd] = stub if stub.exist?
|
46
|
-
|
47
|
-
# set mock
|
48
|
-
runtime_mocks[cmd] = fixture_versioned_for(cmd)["mock"].path
|
49
|
-
|
50
|
-
execute(cmd)
|
51
|
-
end
|
52
|
-
|
53
|
-
def fixture_stub(cmd)
|
54
|
-
path = cmd.class.stub || runtime_stubs[cmd] or return
|
52
|
+
def fixture_stub(path)
|
53
|
+
return unless path
|
55
54
|
hash = Ccp::Persistent.load(path).read!
|
56
55
|
data.merge!(hash)
|
57
56
|
rescue Ccp::Persistent::NotFound => e
|
58
57
|
raise Ccp::Fixtures::NotFound, e.to_s
|
59
58
|
end
|
60
59
|
|
61
|
-
def fixture_mock(cmd)
|
62
|
-
|
60
|
+
def fixture_mock(cmd, path)
|
61
|
+
return unless path
|
63
62
|
hash = Ccp::Persistent.load(path).read!
|
64
63
|
|
65
64
|
hash.keys.each do |key|
|
@@ -126,6 +125,22 @@ module Ccp
|
|
126
125
|
storage.save(mock, fixture_keys_filter(keys, mock.keys))
|
127
126
|
end
|
128
127
|
|
128
|
+
def fixture_test?(cmd)
|
129
|
+
case (obj = self[:fixture_test])
|
130
|
+
when true ; true
|
131
|
+
when false ; false
|
132
|
+
when String; cmd.class.name == obj
|
133
|
+
when Array ; ary = obj.map(&:to_s); name = cmd.class.name
|
134
|
+
return false if ary.blank?
|
135
|
+
return true if ary.include?(name)
|
136
|
+
return false if ary.include?("!#{name}")
|
137
|
+
return true if ary.size == ary.grep(/^!/).size
|
138
|
+
return false
|
139
|
+
when Proc ; instance_exec(cmd, &obj).must(true,false) {raise ":fixture_test should return true|false"}
|
140
|
+
else; raise ":fixture_test is invalid: #{obj.class}"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
129
144
|
def fixture_keys_filter(acl, keys)
|
130
145
|
case acl
|
131
146
|
when true ; keys
|
data/lib/ccp/version.rb
CHANGED
data/spec/commands/core_spec.rb
CHANGED
@@ -0,0 +1,93 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Ccp::Receivers::Fixtures do
|
4
|
+
before do
|
5
|
+
FileUtils.rm_rf("tmp/fixtures")
|
6
|
+
FileUtils.mkdir_p("tmp/fixtures")
|
7
|
+
end
|
8
|
+
|
9
|
+
class CRFC1
|
10
|
+
def execute
|
11
|
+
data[:a] = 1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class CRFC2
|
16
|
+
def execute
|
17
|
+
data[:b] = 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class CRFCC
|
22
|
+
include Ccp::Commands::Composite
|
23
|
+
command CRFC1
|
24
|
+
command CRFC2
|
25
|
+
end
|
26
|
+
|
27
|
+
describe CRFCC do
|
28
|
+
describe ".test" do
|
29
|
+
it "should test CRFC1, CRFC2, CRFF in order" do
|
30
|
+
lambda {
|
31
|
+
CRFCC.test
|
32
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc1/mock.json")
|
33
|
+
|
34
|
+
save_fixture("tmp/fixtures/crfc1/mock.json", "a"=>1)
|
35
|
+
lambda {
|
36
|
+
CRFCC.test
|
37
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc2/mock.json")
|
38
|
+
|
39
|
+
save_fixture("tmp/fixtures/crfc2/mock.json", "b"=>2)
|
40
|
+
lambda {
|
41
|
+
CRFCC.test
|
42
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfcc/mock.json")
|
43
|
+
|
44
|
+
save_fixture("tmp/fixtures/crfcc/mock.json", {})
|
45
|
+
lambda {
|
46
|
+
CRFCC.test
|
47
|
+
}.should_not raise_error
|
48
|
+
end
|
49
|
+
|
50
|
+
context "(:fixture_test=>'CRFC2')" do
|
51
|
+
it "should test only CRFC2" do
|
52
|
+
lambda {
|
53
|
+
CRFCC.test(:fixture_test=>'CRFC2')
|
54
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc2/mock.json")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe ".execute" do
|
60
|
+
context "(:fixture_test=>true)" do
|
61
|
+
it "should test CRFC1, CRFC2, CRFF in order" do
|
62
|
+
lambda {
|
63
|
+
CRFCC.execute(:fixture_test=>true)
|
64
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc1/mock.json")
|
65
|
+
|
66
|
+
save_fixture("tmp/fixtures/crfc1/mock.json", "a"=>1)
|
67
|
+
lambda {
|
68
|
+
CRFCC.execute(:fixture_test=>true)
|
69
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc2/mock.json")
|
70
|
+
|
71
|
+
save_fixture("tmp/fixtures/crfc2/mock.json", "b"=>2)
|
72
|
+
lambda {
|
73
|
+
CRFCC.execute(:fixture_test=>true)
|
74
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfcc/mock.json")
|
75
|
+
|
76
|
+
save_fixture("tmp/fixtures/crfcc/mock.json", {})
|
77
|
+
lambda {
|
78
|
+
CRFCC.execute(:fixture_test=>true)
|
79
|
+
}.should_not raise_error
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "(:fixture_test=>'CRFC2')" do
|
84
|
+
it "should test only CRFC2" do
|
85
|
+
lambda {
|
86
|
+
CRFCC.execute(:fixture_test=>'CRFC2')
|
87
|
+
}.should raise_error(Ccp::Fixtures::NotFound, "tmp/fixtures/crfc2/mock.json")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Ccp::Receivers::Fixtures do
|
5
|
+
before do
|
6
|
+
FileUtils.rm_rf("tmp")
|
7
|
+
end
|
8
|
+
|
9
|
+
module Example1
|
10
|
+
class LoadInts
|
11
|
+
include Ccp::Commands::Core
|
12
|
+
def execute
|
13
|
+
data[:ints] = [10,20,30]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class CalculateMean
|
18
|
+
include Ccp::Commands::Core
|
19
|
+
def before
|
20
|
+
data.check(:ints)
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute
|
24
|
+
data[:mean] = data[:ints].sum / data[:ints].size
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Main < Ccp::Invokers::Base
|
29
|
+
command LoadInts
|
30
|
+
command CalculateMean
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe ".execute" do
|
35
|
+
context "(:fixture_save=>true, :fixture_kvs=>:dir, :fixture_ext=>:json)" do
|
36
|
+
before { @options = {:fixture_save=>true, :fixture_kvs=>:dir, :fixture_ext=>:json} }
|
37
|
+
|
38
|
+
it "should create stubs and mocks as dir" do
|
39
|
+
Example1::Main.execute(@options)
|
40
|
+
|
41
|
+
Pathname("tmp/fixtures/example1").should exist
|
42
|
+
Dir["tmp/**/*.json"].sort.should ==
|
43
|
+
["tmp/fixtures/example1/calculate_mean/mock.json",
|
44
|
+
"tmp/fixtures/example1/calculate_mean/mock.json/mean.json",
|
45
|
+
"tmp/fixtures/example1/calculate_mean/stub.json",
|
46
|
+
"tmp/fixtures/example1/calculate_mean/stub.json/ints.json",
|
47
|
+
"tmp/fixtures/example1/load_ints/mock.json",
|
48
|
+
"tmp/fixtures/example1/load_ints/mock.json/ints.json",
|
49
|
+
"tmp/fixtures/example1/main/mock.json",
|
50
|
+
"tmp/fixtures/example1/main/mock.json/ints.json",
|
51
|
+
"tmp/fixtures/example1/main/mock.json/mean.json",
|
52
|
+
"tmp/fixtures/example1/main/stub.json",
|
53
|
+
"tmp/fixtures/example1/main/stub.json/ints.json"]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should pass all test" do
|
57
|
+
Example1::Main.execute(@options)
|
58
|
+
lambda {
|
59
|
+
Example1::Main.test
|
60
|
+
}.should_not raise_error
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should pass partial test" do
|
64
|
+
Example1::Main.execute(@options)
|
65
|
+
lambda {
|
66
|
+
Example1::CalculateMean.test
|
67
|
+
}.should_not raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should raise Typed::NotDefined when partial stub file is deleted" do
|
71
|
+
Example1::Main.execute(@options)
|
72
|
+
Pathname("tmp/fixtures/example1/calculate_mean/stub.json/ints.json").unlink
|
73
|
+
lambda {
|
74
|
+
Example1::CalculateMean.test
|
75
|
+
}.should raise_error(Typed::NotDefined, /'ints' is not initialized/)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -6,6 +6,8 @@ describe Ccp::Persistent do
|
|
6
6
|
it { should respond_to("load") }
|
7
7
|
|
8
8
|
describe ".load" do
|
9
|
+
before { FileUtils.rm_rf "tmp" }
|
10
|
+
|
9
11
|
context "('tmp/foo.json')" do
|
10
12
|
subject { Ccp::Persistent.load('tmp/foo.json') }
|
11
13
|
its(:class) { should == Ccp::Persistent::File }
|
@@ -27,6 +29,27 @@ describe Ccp::Persistent do
|
|
27
29
|
its(:source) { should == 'tmp/foo.json' }
|
28
30
|
end
|
29
31
|
|
32
|
+
context "(Pathname('tmp/foo.json) with existed directory')" do
|
33
|
+
before { FileUtils.mkdir_p("tmp/foo.json") }
|
34
|
+
subject { Ccp::Persistent.load(Pathname('tmp/foo.json')) }
|
35
|
+
its(:class) { should == Ccp::Persistent::Dir }
|
36
|
+
its(:ext) { should == "json" }
|
37
|
+
its(:source) { should == Pathname('tmp/foo.json') }
|
38
|
+
end
|
39
|
+
|
40
|
+
context "('tmp/foo.json with existed directory')" do
|
41
|
+
before { FileUtils.mkdir_p("tmp/foo.json") }
|
42
|
+
subject { Ccp::Persistent.load('tmp/foo.json') }
|
43
|
+
its(:class) { should == Ccp::Persistent::Dir }
|
44
|
+
its(:ext) { should == "json" }
|
45
|
+
its(:source) { should == 'tmp/foo.json' }
|
46
|
+
|
47
|
+
it "can read!" do
|
48
|
+
save_fixture("tmp/foo.json/a.json", 1)
|
49
|
+
subject.read!.should == {"a"=>1}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
30
53
|
context "('tmp/foo')" do
|
31
54
|
it "should raise Ccp::Serializers::NotFound" do
|
32
55
|
lambda {
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ccp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 6
|
10
|
+
version: 0.2.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- maiha
|
@@ -145,7 +145,9 @@ files:
|
|
145
145
|
- spec/commands/core_spec.rb
|
146
146
|
- spec/commands/executable_spec.rb
|
147
147
|
- spec/commands/fixturable_spec.rb
|
148
|
+
- spec/commands/fixturable_test_composite_spec.rb
|
148
149
|
- spec/commands/fixturable_test_spec.rb
|
150
|
+
- spec/examples/fixture_save_dir_and_test_spec.rb
|
149
151
|
- spec/fixtures/cmd1stub_mock/mock.json
|
150
152
|
- spec/fixtures/stub/breadcrumbs.json
|
151
153
|
- spec/invokers/base_spec.rb
|