Commit 8f1fe233298bb0be274df13df9c76e73b93540a8
Exists in
colab
and in
4 other branches
Merge pull request #249 from mezuro/independent_repositories
Independent repositories
Showing
23 changed files
with
238 additions
and
29 deletions
Show diff stats
.travis.yml
... | ... | @@ -5,7 +5,7 @@ addons: |
5 | 5 | postgresql: "9.3" |
6 | 6 | |
7 | 7 | before_script: |
8 | - - git clone https://github.com/mezuro/kalibro_install.git -b v2.5 kalibro_install | |
8 | + - git clone https://github.com/mezuro/kalibro_install.git -b v2.7 kalibro_install | |
9 | 9 | - pushd kalibro_install |
10 | 10 | # Remove bugged libzmq3 package, see https://github.com/travis-ci/travis-ci/issues/982 and https://github.com/travis-ci/travis-ci/issues/1715 for details |
11 | 11 | - sudo apt-get remove libzmq3 | ... | ... |
Gemfile
Gemfile.lock
... | ... | @@ -157,7 +157,7 @@ GEM |
157 | 157 | jquery-ui-rails (5.0.5) |
158 | 158 | railties (>= 3.2.16) |
159 | 159 | json (1.8.3) |
160 | - kalibro_client (0.3.0) | |
160 | + kalibro_client (0.4.0) | |
161 | 161 | activesupport (>= 2.2.1) |
162 | 162 | faraday_middleware (~> 0.9.0) |
163 | 163 | konacha (3.5.1) |
... | ... | @@ -353,7 +353,7 @@ DEPENDENCIES |
353 | 353 | jbuilder (~> 2.0) |
354 | 354 | jquery-rails |
355 | 355 | jquery-ui-rails (~> 5.0.0) |
356 | - kalibro_client (~> 0.3.0) | |
356 | + kalibro_client (~> 0.4.0) | |
357 | 357 | konacha |
358 | 358 | mocha |
359 | 359 | pg (~> 0.18.1) | ... | ... |
app/controllers/repositories_controller.rb
1 | 1 | include OwnershipAuthentication |
2 | 2 | |
3 | 3 | class RepositoriesController < ApplicationController |
4 | - before_action :authenticate_user!, except: [:show, :state, :state_with_date] | |
4 | + before_action :authenticate_user!, except: [:show, :state, :state_with_date, :index] | |
5 | 5 | before_action :project_owner?, only: [:new, :create], unless: Proc.new { params[:project_id].nil? } |
6 | 6 | before_action :repository_owner?, only: [:edit, :update, :destroy, :process_repository] |
7 | 7 | before_action :set_repository, only: [:show, :edit, :update, :destroy, :state, :state_with_date, :process_repository] |
8 | 8 | before_action :set_project_id_repository_types_and_configurations, only: [:new, :edit] |
9 | 9 | |
10 | + def index | |
11 | + @repositories = Repository.all | |
12 | + end | |
13 | + | |
10 | 14 | # GET /projects/1/repositories/1 |
11 | 15 | # GET /projects/1/repositories/1.json |
12 | 16 | # GET /projects/1/repositories/1/modules/1 |
... | ... | @@ -27,7 +31,6 @@ class RepositoriesController < ApplicationController |
27 | 31 | # POST /projects/1/repositories.json |
28 | 32 | def create |
29 | 33 | @repository = Repository.new(repository_params) |
30 | - @repository.project_id = params[:project_id] | |
31 | 34 | respond_to do |format| |
32 | 35 | create_and_redir(format) |
33 | 36 | end |
... | ... | @@ -125,6 +128,7 @@ private |
125 | 128 | def repository_params |
126 | 129 | params[:repository][:name].strip! |
127 | 130 | params[:repository][:address].strip! |
131 | + params[:repository][:project_id] = params[:project_id] if params.key? :project_id | |
128 | 132 | params[:repository] |
129 | 133 | end |
130 | 134 | ... | ... |
app/helpers/repository_helper.rb
... | ... | @@ -23,6 +23,11 @@ module RepositoryHelper |
23 | 23 | end |
24 | 24 | |
25 | 25 | def year_options |
26 | + # FIXME: this will not work some years from now | |
26 | 27 | (2013..2020).to_a.map {|year| [year, year]} |
27 | 28 | end |
29 | + | |
30 | + def repository_owner? repository_id | |
31 | + user_signed_in? && !current_user.repository_attributes.find_by_repository_id(repository_id).nil? | |
32 | + end | |
28 | 33 | end | ... | ... |
app/views/layouts/application.html.erb
... | ... | @@ -60,6 +60,7 @@ |
60 | 60 | <ul class="nav navbar-nav"> |
61 | 61 | <li><%= link_to t('home'), root_path %></li> |
62 | 62 | <li><%= link_to Project.model_name.human, projects_path %></li> |
63 | + <li><%= link_to Repository.model_name.human, repositories_path %></li> | |
63 | 64 | <li><%= link_to KalibroConfiguration.model_name.human, kalibro_configurations_path %></li> |
64 | 65 | <li><%= link_to ReadingGroup.model_name.human, reading_groups_path %></li> |
65 | 66 | </ul> | ... | ... |
app/views/repositories/_form.html.erb
... | ... | @@ -101,7 +101,6 @@ |
101 | 101 | </p> |
102 | 102 | </div> |
103 | 103 | </div> |
104 | - | |
105 | 104 | </div> |
106 | 105 | </div> |
107 | 106 | <div class="row margin-left-none" style="margin-top: 20px"> |
... | ... | @@ -111,8 +110,4 @@ |
111 | 110 | |
112 | 111 | <script type="text/javascript"> |
113 | 112 | var _repository_branch = new Repository.Branch; |
114 | - | |
115 | - $(document).on('page:load ready', function() { | |
116 | - _repository_branch.toggle(); | |
117 | - }); | |
118 | 113 | </script> | ... | ... |
... | ... | @@ -0,0 +1,16 @@ |
1 | +<div class="page-header"> | |
2 | + <h1><%= "#{Repository.model_name.human(count: 2)}" %></h1> | |
3 | +</div> | |
4 | + | |
5 | +<% if user_signed_in? %> | |
6 | + <p> | |
7 | + <%= link_to t_action(:create, Repository), new_repository_path, class: 'btn btn-primary' %> | |
8 | + </p> | |
9 | +<%else%> | |
10 | + <p class="alert alert-warning alert-dismissable"> | |
11 | + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> | |
12 | + <%= t('unauthenticated', action: t_action(:create, Repository, count: 2).downcase) %> | |
13 | + </p> | |
14 | +<% end %> | |
15 | + | |
16 | +<%= render partial: 'shared/repository_list', locals: {repositories: @repositories} %> | ... | ... |
app/views/repositories/new.html.erb
... | ... | @@ -2,7 +2,13 @@ |
2 | 2 | <h1><%= t_action(:new, Repository) %></h1> |
3 | 3 | </div> |
4 | 4 | |
5 | -<%= form_for(@repository, :url => project_repositories_url(@project_id)) do |f| %> | |
6 | - <%= render partial: 'form', locals: {f: f} %> | |
5 | +<% unless @project_id.nil? %> | |
6 | + <%= form_for(@repository, :url => project_repositories_url(@project_id)) do |f| %> | |
7 | + <%= render partial: 'form', locals: {f: f} %> | |
8 | + <% end %> | |
9 | +<% else %> | |
10 | + <%= form_for(@repository, :url => repositories_url) do |f| %> | |
11 | + <%= render partial: 'form', locals: {f: f} %> | |
12 | + <% end %> | |
7 | 13 | <% end %> |
8 | 14 | ... | ... |
app/views/shared/_project_list.html.erb
... | ... | @@ -0,0 +1,24 @@ |
1 | +<table class="table table-hover"> | |
2 | + <thead> | |
3 | + <tr> | |
4 | + <th><%= Repository.human_attribute_name('name') %></th> | |
5 | + <th><%= Repository.human_attribute_name('description') %></th> | |
6 | + <th colspan="2"></th> | |
7 | + </tr> | |
8 | + </thead> | |
9 | + | |
10 | + <tbody> | |
11 | + <% repositories.each do |repository| %> | |
12 | + <tr> | |
13 | + <td><%= repository.name %></td> | |
14 | + <td><%= repository.description %></td> | |
15 | + <td><%= link_to t('show'), repository_path(repository.id), class: 'btn btn-info' %></td> | |
16 | + <td> | |
17 | + <% if repository_owner? repository.id %> | |
18 | + <%= link_to t('edit'), edit_repository_path(repository.id), class: 'btn btn-info' %> | |
19 | + <% end %> | |
20 | + </td> | |
21 | + </tr> | |
22 | + <% end %> | |
23 | + </tbody> | |
24 | +</table> | |
0 | 25 | \ No newline at end of file | ... | ... |
config/routes.rb
... | ... | @@ -7,7 +7,7 @@ Rails.application.routes.draw do |
7 | 7 | resources :repositories, only: [:new, :create] |
8 | 8 | end |
9 | 9 | |
10 | - resources :repositories, except: [:update, :index] | |
10 | + resources :repositories, except: [:update] | |
11 | 11 | get '/repositories/:id/modules/:module_result_id' => 'repositories#show', as: :repository_module |
12 | 12 | get '/repositories/:id/state' => 'repositories#state', as: :repository_state |
13 | 13 | get '/repositories/:id/state_with_date' => 'repositories#state_with_date', as: :repository_state_with_date | ... | ... |
features/project/show.feature
... | ... | @@ -24,6 +24,16 @@ Scenario: Should show the create repository link the project owner |
24 | 24 | When I am at the Sample Project page |
25 | 25 | Then I should see "New Repository" |
26 | 26 | |
27 | +@kalibro_processor_restart @kalibro_configuration_restart | |
28 | +Scenario: Should not show the independent repositories for a project | |
29 | + Given I am a regular user | |
30 | + And I am signed in | |
31 | + And I own a sample project | |
32 | + And I have sample project_attributes | |
33 | + And I have a sample configuration | |
34 | + And I have a sample repository | |
35 | + When I am at the Sample Project page | |
36 | + Then I should see "There are no Repositories yet!" | |
27 | 37 | |
28 | 38 | @kalibro_processor_restart |
29 | 39 | Scenario: Considering the project has no repositories | ... | ... |
features/repository/create.feature
... | ... | @@ -4,10 +4,11 @@ Feature: Repository Creation |
4 | 4 | I should be able to create repositories |
5 | 5 | |
6 | 6 | @kalibro_configuration_restart @kalibro_processor_restart @javascript |
7 | -Scenario: repository creation | |
7 | +Scenario: repository creation associated with a project | |
8 | 8 | Given I am a regular user |
9 | 9 | And I am signed in |
10 | 10 | And I own a sample project |
11 | + And I have sample project_attributes | |
11 | 12 | And I have a sample configuration with native metrics |
12 | 13 | And I am at the New Repository page |
13 | 14 | And I fill the Name field with "Kalibro" |
... | ... | @@ -23,6 +24,8 @@ Scenario: repository creation |
23 | 24 | And I set the select field "Configuration" as "Java" |
24 | 25 | When I press the Save button |
25 | 26 | Then I should see the saved repository's content |
27 | + When I am at the Sample Project page | |
28 | + Then I should see the sample repository name | |
26 | 29 | |
27 | 30 | @kalibro_configuration_restart @kalibro_processor_restart @javascript |
28 | 31 | Scenario: repository creation blank validations |
... | ... | @@ -45,9 +48,8 @@ Scenario: repository creation blank validations |
45 | 48 | Scenario: repository creation with name already taken |
46 | 49 | Given I am a regular user |
47 | 50 | And I am signed in |
48 | - And I own a sample project | |
49 | 51 | And I have a sample configuration with native metrics |
50 | - And I have a sample repository within the sample project named "KalibroEntities" | |
52 | + And I have a sample repository named "KalibroEntities" | |
51 | 53 | And I am at the New Repository page |
52 | 54 | And I fill the Name field with "KalibroEntities" |
53 | 55 | And I fill the Description field with "Description" |
... | ... | @@ -57,7 +59,7 @@ Scenario: repository creation with name already taken |
57 | 59 | And I set the select field "Process Period" as "1 day" |
58 | 60 | And I set the select field "Configuration" as "Java" |
59 | 61 | When I press the Save button |
60 | - Then I should see "Name should be unique within project" | |
62 | + Then I should see "Name has already been taken" | |
61 | 63 | |
62 | 64 | @kalibro_configuration_restart @kalibro_processor_restart @javascript |
63 | 65 | Scenario: Repository name with whitespaces |
... | ... | @@ -74,4 +76,19 @@ Scenario: Repository name with whitespaces |
74 | 76 | And I set the select field "Process Period" as "1 day" |
75 | 77 | And I set the select field "Configuration" as "Java" |
76 | 78 | When I press the Save button |
77 | - Then I should see "Name should be unique within project" | |
79 | + Then I should see "Name has already been taken" | |
80 | + | |
81 | +@kalibro_configuration_restart @kalibro_processor_restart @javascript | |
82 | +Scenario: Create repository without project | |
83 | + Given I am a regular user | |
84 | + And I am signed in | |
85 | + And I have a sample configuration with native metrics | |
86 | + And I am at the New Repository page | |
87 | + And I fill the Name field with "Kalibro Client" | |
88 | + And I set the select field "License" as "ISC License (ISC)" | |
89 | + And I fill the Address field with "https://github.com/mezuro/kalibro_client.git" | |
90 | + And I set the select field "Type" as "GIT" | |
91 | + And I set the select field "Process Period" as "1 day" | |
92 | + And I set the select field "Configuration" as "Java" | |
93 | + When I press the Save button | |
94 | + Then I should see the saved repository's content | ... | ... |
features/repository/edit.feature
... | ... | @@ -0,0 +1,36 @@ |
1 | +Feature: Repository listing | |
2 | + In order to interact with other repositories | |
3 | + As a regular user | |
4 | + I should have various listings | |
5 | + | |
6 | + Scenario: Listing repositories | |
7 | + Given I am at the homepage | |
8 | + When I click the Repository link | |
9 | + Then I should see "Repositories" | |
10 | + And I should see "Name" | |
11 | + And I should see "Description" | |
12 | + And I should see "You must be logged in to create repositories" | |
13 | + | |
14 | + @kalibro_processor_restart @kalibro_configuration_restart | |
15 | + Scenario: Should list the existing repositories | |
16 | + Given I am a regular user | |
17 | + And I am signed in | |
18 | + And I have a sample configuration | |
19 | + And I have a sample repository | |
20 | + And I have a sample project | |
21 | + And I have a sample repository within the sample project | |
22 | + And I am at the All Repositories page | |
23 | + Then the sample repository should be there | |
24 | + And the project repository should be there | |
25 | + And I should not see "You must be logged in to create new Repositories." | |
26 | + | |
27 | + @kalibro_processor_restart @kalibro_configuration_restart | |
28 | + Scenario: Should show the existing repository | |
29 | + Given I am a regular user | |
30 | + And I am signed in | |
31 | + And I have a sample configuration | |
32 | + And I have a sample repository | |
33 | + And I own that independent repository | |
34 | + And I am at the All Repositories page | |
35 | + When I click the Show link | |
36 | + Then the sample repository should be there | ... | ... |
features/step_definitions/repository_steps.rb
... | ... | @@ -38,6 +38,15 @@ Given(/^I have a sample repository within the sample project named "(.+)"$/) do |
38 | 38 | kalibro_configuration_id: @kalibro_configuration.id, id: nil, name: name}) |
39 | 39 | end |
40 | 40 | |
41 | +Given(/^I have a sample repository named "(.+)"$/) do |name| | |
42 | + @repository = FactoryGirl.create(:repository, | |
43 | + project_id: nil, | |
44 | + kalibro_configuration_id: @kalibro_configuration.id, | |
45 | + id: nil, | |
46 | + name: name) | |
47 | +end | |
48 | + | |
49 | + | |
41 | 50 | Given(/^I have a sample of an invalid repository within the sample project$/) do |
42 | 51 | @repository = FactoryGirl.create(:repository, {project_id: @project.id, |
43 | 52 | kalibro_configuration_id: @kalibro_configuration.id, id: nil, address: "https://invalidrepository.git"}) |
... | ... | @@ -66,7 +75,11 @@ Given(/^I wait up for a error processing$/) do |
66 | 75 | end |
67 | 76 | |
68 | 77 | Given(/^I am at the New Repository page$/) do |
69 | - visit new_project_repository_path(project_id: @project.id) | |
78 | + if @project | |
79 | + visit new_project_repository_path(project_id: @project.id) | |
80 | + else | |
81 | + visit new_repository_path | |
82 | + end | |
70 | 83 | end |
71 | 84 | |
72 | 85 | Given(/^I am at repository edit page$/) do |
... | ... | @@ -93,6 +106,18 @@ Given(/^I own that repository$/) do |
93 | 106 | FactoryGirl.create(:repository_attributes, {repository_id: @repository.id, user_id: @user.id}) |
94 | 107 | end |
95 | 108 | |
109 | +Given(/^I own that independent repository$/) do | |
110 | + FactoryGirl.create(:repository_attributes, {repository_id: @independent_repository.id, user_id: @user.id}) | |
111 | +end | |
112 | + | |
113 | +Given(/^I have a sample repository$/) do | |
114 | + @independent_repository = FactoryGirl.create(:ruby_repository, kalibro_configuration_id: @kalibro_configuration.id) | |
115 | +end | |
116 | + | |
117 | +Given(/^I am at the All Repositories page$/) do | |
118 | + visit repositories_path | |
119 | +end | |
120 | + | |
96 | 121 | When(/^I click on the sample metric's name$/) do |
97 | 122 | find_link(@metric_results.first.metric_configuration.metric.name).trigger('click') |
98 | 123 | end |
... | ... | @@ -179,3 +204,14 @@ Then(/^"(.*?)" should be lesser than "(.*?)"$/) do |arg1, arg2| |
179 | 204 | v2 = eval "@#{arg2}" |
180 | 205 | expect(v1 < v2).to be_truthy |
181 | 206 | end |
207 | + | |
208 | +Then(/^the sample repository should be there$/) do | |
209 | + expect(page).to have_content(@independent_repository.name) | |
210 | + expect(page).to have_content(@independent_repository.description) | |
211 | +end | |
212 | + | |
213 | +Then(/^the project repository should be there$/) do | |
214 | + expect(page).to have_content(@repository.name) | |
215 | + expect(page).to have_content(@repository.description) | |
216 | +end | |
217 | + | ... | ... |
spec/controllers/repositories_controller_spec.rb
1 | 1 | require 'rails_helper' |
2 | 2 | |
3 | 3 | describe RepositoriesController, :type => :controller do |
4 | + describe 'index' do | |
5 | + let!(:repository) { FactoryGirl.build(:repository) } | |
6 | + | |
7 | + before :each do | |
8 | + Repository.expects(:all).returns([repository]) | |
9 | + get :index | |
10 | + end | |
11 | + | |
12 | + it { is_expected.to render_template(:index) } | |
13 | + end | |
14 | + | |
4 | 15 | describe 'new' do |
5 | 16 | context 'with a User logged in' do |
6 | 17 | let!(:user) { FactoryGirl.create(:user) } |
... | ... | @@ -86,6 +97,9 @@ describe RepositoriesController, :type => :controller do |
86 | 97 | |
87 | 98 | it { is_expected.to redirect_to(repository_process_path(id: repository.id)) } |
88 | 99 | it { is_expected.to respond_with(:redirect) } |
100 | + it "is expected to set the project_id" do | |
101 | + expect(assigns(:repository).project_id).to be > 0 | |
102 | + end | |
89 | 103 | end |
90 | 104 | |
91 | 105 | context 'with an invalid field' do |
... | ... | @@ -123,6 +137,9 @@ describe RepositoriesController, :type => :controller do |
123 | 137 | |
124 | 138 | it { is_expected.to redirect_to(repository_process_path(id: repository.id)) } |
125 | 139 | it { is_expected.to respond_with(:redirect) } |
140 | + it "is expected to not set the project_id" do | |
141 | + expect(assigns(:repository).project_id).to be_nil | |
142 | + end | |
126 | 143 | end |
127 | 144 | |
128 | 145 | context 'with an invalid field' do | ... | ... |
spec/factories/project_attributes.rb
spec/factories/repositories.rb
... | ... | @@ -23,7 +23,6 @@ FactoryGirl.define do |
23 | 23 | scm_type "GIT" |
24 | 24 | address "https://github.com/rafamanzo/runge-kutta-vtk.git" |
25 | 25 | kalibro_configuration_id 1 |
26 | - send_email "test@test.com" | |
27 | 26 | end |
28 | 27 | |
29 | 28 | factory :ruby_repository, class: Repository do |
... | ... | @@ -35,7 +34,6 @@ FactoryGirl.define do |
35 | 34 | scm_type "GIT" |
36 | 35 | address "https://github.com/mezuro/kalibro_processor.git" |
37 | 36 | kalibro_configuration_id 1 |
38 | - send_email "test@test.com" | |
39 | 37 | end |
40 | 38 | |
41 | 39 | factory :another_repository, parent: :repository do | ... | ... |
spec/helpers/projects_helper_spec.rb
... | ... | @@ -45,7 +45,7 @@ describe ProjectsHelper, :type => :helper do |
45 | 45 | |
46 | 46 | describe 'project_image_html' do |
47 | 47 | let(:project) { FactoryGirl.build(:project) } |
48 | - let(:project_attributes) { FactoryGirl.build(:project_attributes) } | |
48 | + let(:project_attributes) { FactoryGirl.build(:project_attributes, :with_image) } | |
49 | 49 | |
50 | 50 | context 'when the project has an image' do |
51 | 51 | before :each do | ... | ... |
spec/helpers/repository_helper_spec.rb
1 | 1 | require 'rails_helper' |
2 | 2 | |
3 | 3 | describe RepositoryHelper, :type => :helper do |
4 | + describe 'repository_owner?' do | |
5 | + subject { FactoryGirl.build(:repository) } | |
6 | + | |
7 | + context 'returns false if not logged in' do | |
8 | + before :each do | |
9 | + helper.expects(:user_signed_in?).returns(false) | |
10 | + end | |
11 | + it { expect(helper.repository_owner?(subject.id)).to be_falsey } | |
12 | + end | |
13 | + | |
14 | + context 'returns false if is not the owner' do | |
15 | + let!(:attributes) { [] } | |
16 | + | |
17 | + before :each do | |
18 | + helper.expects(:user_signed_in?).returns(true) | |
19 | + helper.expects(:current_user).returns(FactoryGirl.build(:user)) | |
20 | + | |
21 | + attributes.expects(:find_by_repository_id).with(subject.id).returns(nil) | |
22 | + | |
23 | + User.any_instance.expects(:repository_attributes).returns(attributes) | |
24 | + end | |
25 | + | |
26 | + it { expect(helper.repository_owner?(subject.id)).to be_falsey } | |
27 | + end | |
28 | + | |
29 | + context 'returns true if user is the repository owner' do | |
30 | + let!(:repository_attributes) { FactoryGirl.build(:repository_attributes) } | |
31 | + let!(:attributes) { [] } | |
32 | + | |
33 | + before :each do | |
34 | + helper.expects(:user_signed_in?).returns(true) | |
35 | + helper.expects(:current_user).returns(FactoryGirl.build(:user)) | |
36 | + | |
37 | + attributes.expects(:find_by_repository_id).with(subject.id).returns(repository_attributes) | |
38 | + User.any_instance.expects(:repository_attributes).returns(attributes) | |
39 | + end | |
40 | + | |
41 | + it { expect(helper.repository_owner?(subject.id)).to be_truthy } | |
42 | + end | |
43 | + end | |
4 | 44 | |
5 | 45 | describe 'periodicity_options' do |
6 | 46 | it 'should return an array with some sample periods' do | ... | ... |
spec/routing/repositories_routing_spec.rb
... | ... | @@ -4,6 +4,8 @@ describe RepositoriesController, :type => :routing do |
4 | 4 | describe "routing" do |
5 | 5 | it { is_expected.to route(:post, '/repositories'). |
6 | 6 | to(controller: :repositories, action: :create) } |
7 | + it { is_expected.to route(:get, '/repositories'). | |
8 | + to(controller: :repositories, action: :index) } | |
7 | 9 | it { is_expected.to route(:get, '/repositories/new'). |
8 | 10 | to(controller: :repositories, action: :new) } |
9 | 11 | it { is_expected.to route(:get, '/repositories/1/edit'). |
... | ... | @@ -16,8 +18,6 @@ describe RepositoriesController, :type => :routing do |
16 | 18 | to(controller: :repositories, action: :destroy, id: 1) } |
17 | 19 | it { is_expected.to route(:put, '/repositories/1'). |
18 | 20 | to(controller: :repositories, action: :update, id: 1) } |
19 | - it { is_expected.not_to route(:get, '/repositories'). | |
20 | - to(controller: :repositories, action: :index) } | |
21 | 21 | it { is_expected.to route(:get, '/repositories/1/state'). |
22 | 22 | to(controller: :repositories, action: :state, id: 1) } |
23 | 23 | it { is_expected.to route(:get, '/repositories/1/state_with_date'). | ... | ... |