crab 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -74,13 +74,32 @@ steps:
74
74
  ...
75
75
 
76
76
  Some data about stories can also be edited straight from the command line.
77
- In that sense, `crab` acts more like a command-line interface to Rally than a bridge
78
- between Rally and Cucumber, but the team thought these were *very* convenient
79
- features to have:
77
+ In that sense, `crab` acts more like a command-line interface to Rally than a
78
+ bridge between Rally and Cucumber, but the team thought these were *very*
79
+ convenient features to have:
80
+
81
+ $ crab create "Secure Access to Flying Fortress Controls"
82
+ US1004: Secure Access to Flying Fortress Controls (grooming)
80
83
 
81
84
  $ crab update US1001 --name "Arms Rockets Upon Successful Boot" --state completed
85
+ US1001: Arms Rockets Upon Successful Boot (completed)
86
+
87
+ $ crab delete US1004 # not in this movie :(
88
+ Story US1004 deleted.
89
+
90
+ It is also possible to add, update and delete test cases inside Rally straight
91
+ from the command line:
92
+
93
+ $ crab testcase add US1001 "Rocket Silo Is Unlocked"
94
+ US1001/TC1501: Rocket Silo Is Unlocked (important medium automated acceptance)
95
+
96
+ $ crab testcase update TC1501 --priority critical --risk low
97
+ US1001/TC1501: Rocket Silo Is Unlocked (critical low automated acceptance)
98
+
99
+ $ crab testcase delete TC1501
100
+ Test case TC1501 deleted.
82
101
 
83
- There are more switches. Check out `crab update --help` to find out more.
102
+ There are more switches. Try `crab --help` to find out more.
84
103
 
85
104
  i18n Support
86
105
  ------------
@@ -91,7 +110,7 @@ included:
91
110
  $ crab show US1001 -l ja
92
111
  機能: [US1001] Arms Rockets Upon Successful Boot
93
112
  ...
94
- シナリオ: [TC10388] Rocket Silo Is Unlocked
113
+ シナリオ: [TC1501] Rocket Silo Is Unlocked
95
114
  Given a silo where the rockets are stored
96
115
  ...
97
116
 
@@ -125,7 +144,6 @@ To do
125
144
 
126
145
  - Add a config command + .crab/config file to hold settings like project, etc
127
146
  - Add a `push` subcommand which parses a Cucumber feature and adds or updates it in Rally
128
- - Add a way to create, edit and delete test cases / scenarios from the command line
129
147
  - `pull` is not very smart and could detect feature files being moved from one dir to another
130
148
  - Recursively look for a `.crab` directory like Git does with `.git`
131
149
  - Encrypt password in generated `~/.crab/credentials`
@@ -13,6 +13,7 @@ require 'sanitize'
13
13
  require "crab/utilities"
14
14
  require "crab/rally"
15
15
  require "crab/story"
16
+ require "crab/testcase"
16
17
  require "crab/cli"
17
18
  require "crab/scenario"
18
19
 
@@ -5,16 +5,97 @@ module Crab::Commands
5
5
  def initialize(global_opts, args)
6
6
  @global_opts = global_opts
7
7
  @args = args
8
+ @rally = Crab::Rally.new
9
+
8
10
  @cmd_opts = Trollop::options do
9
11
  banner "crab testcase: manage test cases in a story (add, update, delete)
10
12
 
11
13
  Usage: crab [options] testcase add story name [options]
12
14
  crab [options] testcase update testcase [options]
13
15
  crab [options] testcase delete testcase [options]"
16
+
17
+ stop_on %w{add update delete}
14
18
  end
15
19
  end
16
20
 
17
21
  def run
22
+ sub = ARGV.shift
23
+ case sub
24
+ when "add"
25
+ opts = Trollop::options do
26
+ banner "crab testcase add: add a test case to a story in Rally"
27
+ opt :priority, "Priority (one of: #{Crab::TestCase::PRIORITIES.join(" ")}", :default => "important", :short => '-p'
28
+ opt :risk, "Risk (one of: #{Crab::TestCase::RISKS.join(" ")})", :default => "medium", :short => '-r'
29
+ opt :method, "Method (one of: #{Crab::TestCase::METHODS.join(" ")})", :default => "automated", :short => '-m'
30
+ opt :type, "Type (one of: #{Crab::TestCase::TYPES.join(" ")})", :default => "acceptance", :short => '-t'
31
+ opt :pre, "Pre-conditions", :default => "N/A"
32
+ opt :post, "Post-conditions", :default => "N/A"
33
+ opt :desc, "Description", :default => "N/A", :short => '-d'
34
+ end
35
+
36
+ story_id = ARGV.shift
37
+ name = ARGV.join(" ")
38
+ add(story_id, name, opts)
39
+
40
+ when "update"
41
+ opts = Trollop::options do
42
+ banner "crab testcase update: update a test case in Rally"
43
+ opt :priority, "Priority (one of: #{Crab::TestCase::PRIORITIES.join(" ")}", :default => "important", :short => '-p'
44
+ opt :risk, "Risk (one of: #{Crab::TestCase::RISKS.join(" ")})", :default => "medium", :short => '-r'
45
+ opt :method, "Method (one of: #{Crab::TestCase::METHODS.join(" ")})", :default => "automated", :short => '-m'
46
+ opt :type, "Type (one of: #{Crab::TestCase::TYPES.join(" ")})", :default => "acceptance", :short => '-t'
47
+ opt :pre, "Pre-conditions", :default => "N/A"
48
+ opt :post, "Post-conditions", :default => "N/A"
49
+ opt :desc, "Description", :default => "N/A", :short => '-d'
50
+ end
51
+
52
+ tc_id = ARGV.shift
53
+ update(tc_id, opts)
54
+
55
+ when "delete"
56
+ Trollop::options do
57
+ banner "crab testcase delete: delete a test case in Rally"
58
+ end
59
+
60
+ tc_id = ARGV.shift
61
+ delete(tc_id)
62
+
63
+ else
64
+ Trollop::die "Unknown subcommand#{' ' + sub.inspect if sub}"
65
+ end
66
+ end
67
+
68
+ def add(story_id, name, opts)
69
+ @rally.connect
70
+ tc = @rally.create_test_case(story_id, name, sanitize_options(opts))
71
+
72
+ puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")})"
73
+ end
74
+
75
+ def update(tc_id, opts)
76
+ @rally.connect
77
+ tc = @rally.find_test_case(tc_id)
78
+ tc.update(sanitize_options(opts))
79
+ puts "#{tc.story.formatted_id}/#{tc.formatted_id}: #{tc.name} (#{tc.tags.join(" ")}"
80
+ end
81
+
82
+ def delete(tc_id)
83
+ @rally.connect
84
+ tc = @rally.find_test_case(tc_id)
85
+ tc.delete
86
+ puts "Test case #{tc_id} deleted."
87
+ end
88
+
89
+ def sanitize_options(opts, creating=true)
90
+ result = {}
91
+ result[:priority] = opts[:priority].capitalize if creating || opts[:priority_given]
92
+ result[:risk] = opts[:risk].capitalize if creating || opts[:risk_given]
93
+ result[:method] = opts[:method].capitalize if creating || opts[:method_given]
94
+ result[:type] = opts[:type].capitalize if creating || opts[:type_given]
95
+ result[:pre_conditions] = opts[:pre] if creating || opts[:pre_given]
96
+ result[:post_conditions] = opts[:post] if creating || opts[:post_given]
97
+ result[:description] = opts[:desc] if creating || opts[:desc_given]
98
+ result
18
99
  end
19
100
  end
20
101
  end
@@ -49,5 +49,15 @@ module Crab
49
49
  def create_story(opts)
50
50
  Crab::Story.new @rally.create(:hierarchical_requirement, opts)
51
51
  end
52
+
53
+ def create_test_case(story_id, name, opts)
54
+ story = find_story_with_id story_id
55
+ Crab::TestCase.new @rally.create(:test_case, {:name => name, :work_product => story.rally_object, :project => story.rally_object.project}.merge(opts))
56
+ end
57
+
58
+ def find_test_case(tc_id)
59
+ Crab::TestCase.new @rally.find(:test_case) { equal :formatted_i_d, tc_id }.first
60
+ end
61
+
52
62
  end
53
63
  end
@@ -0,0 +1,55 @@
1
+ module Crab
2
+
3
+ class TestCase
4
+
5
+ PRIORITIES = %w{useful important critical}
6
+ RISKS = %w{low medium high}
7
+ METHODS = %w{automated manual}
8
+ TYPES = %w{acceptance functional non-functional performance regression usability}
9
+
10
+ def initialize(rally_test_case)
11
+ @rally_test_case = rally_test_case
12
+ end
13
+
14
+ def formatted_id
15
+ @rally_test_case.formatted_i_d
16
+ end
17
+
18
+ def name
19
+ @rally_test_case.name
20
+ end
21
+
22
+ def tags
23
+ [priority, risk, test_method, test_type].map &:parameterize
24
+ end
25
+
26
+ def priority
27
+ @rally_test_case.priority
28
+ end
29
+
30
+ def risk
31
+ @rally_test_case.risk
32
+ end
33
+
34
+ def test_method
35
+ @rally_test_case.elements[:method]
36
+ end
37
+
38
+ def test_type
39
+ @rally_test_case.elements[:type]
40
+ end
41
+
42
+ def story
43
+ Crab::Story.new @rally_test_case.work_product
44
+ end
45
+
46
+ def delete
47
+ @rally_test_case.delete
48
+ end
49
+
50
+ def update(options)
51
+ @rally_test_case.update options
52
+ end
53
+
54
+ end
55
+ end
@@ -1,3 +1,3 @@
1
1
  module Crab
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crab
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
9
+ - 6
10
+ version: 0.1.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Carlos Villela
@@ -187,6 +187,7 @@ files:
187
187
  - lib/crab/rally.rb
188
188
  - lib/crab/scenario.rb
189
189
  - lib/crab/story.rb
190
+ - lib/crab/testcase.rb
190
191
  - lib/crab/utilities.rb
191
192
  - lib/crab/version.rb
192
193
  has_rdoc: true