cuke_cataloger 1.4.0 → 1.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 30eaf9d9662dd4487ca55a63d56c3911c852e1d8
4
- data.tar.gz: 42302cb72e6d57fd83afb9494b8b88fc0400f137
3
+ metadata.gz: 7105dd4739cfcf77b2b055b427aa21584899e4e9
4
+ data.tar.gz: f05a36d1ab015534957dfcd679fd2385bdbe4793
5
5
  SHA512:
6
- metadata.gz: 0b9adbdc69989580d77ca66d151287c248c5cb55983c73fa51f9c91a345cc1d7290591de2190d7bde6050d26e89173ef1ba639511850d4a7e22d48ce68297d98
7
- data.tar.gz: 89ffe919e0773c884908785a116e90460e037f70e2330f16c86e724fb3ef4139a6b000c2a55e73913ffe387f4365d6a4f9fc033a23d2e7e9ef37177a7a43f19e
6
+ metadata.gz: 6269a07d0f33bbb791d1b6ea77e26b0aa8366370b84cf26ba0b97e32a2979018680697cf1ff3ad60c4445bb1281f8ba1bab647769be3897b0643045ffe7252e2
7
+ data.tar.gz: 05f2f4163333b9ae0e548324edeb6e648a145979289c8135dfce8334afba7ed2bb407d1ba43e830de1481741c6d29f55111b235cbb6b5776ee488949baf847b2
data/.simplecov CHANGED
@@ -1,8 +1,7 @@
1
1
  SimpleCov.start do
2
2
  root File.dirname(__FILE__)
3
3
 
4
- add_filter '/features/'
5
- add_filter '/spec/'
4
+ add_filter '/testing/'
6
5
 
7
6
  merge_timeout 300
8
7
  end
data/.travis.yml CHANGED
@@ -6,8 +6,9 @@ language: ruby
6
6
  rvm:
7
7
  - 1.8.7
8
8
  - 1.9.3
9
- - 2.2.2
9
+ - 2.3.3
10
10
  - 2.4.0
11
+ - jruby-9.1.7.0
11
12
 
12
13
  matrix:
13
14
  exclude:
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in cuke_cataloger.gemspec
4
4
  gemspec
data/History.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Release history
2
2
 
3
+ ### Version 1.4.1 / 2017-07-09
4
+
5
+ - Improved documentation
6
+
7
+
3
8
  ### Version 1.4.0 / 2017-04-18
4
9
 
5
10
  - Both cataloging and validation can now be used without including outline rows, if desired.
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Eric Kessler
1
+ Copyright (c) 2014-2017 Eric Kessler
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,16 +1,67 @@
1
- # CukeCataloger
2
-
3
-
4
- [![Gem Version](https://badge.fury.io/rb/cuke_cataloger.svg)](http://badge.fury.io/rb/cuke_cataloger)
1
+ [![Gem Version](https://badge.fury.io/rb/cuke_cataloger.svg)](https://rubygems.org/gems/cuke_cataloger)
2
+ [![Dependency Status](https://gemnasium.com/enkessler/cuke_cataloger.svg)](https://gemnasium.com/enkessler/cuke_cataloger)
5
3
  [![Build Status](https://travis-ci.org/enkessler/cuke_cataloger.svg?branch=dev)](https://travis-ci.org/enkessler/cuke_cataloger)
6
4
  [![Build status](https://ci.appveyor.com/api/projects/status/9a7gw3r5ddfugtf0/branch/dev?svg=true)](https://ci.appveyor.com/project/enkessler/cuke-cataloger/branch/dev)
7
- [![Coverage Status](https://coveralls.io/repos/enkessler/cuke_cataloger/badge.svg?branch=dev&service=github)](https://coveralls.io/github/enkessler/cuke_cataloger?branch=dev)
5
+ [![Coverage Status](https://coveralls.io/repos/github/enkessler/cuke_cataloger/badge.svg?branch=dev)](https://coveralls.io/github/enkessler/cuke_cataloger?branch=dev)
8
6
  [![Code Climate](https://codeclimate.com/github/enkessler/cuke_cataloger/badges/gpa.svg)](https://codeclimate.com/github/enkessler/cuke_cataloger)
7
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/gems/cuke_cataloger)
8
+ [![Inline docs](http://inch-ci.org/github/enkessler/cuke_cataloger.svg?branch=dev)](https://inch-ci.org/github/enkessler/cuke_cataloger?branch=dev)
9
9
  [![Project License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/enkessler/cuke_cataloger/blob/master/LICENSE.txt)
10
10
 
11
11
 
12
+ # CukeCataloger
13
+
14
+
12
15
  The cuke_cataloger gem is a convenient way to provide a unique id to every test case in your Cucumber test suite.
13
16
 
17
+ Turn your features from this
18
+
19
+ ````
20
+ Feature:
21
+
22
+ Scenario:
23
+ * a step
24
+
25
+ Scenario Outline:
26
+ * a step
27
+ Examples:
28
+ | param 1 |
29
+ | value 1 |
30
+ Examples:
31
+ | param 1 |
32
+ | value 1 |
33
+ | value 2 |
34
+
35
+ Scenario:
36
+ * a step
37
+ ````
38
+
39
+ into this!
40
+
41
+ ````
42
+ Feature:
43
+
44
+ @test_case_1
45
+ Scenario:
46
+ * a step
47
+
48
+ @test_case_2
49
+ Scenario Outline:
50
+ * a step
51
+ Examples:
52
+ | param 1 | test_case_id |
53
+ | value 1 | 2-1 |
54
+ Examples:
55
+ | param 1 | test_case_id |
56
+ | value 1 | 2-2 |
57
+ | value 2 | 2-3 |
58
+
59
+ @test_case_3
60
+ Scenario:
61
+ * a step
62
+ ````
63
+
64
+
14
65
  ## Installation
15
66
 
16
67
  Add this line to your application's Gemfile:
data/appveyor.yml CHANGED
@@ -2,55 +2,44 @@ version: '1.0.{build}'
2
2
 
3
3
  environment:
4
4
  matrix:
5
- - RUBY_VERSION: 187-x64
5
+ - RUBY_VERSION: 193
6
6
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler0.gemfile
7
- - RUBY_VERSION: 193-x64
7
+ # AppVeyor does not have a 64-bit Ruby 1.9.3
8
+ - RUBY_VERSION: 23
8
9
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler0.gemfile
9
- - RUBY_VERSION: 200-x64
10
- BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler0.gemfile
11
- - RUBY_VERSION: 21-x64
12
- BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler0.gemfile
13
- - RUBY_VERSION: 22-x64
10
+ - RUBY_VERSION: 23-x64
14
11
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler0.gemfile
15
12
 
16
- - RUBY_VERSION: 187-x64
17
- BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler1.gemfile
18
- - RUBY_VERSION: 193-x64
19
- BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler1.gemfile
20
- - RUBY_VERSION: 200-x64
13
+ - RUBY_VERSION: 193
21
14
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler1.gemfile
22
- - RUBY_VERSION: 21-x64
15
+ # AppVeyor does not have a 64-bit Ruby 1.9.3
16
+ - RUBY_VERSION: 23
23
17
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler1.gemfile
24
- - RUBY_VERSION: 22-x64
18
+ - RUBY_VERSION: 23-x64
25
19
  BUNDLE_GEMFILE: testing/gemfiles/cuke_modeler1.gemfile
26
20
 
27
- - RUBY_VERSION: 187-x64
21
+ - RUBY_VERSION: 193
28
22
  BUNDLE_GEMFILE: testing/gemfiles/rake10.gemfile
29
- - RUBY_VERSION: 193-x64
23
+ # AppVeyor does not have a 64-bit Ruby 1.9.3
24
+ - RUBY_VERSION: 23
30
25
  BUNDLE_GEMFILE: testing/gemfiles/rake10.gemfile
31
- - RUBY_VERSION: 200-x64
32
- BUNDLE_GEMFILE: testing/gemfiles/rake10.gemfile
33
- - RUBY_VERSION: 21-x64
34
- BUNDLE_GEMFILE: testing/gemfiles/rake10.gemfile
35
- - RUBY_VERSION: 22-x64
26
+ - RUBY_VERSION: 23-x64
36
27
  BUNDLE_GEMFILE: testing/gemfiles/rake10.gemfile
37
28
 
38
- - RUBY_VERSION: 193-x64
29
+ - RUBY_VERSION: 193
39
30
  BUNDLE_GEMFILE: testing/gemfiles/rake11.gemfile
40
- - RUBY_VERSION: 200-x64
31
+ # AppVeyor does not have a 64-bit Ruby 1.9.3
32
+ - RUBY_VERSION: 23
41
33
  BUNDLE_GEMFILE: testing/gemfiles/rake11.gemfile
42
- - RUBY_VERSION: 21-x64
43
- BUNDLE_GEMFILE: testing/gemfiles/rake11.gemfile
44
- - RUBY_VERSION: 22-x64
34
+ - RUBY_VERSION: 23-x64
45
35
  BUNDLE_GEMFILE: testing/gemfiles/rake11.gemfile
46
36
 
47
- - RUBY_VERSION: 193-x64
48
- BUNDLE_GEMFILE: testing/gemfiles/rake12.gemfile
49
- - RUBY_VERSION: 200-x64
37
+ - RUBY_VERSION: 193
50
38
  BUNDLE_GEMFILE: testing/gemfiles/rake12.gemfile
51
- - RUBY_VERSION: 21-x64
39
+ # AppVeyor does not have a 64-bit Ruby 1.9.3
40
+ - RUBY_VERSION: 23
52
41
  BUNDLE_GEMFILE: testing/gemfiles/rake12.gemfile
53
- - RUBY_VERSION: 22-x64
42
+ - RUBY_VERSION: 23-x64
54
43
  BUNDLE_GEMFILE: testing/gemfiles/rake12.gemfile
55
44
 
56
45
 
data/bin/cuke_cataloger CHANGED
@@ -33,26 +33,7 @@ class CLI < Thor
33
33
  puts "Including outline rows\n" if options[:row_id]
34
34
 
35
35
  results = CukeCataloger::UniqueTestCaseTagger.new.validate_test_ids(options[:location], options[:prefix], options[:row_id], options[:id_column_name])
36
- report_text = "Validation Results\nProblems found: #{results.count}\n\n"
37
-
38
-
39
- results_by_category = Hash.new { |hash, key| hash[key] = [] }
40
-
41
- results.each do |result|
42
- results_by_category[result[:problem]] << result
43
- end
44
-
45
- results_by_category.keys.each do |problem_category|
46
- report_text << "#{problem_category} problems: #{results_by_category[problem_category].count}\n"
47
- end
48
-
49
- results_by_category.keys.each do |problem_category|
50
- report_text << "\n\n#{problem_category} problems (#{results_by_category[problem_category].count}):\n"
51
-
52
- results_by_category[problem_category].each do |result|
53
- report_text << "#{result[:test]}\n"
54
- end
55
- end
36
+ report_text = CukeCataloger::TextReportFormatter.new.format_data(results)
56
37
 
57
38
  if options[:file]
58
39
  puts "Problems found: #{results.count}"
@@ -2,71 +2,14 @@ require 'rake'
2
2
  require 'cuke_modeler'
3
3
  require 'cql'
4
4
 
5
- require 'cuke_cataloger/version'
6
- require 'cuke_cataloger/unique_test_case_tagger'
7
-
8
- module CukeCataloger
9
-
10
- extend Rake::DSL
11
-
12
- # todo - test these better
13
-
14
- def self.create_tasks
15
-
16
- desc 'Add unique id tags to tests in the given directory'
17
- task 'tag_tests', [:directory, :prefix, :row_id, :id_column_name] do |t, args|
18
- location = args[:directory] || '.'
19
- prefix = args[:prefix] || '@test_case_'
20
- tag_rows = args[:row_id].nil? ? true : args[:row_id]
21
- id_column_name = args[:id_column_name] || 'test_case_id'
22
-
23
- puts "Tagging tests in '#{location}' with tag '#{prefix}'\n"
24
- puts "Including outline rows\n" if tag_rows
25
-
26
- tagger = CukeCataloger::UniqueTestCaseTagger.new
27
- tagger.tag_tests(location, prefix, {}, tag_rows, id_column_name)
28
- end
29
-
30
- desc 'Scan tests in the given directory for id problems'
31
- task 'validate_tests', [:directory, :prefix, :out_file, :row_id, :id_column_name] do |t, args|
32
- location = args[:directory] || '.'
33
- prefix = args[:prefix] || '@test_case_'
34
- tag_rows = args[:row_id].nil? ? true : args[:row_id]
35
- id_column_name = args[:id_column_name] || 'test_case_id'
36
-
37
- puts "Validating tests in '#{location}' with tag '#{prefix}'\n"
38
- puts "Including outline rows\n" if tag_rows
39
5
 
40
- results = CukeCataloger::UniqueTestCaseTagger.new.validate_test_ids(location, prefix, tag_rows, id_column_name)
41
- report_text = "Validation Results\nProblems found: #{results.count}\n\n"
6
+ # The top level namespace used by this gem
42
7
 
8
+ module CukeCataloger
9
+ end
43
10
 
44
- results_by_category = Hash.new { |hash, key| hash[key] = [] }
45
-
46
- results.each do |result|
47
- results_by_category[result[:problem]] << result
48
- end
49
-
50
- results_by_category.keys.each do |problem_category|
51
- report_text << "#{problem_category} problems: #{results_by_category[problem_category].count}\n"
52
- end
53
-
54
- results_by_category.keys.each do |problem_category|
55
- report_text << "\n\n#{problem_category} problems (#{results_by_category[problem_category].count}):\n"
56
-
57
- results_by_category[problem_category].each do |result|
58
- report_text << "#{result[:test]}\n"
59
- end
60
- end
61
-
62
- if args[:out_file]
63
- puts "Problems found: #{results.count}"
64
- File.open(args[:out_file], 'w') { |file| file.write(report_text) }
65
- else
66
- puts report_text
67
- end
68
- end
69
-
70
- end
71
11
 
72
- end
12
+ require 'cuke_cataloger/version'
13
+ require 'cuke_cataloger/unique_test_case_tagger'
14
+ require 'cuke_cataloger/rake_tasks'
15
+ require 'cuke_cataloger/formatters/text_report_formatter'
@@ -0,0 +1,33 @@
1
+ module CukeCataloger
2
+
3
+ # Not a part of the public API. Subject to change at any time.
4
+ class TextReportFormatter
5
+
6
+ # Formats validation results into a readable text report
7
+ def format_data(data)
8
+ report_text = "Validation Results\nProblems found: #{data.count}\n\n"
9
+
10
+
11
+ results_by_category = Hash.new { |hash, key| hash[key] = [] }
12
+
13
+ data.each do |result|
14
+ results_by_category[result[:problem]] << result
15
+ end
16
+
17
+ results_by_category.keys.each do |problem_category|
18
+ report_text << "#{problem_category} problems: #{results_by_category[problem_category].count}\n"
19
+ end
20
+
21
+ results_by_category.keys.each do |problem_category|
22
+ report_text << "\n\n#{problem_category} problems (#{results_by_category[problem_category].count}):\n"
23
+
24
+ results_by_category[problem_category].each do |result|
25
+ report_text << "#{result[:test]}\n"
26
+ end
27
+ end
28
+
29
+ report_text
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ module CukeCataloger
2
+
3
+ extend Rake::DSL
4
+
5
+
6
+ # Adds the gem's provided Rake tasks to the namespace from which the method is called
7
+ def self.create_tasks
8
+
9
+ desc 'Add unique id tags to tests in the given directory'
10
+ task 'tag_tests', [:directory, :prefix, :row_id, :id_column_name] do |t, args|
11
+ location = args[:directory] || '.'
12
+ prefix = args[:prefix] || '@test_case_'
13
+ tag_rows = args[:row_id].nil? ? true : args[:row_id]
14
+ id_column_name = args[:id_column_name] || 'test_case_id'
15
+
16
+ puts "Tagging tests in '#{location}' with tag '#{prefix}'\n"
17
+ puts "Including outline rows\n" if tag_rows
18
+
19
+ tagger = CukeCataloger::UniqueTestCaseTagger.new
20
+ tagger.tag_tests(location, prefix, {}, tag_rows, id_column_name)
21
+ end
22
+
23
+ desc 'Scan tests in the given directory for id problems'
24
+ task 'validate_tests', [:directory, :prefix, :out_file, :row_id, :id_column_name] do |t, args|
25
+ location = args[:directory] || '.'
26
+ prefix = args[:prefix] || '@test_case_'
27
+ tag_rows = args[:row_id].nil? ? true : args[:row_id]
28
+ id_column_name = args[:id_column_name] || 'test_case_id'
29
+
30
+ puts "Validating tests in '#{location}' with tag '#{prefix}'\n"
31
+ puts "Including outline rows\n" if tag_rows
32
+
33
+ results = CukeCataloger::UniqueTestCaseTagger.new.validate_test_ids(location, prefix, tag_rows, id_column_name)
34
+ report_text = CukeCataloger::TextReportFormatter.new.format_data(results)
35
+
36
+ if args[:out_file]
37
+ puts "Problems found: #{results.count}"
38
+ File.open(args[:out_file], 'w') { |file| file.write(report_text) }
39
+ else
40
+ puts report_text
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -1,10 +1,17 @@
1
1
  module CukeCataloger
2
+
3
+ # A tagger that handles test case cataloging.
4
+
2
5
  class UniqueTestCaseTagger
3
6
 
4
- SUB_ID_PATTERN = /^\d+\-\d+$/
5
- SUB_ID_MATCH_PATTERN = /^\d+\-(\d+)$/
7
+ # The pattern of a sub id
8
+ SUB_ID_PATTERN = /^\d+\-\d+$/ # Not a part of the public API. Subject to change at any time.
6
9
 
10
+ # The pattern of a sub id, with id capture
11
+ SUB_ID_MATCH_PATTERN = /^\d+\-(\d+)$/ # Not a part of the public API. Subject to change at any time.
7
12
 
13
+
14
+ # Where the id tag should be placed, relative to the other tags on the test
8
15
  attr_accessor :tag_location
9
16
 
10
17
 
@@ -13,6 +20,7 @@ module CukeCataloger
13
20
  @tag_location = :adjacent
14
21
  end
15
22
 
23
+ # Adds id tags based on *tag_prefix* to the tests found in *feature_directory*
16
24
  def tag_tests(feature_directory, tag_prefix, explicit_indexes = {}, tag_rows = true, id_column_name = 'test_case_id')
17
25
  warn("This script will potentially rewrite all of your feature files. Please be patient and remember to tip your source control system.")
18
26
 
@@ -37,6 +45,7 @@ module CukeCataloger
37
45
  end
38
46
  end
39
47
 
48
+ # Finds existing id tags and their associated tests in *feature_directory* based on *tag_prefix*
40
49
  def scan_for_tagged_tests(feature_directory, tag_prefix, id_column_name = 'test_case_id')
41
50
  @results = []
42
51
  @known_id_tags = {}
@@ -61,6 +70,7 @@ module CukeCataloger
61
70
  @results
62
71
  end
63
72
 
73
+ # Checks for cataloging problems in *feature_directory* based on *tag_prefix*
64
74
  def validate_test_ids(feature_directory, tag_prefix, tag_rows = true, id_column_name = 'test_case_id')
65
75
  @results = []
66
76
  @known_id_tags = {}
@@ -74,6 +84,7 @@ module CukeCataloger
74
84
  @results
75
85
  end
76
86
 
87
+ # Finds existing id tags in *feature_directory* based on *tag_prefix*
77
88
  def determine_known_ids(feature_directory, tag_prefix, id_column_name = 'test_case_id')
78
89
  known_ids = []
79
90
 
@@ -198,6 +209,7 @@ module CukeCataloger
198
209
  end
199
210
  end
200
211
 
212
+ # Checks the rows of the given test for the given problem
201
213
  def validate_rows(test, rule, desired, row_check, id_column_name)
202
214
  test.examples.each do |example|
203
215
  if has_id_column?(example, id_column_name)
@@ -435,10 +447,12 @@ module CukeCataloger
435
447
  example.parameters.any? { |parameter| parameter == id_column_name }
436
448
  end
437
449
 
450
+ # Adds an id column to the given parameter row
438
451
  def update_parameter_row(file_lines, line_index, parameter)
439
452
  append_row!(file_lines, line_index, " #{parameter} |")
440
453
  end
441
454
 
455
+ # Adds an id to the given value row
442
456
  def update_value_row(file_lines, line_index, row, row_id, id_column_name)
443
457
  case
444
458
  when needs_adding?(row, id_column_name)
@@ -458,16 +472,19 @@ module CukeCataloger
458
472
  has_id_parameter?(row.get_ancestor(:example), id_column_name)
459
473
  end
460
474
 
475
+ # Replaces the indicated line of text with the provided line of tet
461
476
  def replace_row!(file_lines, line_index, new_line)
462
477
  file_lines[line_index] = new_line
463
478
  end
464
479
 
480
+ # Adds text to the beginning of the given line (with whitespace loss)
465
481
  def prepend_row!(file_lines, line_index, string)
466
482
  old_row = file_lines[line_index]
467
483
  new_row = string + old_row.lstrip
468
484
  file_lines[line_index] = new_row
469
485
  end
470
486
 
487
+ # Adds text to the end of the given line (with whitespace loss)
471
488
  def append_row!(file_lines, line_index, string)
472
489
  old_row = file_lines[line_index]
473
490
  trailing_bits = old_row[/\s*$/]
@@ -509,6 +526,7 @@ module CukeCataloger
509
526
  default_indexes
510
527
  end
511
528
 
529
+ # Merges the given index sets (of the shape {:primary => Integer, :sub => Hash}) into a new one
512
530
  def merge_indexes(set1, set2)
513
531
  set1.merge(set2) { |key, set1_value, set2_value|
514
532
  key == :sub ? set1_value.merge(set2_value) : set2_value
@@ -540,8 +558,9 @@ module CukeCataloger
540
558
  indentation
541
559
  end
542
560
 
561
+ # Adds an id to the given value row (which has a column for an id but no value for it)
543
562
  def fill_in_row(file_lines, line_index, row, row_id, id_column_name)
544
- old_row = file_lines[line_index]
563
+ old_row = file_lines[line_index] # todo - Dead line of code?
545
564
  sections = file_lines[line_index].split('|', -1)
546
565
 
547
566
  replacement_index = determine_row_id_cell_index(row, id_column_name)
@@ -1,3 +1,4 @@
1
1
  module CukeCataloger
2
- VERSION = '1.4.0'
2
+ # The current version of the gem
3
+ VERSION = '1.4.1'
3
4
  end
@@ -0,0 +1,48 @@
1
+ Feature: Cataloging tasks
2
+
3
+ Cataloging functionality can be invoked using Rake tasks that are provided by this gem.
4
+
5
+
6
+ Background: Rake task availability
7
+ * the Rake tasks provided by the gem have been loaded
8
+
9
+
10
+ Scenario: Cataloging test cases
11
+
12
+ Note: By default, cataloging will be done in the current directory using the '@test_case_' prefix and outline rows will also be cataloged.
13
+
14
+ Given there are test cases in the "." directory that have not been cataloged with "@test_case_"
15
+ When the following task is invoked:
16
+ """
17
+ tag_tests
18
+ """
19
+ Then all of the test cases in the "." directory will be cataloged with "@test_case_"
20
+
21
+ Scenario: Specifying cataloging options
22
+
23
+ Note: Due to the implementation of teh Rake tasks, not all options can be used from the command line. Some options only work when invoking the task within other code.
24
+
25
+ Given there are test cases in the "tests" directory that have not been cataloged with "@foo"
26
+ When the following code is run:
27
+ """
28
+ Rake::Task['tag_tests'].invoke('<path_to>/tests','@foo', false)
29
+ """
30
+ Then all of the scenarios and outlines in the "tests" directory will be cataloged with "@foo"
31
+ But outline rows in the "tests" directory are not cataloged
32
+
33
+ Scenario: Validating test cases
34
+
35
+ Note: By default, validation will be done in the current directory using the '@test_case_' prefix
36
+
37
+ When the following task is invoked:
38
+ """
39
+ validate_tests
40
+ """
41
+ Then a validation report for the "." directory with prefix "@test_case_" is output to the console
42
+
43
+ Scenario: Specifying validation options
44
+ When the following task is invoked:
45
+ """
46
+ validate_tests['<path_to>/tests','@foo','<path_to>/foo.txt']
47
+ """
48
+ Then a validation report for the "tests" directory with prefix "@foo" is output to "foo.txt"
@@ -30,7 +30,7 @@ end
30
30
  When(/^the following command is executed:$/) do |command|
31
31
  if command =~ /--file /
32
32
  output_file_name = command.match(/--file <path_to>\/(.*)\.txt/)[1]
33
- command.sub!(/--file <path_to>\/(.*)\.txt/, "--file #{DEFAULT_FILE_DIRECTORY}/#{output_file_name}.txt")
33
+ command.sub!(/--file <path_to>\/(.*)\.txt/, "--file #{@root_test_directory}/#{output_file_name}.txt")
34
34
  end
35
35
 
36
36
  command.sub!('<path_to>', FIXTURE_DIRECTORY)
@@ -40,3 +40,19 @@ When(/^the following command is executed:$/) do |command|
40
40
  @output = `#{command}`
41
41
  end
42
42
  end
43
+
44
+ When(/^the following task is invoked:$/) do |command|
45
+ command.sub!('<path_to>/tests', "#{FIXTURE_DIRECTORY}/tests")
46
+ command.sub!('<path_to>/foo', "#{@root_test_directory}/foo")
47
+ command = "bundle exec rake #{command}"
48
+
49
+ Dir.chdir(FIXTURE_DIRECTORY) do
50
+ @output = `#{command}`
51
+ end
52
+ end
53
+
54
+ When(/^the following code is run:$/) do |code_text|
55
+ code_text.sub!('<path_to>', FIXTURE_DIRECTORY)
56
+
57
+ eval(code_text)
58
+ end
@@ -1,13 +1,13 @@
1
1
  Given /^the following feature file(?: "([^"]*)")?:$/ do |file_name, file_text|
2
- @test_directory = @default_file_directory
2
+ @test_directory = @root_test_directory
3
3
  @files_created ||= 0
4
4
  @feature_files ||= []
5
5
 
6
- file_name ||= "#{@default_feature_file_name}_#{@files_created + 1}.feature"
7
- file_path = "#{@test_directory}/#{file_name}"
8
- @feature_files << file_path
6
+ file_name ||= "test_feature_#{@files_created + 1}"
7
+ file_name = File.basename(file_name, '.feature')
9
8
 
10
- File.open(file_path, 'w') { |file| file.write file_text }
9
+ file_path = CukeCataloger::FileHelper.create_feature_file(:directory => @test_directory, :name => file_name, :text => file_text)
10
+ @feature_files << file_path
11
11
 
12
12
  @files_created += 1
13
13
  end
@@ -27,15 +27,17 @@ And(/^a start index of "([^"]*)" for testcase "([^"]*)"$/) do |sub_index, parent
27
27
  end
28
28
 
29
29
  Given(/^a feature file$/) do
30
- @test_directory = @default_file_directory
30
+ @test_directory = @root_test_directory
31
31
  @files_created ||= 0
32
32
  @feature_files ||= []
33
33
 
34
- file_name ||= "#{@default_feature_file_name}_#{@files_created + 1}.feature"
35
- file_path = "#{@test_directory}/#{file_name}"
36
- @feature_files << file_path
34
+ file_name = "test_feature_#{@files_created + 1}.feature"
35
+ file_name = File.basename(file_name, '.feature')
37
36
 
38
- File.open(file_path, 'w') { |file| file.write "Feature:\nScenario Outline:\n* a step\nExamples:\n| param 1 |\n| value 1 |" }
37
+ file_text = "Feature:\nScenario Outline:\n* a step\nExamples:\n| param 1 |\n| value 1 |"
38
+
39
+ file_path = CukeCataloger::FileHelper.create_feature_file(:directory => @test_directory, :name => file_name, :text => file_text)
40
+ @feature_files << file_path
39
41
 
40
42
  @files_created += 1
41
43
  end
@@ -67,3 +69,8 @@ And(/^there are test cases in the "([^"]*)" directory that have not been catalog
67
69
  # Making sure that there is work to be done, thus avoiding false positives
68
70
  expect(@test_results.select { |test_result| test_result[:problem] == :missing_tag }).to_not be_empty
69
71
  end
72
+
73
+ Given(/^the Rake tasks provided by the gem have been loaded$/) do
74
+ File.open("#{FIXTURE_DIRECTORY}/Rakefile", 'a') { |file| file.puts 'CukeCataloger.create_tasks' }
75
+ CukeCataloger.create_tasks
76
+ end
@@ -116,14 +116,18 @@ def verify_category_results(category, results)
116
116
  end
117
117
 
118
118
  def verify_results(results)
119
- expect(@test_results.collect { |test_result| test_result[:test] }).to match_array(process_results(results))
119
+ actual = @test_results.collect { |test_result| test_result[:test] }
120
+ expected = process_expected_results(results)
121
+
122
+ expect(actual).to match_array(expected)
120
123
  end
121
124
 
122
- def process_results(results)
125
+ def process_expected_results(results)
123
126
  results = results.raw.flatten
124
- results.collect { |test_path| test_path.sub('path/to', @default_file_directory) }
127
+ results.collect { |test_path| test_path.sub('path/to', @root_test_directory) }
125
128
  end
126
129
 
130
+
127
131
  Then(/^the resulting first file is:$/) do |expected_text|
128
132
  file_name = @feature_files[0]
129
133
 
@@ -197,7 +201,7 @@ end
197
201
 
198
202
  Then(/^a validation report for the "([^"]*)" directory with prefix "([^"]*)" is output to "([^"]*)"$/) do |target_directory, prefix, filename|
199
203
  target_directory = "#{FIXTURE_DIRECTORY}/#{target_directory}"
200
- filename = "#{DEFAULT_FILE_DIRECTORY}/#{filename}"
204
+ filename = "#{@root_test_directory}/#{filename}"
201
205
 
202
206
  expect(@output).to include("Validating tests in '#{target_directory}' with tag '#{prefix}'")
203
207
  expect(@output).to include("Problems found:")
@@ -3,21 +3,18 @@ unless RUBY_VERSION.to_s < '1.9.0'
3
3
  SimpleCov.command_name('cuke_cataloger-cucumber')
4
4
  end
5
5
 
6
+
6
7
  require 'cuke_cataloger'
7
8
 
8
9
  here = File.dirname(__FILE__)
10
+ require "#{here}/../../file_helper"
9
11
 
10
- DEFAULT_FEATURE_FILE_NAME = 'test_feature'
11
- DEFAULT_FILE_DIRECTORY = "#{here}/../temp_files"
12
12
  PROJECT_ROOT = "#{here}/../../.."
13
13
  FIXTURE_DIRECTORY = "#{here}/../../fixtures"
14
14
 
15
15
  Before do
16
16
  begin
17
- @default_feature_file_name = DEFAULT_FEATURE_FILE_NAME
18
- @default_file_directory = DEFAULT_FILE_DIRECTORY
19
-
20
- FileUtils.mkdir(@default_file_directory)
17
+ @root_test_directory = CukeCataloger::FileHelper.create_directory
21
18
  rescue => e
22
19
  puts "Error caught in before hook!"
23
20
  puts "Type: #{e.class}"
@@ -28,10 +25,16 @@ end
28
25
  After do
29
26
  begin
30
27
  `git checkout HEAD -- #{FIXTURE_DIRECTORY}`
31
- FileUtils.remove_dir(@default_file_directory, true)
32
28
  rescue => e
33
29
  puts "Error caught in before hook!"
34
30
  puts "Type: #{e.class}"
35
31
  puts "Message: #{e.message}"
36
32
  end
37
33
  end
34
+
35
+
36
+ at_exit {
37
+ CukeCataloger::FileHelper.created_directories.each do |dir_path|
38
+ FileUtils.remove_entry(dir_path, true)
39
+ end
40
+ }
@@ -0,0 +1,39 @@
1
+ module CukeCataloger
2
+ module FileHelper
3
+
4
+ class << self
5
+
6
+ def create_feature_file(options = {})
7
+ options[:text] ||= 'Feature:'
8
+ options[:name] ||= 'test_file'
9
+
10
+ create_file(:text => options[:text], :name => options[:name], :extension => '.feature', :directory => options[:directory])
11
+ end
12
+
13
+ def create_file(options = {})
14
+ options[:text] ||= ''
15
+ options[:name] ||= 'test_file'
16
+ options[:extension] ||= '.txt'
17
+ options[:directory] ||= create_directory
18
+
19
+ file_path = "#{options[:directory]}/#{options[:name]}#{options[:extension]}"
20
+ File.open(file_path, 'w') { |file| file.write(options[:text]) }
21
+
22
+ file_path
23
+ end
24
+
25
+ def created_directories
26
+ @created_directories ||= []
27
+ end
28
+
29
+ def create_directory
30
+ new_dir = Dir::mktmpdir
31
+ created_directories << new_dir
32
+
33
+ new_dir
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ unless RUBY_VERSION.to_s < '1.9.0'
2
+ require 'simplecov'
3
+ require 'securerandom'
4
+
5
+ SimpleCov.start do
6
+ root File.dirname(__FILE__) + '/../..'
7
+
8
+ # Every test process will need its own unique name or else they will override each others' coverage data
9
+ command_name("cuke_cataloger-fixtures-#{SecureRandom.uuid}")
10
+
11
+ add_filter '/testing/'
12
+
13
+ merge_timeout 300
14
+ end
15
+
16
+ end
17
+
18
+
19
+ require 'cuke_cataloger'
@@ -4,24 +4,20 @@ unless RUBY_VERSION.to_s < '1.9.0'
4
4
  end
5
5
 
6
6
  here = File.dirname(__FILE__)
7
-
7
+ require "#{here}/../../file_helper"
8
8
 
9
9
  require 'cuke_cataloger'
10
10
 
11
- require 'tempfile'
12
11
 
13
12
  RSpec.configure do |config|
14
13
  config.before(:all) do
15
- @default_file_directory = "#{here}/temp_files"
16
- @default_test_file_directory = "#{here}/test_files"
17
14
  @lib_directory = "#{here}/../../../lib"
18
15
  end
19
16
 
20
- config.before(:each) do
21
- FileUtils.mkpath(@default_file_directory)
17
+ config.after(:all) do
18
+ CukeCataloger::FileHelper.created_directories.each do |dir_path|
19
+ FileUtils.remove_entry(dir_path, true)
20
+ end
22
21
  end
23
22
 
24
- config.after(:each) do
25
- FileUtils.remove_dir(@default_file_directory, true)
26
- end
27
23
  end
@@ -20,7 +20,7 @@ describe 'UniqueTestCaseTagger, Integration' do
20
20
  # Using ids that are not used for memory allocation by Ruby since they are used for predefined constants.
21
21
  @tagger.instance_variable_set(:@known_id_tags, {0 => '123', 2 => '456'})
22
22
 
23
- @tagger.tag_tests(@default_file_directory, '')
23
+ Dir.mktmpdir { |path| @tagger.tag_tests(path, '') }
24
24
 
25
25
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(0)
26
26
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(1)
@@ -39,7 +39,7 @@ describe 'UniqueTestCaseTagger, Integration' do
39
39
  # Using ids that are not used for memory allocation by Ruby since they are used for predefined constants.
40
40
  @tagger.instance_variable_set(:@known_id_tags, {0 => '123', 2 => '456'})
41
41
 
42
- @tagger.validate_test_ids(@default_file_directory, '')
42
+ Dir.mktmpdir { |path| @tagger.validate_test_ids(path, '') }
43
43
 
44
44
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(0)
45
45
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(1)
@@ -58,7 +58,7 @@ describe 'UniqueTestCaseTagger, Integration' do
58
58
  # Using ids that are not used for memory allocation by Ruby since they are used for predefined constants.
59
59
  @tagger.instance_variable_set(:@known_id_tags, {0 => '123', 2 => '456'})
60
60
 
61
- @tagger.scan_for_tagged_tests(@default_file_directory, '')
61
+ Dir.mktmpdir { |path| @tagger.scan_for_tagged_tests(path, '') }
62
62
 
63
63
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(0)
64
64
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(1)
@@ -76,14 +76,14 @@ describe 'UniqueTestCaseTagger, Integration' do
76
76
  # Using ids that are not used for memory allocation by Ruby since they are used for predefined constants.
77
77
  @tagger.instance_variable_set(:@known_id_tags, {0 => '123', 2 => '456'})
78
78
 
79
- @tagger.determine_known_ids(@default_file_directory, '')
79
+ Dir.mktmpdir { |path| @tagger.determine_known_ids(path, '') }
80
80
 
81
81
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(0)
82
82
  expect(@tagger.instance_variable_get(:@known_id_tags)).to_not include(1)
83
83
  end
84
84
 
85
85
  it 'does not count id like values that are not in the specified id column' do
86
- input_file = Tempfile.new(['foo', '.feature'])
86
+ test_directory = CukeCataloger::FileHelper.create_directory
87
87
 
88
88
  text = "Feature:
89
89
 
@@ -106,12 +106,10 @@ describe 'UniqueTestCaseTagger, Integration' do
106
106
  Scenario:
107
107
  * a step"
108
108
 
109
- input_file.write(text)
110
- input_file.close
111
- temp_directory = input_file.path.match(/(.*)\/foo.*\.feature/)[1]
109
+ CukeCataloger::FileHelper.create_feature_file(:directory => test_directory, :text => text)
112
110
 
113
111
 
114
- result = @tagger.determine_known_ids(temp_directory, '@test_case_', 'foobar')
112
+ result = @tagger.determine_known_ids(test_directory, '@test_case_', 'foobar')
115
113
 
116
114
 
117
115
  expect(result).to_not include('2-1', '2-2', '2-3')
@@ -29,7 +29,9 @@ describe 'UniqueTestCaseTagger, Unit' do
29
29
  end
30
30
 
31
31
  it 'returns validation results' do
32
- expect(@tagger.validate_test_ids(@default_file_directory, '')).to be_a_kind_of(Array)
32
+ results = Dir.mktmpdir { |path| @tagger.validate_test_ids(path, '') }
33
+
34
+ expect(results).to be_a_kind_of(Array)
33
35
  end
34
36
  end
35
37
 
@@ -43,7 +45,9 @@ describe 'UniqueTestCaseTagger, Unit' do
43
45
  end
44
46
 
45
47
  it 'returns scanning results' do
46
- expect(@tagger.scan_for_tagged_tests(@default_file_directory, '')).to be_a_kind_of(Array)
48
+ results = Dir.mktmpdir { |path| @tagger.scan_for_tagged_tests(path, '') }
49
+
50
+ expect(results).to be_a_kind_of(Array)
47
51
  end
48
52
  end
49
53
 
data/todo.txt CHANGED
@@ -2,3 +2,4 @@
2
2
  # todo - Add better test coverage (rake tasks, cli, etc.)
3
3
  # todo - Use features as documentation
4
4
  # todo - Use the cuketagger gem for tagging
5
+ # todo - document functionality/add functionality for changing added tag location/column location
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuke_cataloger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kessler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-18 00:00:00.000000000 Z
11
+ date: 2017-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cuke_modeler
@@ -183,8 +183,11 @@ files:
183
183
  - bin/cuke_cataloger
184
184
  - cuke_cataloger.gemspec
185
185
  - lib/cuke_cataloger.rb
186
+ - lib/cuke_cataloger/formatters/text_report_formatter.rb
187
+ - lib/cuke_cataloger/rake_tasks.rb
186
188
  - lib/cuke_cataloger/unique_test_case_tagger.rb
187
189
  - lib/cuke_cataloger/version.rb
190
+ - testing/cucumber/features/cataloging_tasks.feature
188
191
  - testing/cucumber/features/executable.feature
189
192
  - testing/cucumber/features/formatting.feature
190
193
  - testing/cucumber/features/tag_indexing.feature
@@ -197,6 +200,8 @@ files:
197
200
  - testing/cucumber/step_definitions/verification_steps.rb
198
201
  - testing/cucumber/support/env.rb
199
202
  - testing/cucumber/support/transforms.rb
203
+ - testing/file_helper.rb
204
+ - testing/fixtures/Rakefile
200
205
  - testing/fixtures/tests/foo.feature
201
206
  - testing/gemfiles/cuke_modeler0.gemfile
202
207
  - testing/gemfiles/cuke_modeler1.gemfile