cucumber_monitor 0.0.3 → 0.0.4

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.
@@ -0,0 +1,6 @@
1
+ $(function() {
2
+ $("#run_feature_link").click(function(){
3
+ $(this).html('<%= image_tag("cucumber_monitor/ajax-loader.gif") %>');
4
+ });
5
+
6
+ });
@@ -1,5 +1,6 @@
1
1
  body {
2
2
  font-family: "Lucida Console";
3
+ font-size: 11px;
3
4
  }
4
5
 
5
6
  hr {
@@ -20,10 +21,10 @@ hr {
20
21
  border: solid 1px #ebebeb;
21
22
  border-radius: 5px;
22
23
  font-size: 12px;
23
- margin: 0;
24
+ margin: 0 auto 20px auto;
24
25
  padding: 0;
25
26
  margin-top: 20px;
26
- width: 90%;
27
+ width: 100%;
27
28
  }
28
29
 
29
30
  #main table th {
@@ -93,4 +94,39 @@ div.feature_container .steps table td {
93
94
  padding: 5px;
94
95
  border-bottom: #ebebeb solid 1px;
95
96
  border-right: #ebebeb solid 1px;
97
+ }
98
+
99
+ .step_description {
100
+ display: inline-block;
101
+ width: 100%;
102
+ }
103
+
104
+ .step_result {
105
+ width: 5%;
106
+ padding: 5px;
107
+ border: solid 1px #ccc;
108
+ display: inline-block;
109
+ float: right;
110
+ font-size: 11px;
111
+ text-align: center;
112
+ }
113
+
114
+ .run_feature {
115
+ width: 150px;
116
+ float: right;
117
+ padding: 10px;
118
+ display: block;
119
+ background: #006699;
120
+ text-align: center;
121
+ }
122
+
123
+ .run_feature a {
124
+ font-size: 11px;
125
+ text-align: center;
126
+ color: #fff;
127
+ text-decoration: none;
128
+ }
129
+
130
+ .td_result {
131
+ width: 6%;
96
132
  }
@@ -16,4 +16,12 @@ class CucumberMonitorController < ApplicationController
16
16
  @steps_search_results = CucumberMonitor.new.search(params[:criteria])
17
17
  end
18
18
 
19
+ def feature_runner
20
+ respond_to do |format|
21
+ format.js do
22
+ @json_feature_result = CucumberMonitor::FeatureRunner.run_and_return_json(name: params[:name])
23
+ end
24
+ end
25
+ end
26
+
19
27
  end
@@ -0,0 +1,11 @@
1
+ $(function() {
2
+ <% @json_feature_result.first['elements'].each do |element| %>
3
+ <% element['steps'].each do |step| %>
4
+ <% status = step['result']['status'] %>
5
+ $("#<%= step['code'] %>").html('<%= t("results.#{status}") || status %>');
6
+ <% end %>
7
+ <% end %>
8
+
9
+ $("#run_feature_link").html("Executar feature");
10
+
11
+ });
@@ -8,13 +8,20 @@
8
8
  <%= link_to t("links.back_to_features_link"), features_cucumber_monitor_path %>
9
9
  </p>
10
10
 
11
+ <div class="run_feature"><%= link_to 'Executar feature', feature_runner_cucumber_monitor_path(@feature.name), remote: true, id: 'run_feature_link' %></div>
12
+
11
13
  <% if @feature.contexts.any? %>
12
14
  <div class="feature_container context">
13
15
  <% @feature.contexts.each do |context|%>
14
16
  <h4><%= t(".background") %></h4>
15
17
  <div class="steps">
16
18
  <% context.steps.each do |step| %>
17
- <%= step.formatted.html_safe %>
19
+ <div class="step_description">
20
+ <%= step.formatted.html_safe %>
21
+ <% if step.not_a_table %>
22
+ <div class="step_result" id="<%= step.code %>">-</div>
23
+ <% end %>
24
+ </div>
18
25
  <% if step.not_a_table %>
19
26
  <hr />
20
27
  <% end %>
@@ -29,7 +36,12 @@
29
36
  <h4><%= "#{t(".scenario")} #{scenario.name}" %></h4>
30
37
  <div class="steps">
31
38
  <% scenario.steps.each do |step| %>
32
- <%= step.formatted.html_safe %>
39
+ <div class="step_description">
40
+ <%= step.formatted.html_safe %>
41
+ <% if step.not_a_table %>
42
+ <div class="step_result" id="<%= step.code %>">-</div>
43
+ <% end %>
44
+ </div>
33
45
  <% if step.not_a_table %>
34
46
  <hr />
35
47
  <% end %>
@@ -3,6 +3,7 @@
3
3
  <head>
4
4
  <title>Cucumber Monitor</title>
5
5
  <%= stylesheet_link_tag "cucumber_monitor/cucumber_monitor", :media => "all" %>
6
+ <%= javascript_include_tag "jquery", "jquery_ujs", "cucumber_monitor/cucumber_monitor", :media => "all" %>
6
7
  <%= csrf_meta_tags %>
7
8
  </head>
8
9
  <body>
@@ -1,4 +1,8 @@
1
1
  "pt-BR":
2
+ results:
3
+ passed: passou
4
+ failed: falhou
5
+ skipped: pulou
2
6
  buttons:
3
7
  search: Buscar
4
8
  links:
@@ -16,6 +20,7 @@
16
20
  feature: Funcionalidade
17
21
  background: Contexto
18
22
  scenario: Cenário
23
+
19
24
  search:
20
25
  title: Busca
21
26
  search_results: Resultados da busca
@@ -26,6 +31,10 @@
26
31
  results_not_found_for: "Nenhum resultado encontrado para '<strong>%{criteria}</strong>'"
27
32
 
28
33
  "en":
34
+ results:
35
+ passed: passou
36
+ failed: falhou
37
+ skipped: pulou
29
38
  buttons:
30
39
  search: Search
31
40
  links:
@@ -43,6 +52,10 @@
43
52
  feature: Feature
44
53
  background: Background
45
54
  scenario: Scenario
55
+ results:
56
+ passed: passou
57
+ failed: falhou
58
+ skipped: pulou
46
59
  search:
47
60
  title: Search
48
61
  search_results: Search results
data/config/routes.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  Rails.application.routes.draw do
2
2
  resource :cucumber_monitor, only: [] do
3
+ get '/' => 'cucumber_monitor#features', as: 'features'
3
4
  get 'features' => 'cucumber_monitor#features', as: 'features'
4
5
  get 'show_feature/:name' => 'cucumber_monitor#show_feature', as: 'show_feature'
5
6
  get 'search' => 'cucumber_monitor#search', as: 'search'
7
+ get 'feature_runner/:name' => 'cucumber_monitor#feature_runner', as: 'feature_runner'
6
8
  end
7
9
  end
@@ -8,6 +8,10 @@ class Array
8
8
  result << item
9
9
  end
10
10
 
11
+ if item.respond_to?(:description) && !item.description.nil? && !options[:description].nil? && item.description.include?(options[:description])
12
+ result << item
13
+ end
14
+
11
15
  if item.respond_to?(:id) && item.id == options[:id]
12
16
  result << item
13
17
  end
@@ -7,6 +7,10 @@ module CucumberMonitor
7
7
  Dir.pwd.to_s + '/features'
8
8
  end
9
9
 
10
+ def self.cucumber_output_file
11
+ Dir.pwd.to_s + '/tmp/cucumber.out'
12
+ end
13
+
10
14
  def locate
11
15
  "Printing: #{I18n.t("feature")}"
12
16
  end
@@ -4,10 +4,11 @@ module CucumberMonitor
4
4
 
5
5
  class Context
6
6
 
7
- attr_accessor :name, :feature
7
+ attr_accessor :name, :keyword, :feature
8
8
 
9
9
  def initialize(name,feature)
10
10
  @name = name
11
+ @keyword = I18n.t("background")
11
12
  @feature = feature
12
13
  end
13
14
 
@@ -18,7 +19,7 @@ module CucumberMonitor
18
19
  record = false
19
20
  count = 0
20
21
  feature.lines.each_with_index do |line, i|
21
- if line.include?(I18n.t("background"))
22
+ if line.include?(keyword)
22
23
  started = true
23
24
  end
24
25
  if started && !stopped
@@ -0,0 +1,46 @@
1
+ module CucumberMonitor
2
+
3
+ class FeatureRunner
4
+
5
+ def self.command(feature)
6
+ "bundle exec cucumber features/#{feature}.feature --format json --out tmp/cucumber.out"
7
+ end
8
+
9
+ def self.run(options={})
10
+ `#{command(options[:name])}` if options.has_key?(:name)
11
+ end
12
+
13
+ def self.json
14
+ JSON.parse(File.open(CucumberMonitor::Base.cucumber_output_file).read)
15
+ end
16
+
17
+ def self.run_and_return_json(options={})
18
+ run(options)
19
+ json
20
+ prepare
21
+ end
22
+
23
+ def self.elements
24
+ json.first['elements'].map{|e| "#{e['keyword']}: #{e['name']}"}
25
+ end
26
+
27
+ def self.prepare
28
+ prepared_json = json
29
+ prepared_json.first['elements'].each do |element|
30
+ element['steps'].each do |step|
31
+ description = "#{step['keyword']}#{step['name']}"
32
+ code_first_part = element['name'].blank? ? element['keyword'].parameterize : element['name'].parameterize
33
+ code_second_part = description.parameterize
34
+ code = "#{code_first_part}-#{code_second_part}"
35
+ step.merge!({
36
+ 'description' => description,
37
+ 'code' => code.parameterize
38
+ })
39
+ end
40
+ end
41
+ prepared_json
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -4,10 +4,11 @@ module CucumberMonitor
4
4
 
5
5
  class Scenario
6
6
 
7
- attr_accessor :name, :feature
7
+ attr_accessor :name, :keyword, :feature
8
8
 
9
9
  def initialize(name,feature)
10
10
  @name = name
11
+ @keyword = I18n.t("scenario")
11
12
  @feature = feature
12
13
  end
13
14
 
@@ -2,24 +2,27 @@ module CucumberMonitor
2
2
 
3
3
  class Step
4
4
 
5
- attr_accessor :description, :parent, :id
5
+ attr_accessor :description, :code, :parent, :id
6
6
 
7
7
  def initialize(description, parent, id)
8
8
  @description = description.strip
9
+ code_first_part = parent.name.blank? ? parent.keyword.parameterize : parent.name.parameterize
10
+ code_second_part = @description.parameterize
11
+ @code = "#{code_first_part}-#{code_second_part}"
9
12
  @parent = parent
10
13
  @id = id
11
14
  end
12
15
 
13
- def siblings
14
- parent.steps - [self]
16
+ def siblings_and_self
17
+ parent.steps
15
18
  end
16
19
 
17
20
  def previous
18
- siblings.where(id: self.id - 1)
21
+ siblings_and_self.where(id: self.id - 1)
19
22
  end
20
23
 
21
24
  def next
22
- siblings.where(id: self.id + 1)
25
+ siblings_and_self.where(id: self.id + 1)
23
26
  end
24
27
 
25
28
  def table?
@@ -56,6 +59,7 @@ module CucumberMonitor
56
59
  table_content.each do |th|
57
60
  output << " <th>#{th}</th>\n"
58
61
  end
62
+ output << " <th>&nbsp;</th>"
59
63
  output << " </tr>\n"
60
64
  output << "</table>\n" if table_last_line?
61
65
  elsif table_row?
@@ -63,6 +67,7 @@ module CucumberMonitor
63
67
  table_content.each do |td|
64
68
  output << " <td>#{td}</td>\n"
65
69
  end
70
+ output << " <td class='td_result'>&nbsp;</td>"
66
71
  output << " </tr>\n"
67
72
  output << "</table>\n" if table_last_line?
68
73
  else
@@ -1,3 +1,3 @@
1
1
  module CucumberMonitor
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -9,6 +9,7 @@ require 'cucumber_monitor/context'
9
9
  require 'cucumber_monitor/step'
10
10
  require 'cucumber_monitor/string'
11
11
  require 'cucumber_monitor/array'
12
+ require 'cucumber_monitor/feature_runner'
12
13
 
13
14
  module CucumberMonitor
14
15
 
data/test/base_test.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class BaseTest < ActiveSupport::TestCase
4
+
5
+ test "should return all features" do
6
+ assert_equal 2, @cucumber.features.size
7
+
8
+ features = ['administration.feature','change_my_data.feature']
9
+ assert_equal features, @cucumber.features.map(&:file)
10
+ end
11
+
12
+ test "should find features by searching" do
13
+ assert_equal 2, @cucumber.features.where(name: 'a').size
14
+ features = ['administration.feature','change_my_data.feature']
15
+ assert_equal features, @cucumber.features.where(name: 'a').map(&:file)
16
+
17
+ assert_equal 'administration.feature', @cucumber.features.where(name: 'admin').file
18
+ assert_equal 'change_my_data.feature', @cucumber.features.where(name: 'change').file
19
+ end
20
+
21
+ test 'should find all steps that matches with a given term' do
22
+ assert_equal 4, @cucumber.search("email").size
23
+
24
+ term = 'I should see'
25
+
26
+ steps = [
27
+ 'Then I should see "Invalid username/password"',
28
+ 'Then I should see my personal information',
29
+ 'Then I should see "Personal data successfully changed"',
30
+ 'And I should see "Petter Summers"',
31
+ 'I should see the following table:'
32
+ ]
33
+
34
+ assert_equal steps, @cucumber.search(term).map(&:description)
35
+ end
36
+
37
+ end
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+
3
+ class ContextTest < ActiveSupport::TestCase
4
+
5
+ test "context should return its steps" do
6
+ assert_equal 1, @feature_two.contexts.first.steps.size
7
+
8
+ step_1 = 'Given my name is Peter and I have an account in the system'
9
+
10
+ assert_equal step_1, @feature_two.contexts.first.steps[0].description
11
+ end
12
+
13
+ end
@@ -1,7 +1,4 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class CucumberMonitorTest < ActiveSupport::TestCase
4
- test "truth" do
5
- assert_kind_of Module, CucumberMonitor
6
- end
7
4
  end
@@ -1,2 +1,5 @@
1
1
  module ApplicationHelper
2
+ def step_result(status)
3
+ I18n.t("results.#{status}")
4
+ end
2
5
  end
File without changes
File without changes