From 0e29653f51b439eb018cefe434a4a57db4239cf4 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sun, 8 May 2016 15:45:04 -0400 Subject: Remove `wall_enabled` field from Project --- spec/models/project_spec.rb | 1 - 1 file changed, 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 5b1cf71337e..3a8a6c2c166 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -10,7 +10,6 @@ # updated_at :datetime # creator_id :integer # issues_enabled :boolean default(TRUE), not null -# wall_enabled :boolean default(TRUE), not null # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null # namespace_id :integer -- cgit v1.2.1 From f1479b56b71bef63517b90fcde99e6508e9c54af Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Mon, 9 May 2016 18:00:28 +0200 Subject: Remove the annotate gem and delete old annotations In 8278b763d96ef10c6494409b18b7eb541463af29 the default behaviour of annotation has changes, which was causing a lot of noise in diffs. We decided in #17382 that it is better to get rid of the whole annotate gem, and instead let people look at schema.rb for the columns in a table. Fixes: #17382 --- spec/models/project_spec.rb | 39 --------------------------------------- 1 file changed, 39 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 3a8a6c2c166..f6e5b132643 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1,42 +1,3 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime -# updated_at :datetime -# creator_id :integer -# issues_enabled :boolean default(TRUE), not null -# merge_requests_enabled :boolean default(TRUE), not null -# wiki_enabled :boolean default(TRUE), not null -# namespace_id :integer -# issues_tracker :string(255) default("gitlab"), not null -# issues_tracker_id :string(255) -# snippets_enabled :boolean default(TRUE), not null -# last_activity_at :datetime -# import_url :string(255) -# visibility_level :integer default(0), not null -# archived :boolean default(FALSE), not null -# avatar :string(255) -# import_status :string(255) -# repository_size :float default(0.0) -# star_count :integer default(0), not null -# import_type :string(255) -# import_source :string(255) -# commit_count :integer default(0) -# import_error :text -# ci_id :integer -# builds_enabled :boolean default(TRUE), not null -# shared_runners_enabled :boolean default(TRUE), not null -# runners_token :string -# build_coverage_regex :string -# build_allow_git_fetch :boolean default(TRUE), not null -# build_timeout :integer default(3600), not null -# - require 'spec_helper' describe Project, models: true do -- cgit v1.2.1 From 154270a3d4f42f1751502112d0e9cd6b5983032b Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 16 May 2016 17:37:28 -0500 Subject: Test container related specs --- spec/models/project_spec.rb | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index f6e5b132643..6de75af08e4 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -772,4 +772,79 @@ describe Project, models: true do expect(project.protected_branch?('foo')).to eq(false) end end + + describe '#container_registry_repository' do + let(:project) { create(:empty_project) } + + subject { project.container_registry_repository } + + it { is_expected.to_not be_nil } + end + + describe '#container_registry_repository_url' do + let(:project) { create(:empty_project) } + + subject { project.container_registry_repository_url } + + before { allow(Gitlab.config.registry).to receive_messages(registry_settings) } + + context 'for enabled registry' do + let(:registry_settings) do + { + enabled: true, + host_port: 'example.com', + } + end + + it { is_expected.to_not be_nil } + end + + context 'for disabled registry' do + let(:registry_settings) do + { + enabled: false + } + end + + it { is_expected.to be_nil } + end + end + + describe '#has_container_registry_tags?' do + let(:project) { create(:empty_project) } + + subject { project.has_container_registry_tags? } + + before { allow(Gitlab.config.registry).to receive_messages(registry_settings) } + + context 'for enabled registry' do + let(:registry_settings) do + { + enabled: true + } + end + + context 'with tags' do + before { stub_container_registry('test', 'test2') } + + it { is_expected.to be_truthy } + end + + context 'when no tags' do + before { stub_container_registry } + + it { is_expected.to be_falsey } + end + end + + context 'for disabled registry' do + let(:registry_settings) do + { + enabled: false + } + end + + it { is_expected.to be_falsey } + end + end end -- cgit v1.2.1 From 91c4002a0c2f32944ec669cc159c4b1c9176866f Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 16 May 2016 18:03:55 -0500 Subject: Improve test coverage --- spec/models/project_spec.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 6de75af08e4..262f4122220 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -634,11 +634,11 @@ describe Project, models: true do # Project#gitlab_shell returns a new instance of Gitlab::Shell on every # call. This makes testing a bit easier. allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) - end - it 'renames a repository' do allow(project).to receive(:previous_changes).and_return('path' => ['foo']) + end + it 'renames a repository' do ns = project.namespace_dir expect(gitlab_shell).to receive(:mv_repository). @@ -663,6 +663,17 @@ describe Project, models: true do project.rename_repo end + + context 'container registry with tags' do + before do + stub_container_registry_config(enabled: true) + stub_container_registry_tags('tag') + end + + subject { project.rename_repo } + + it { expect{subject}.to raise_error(Exception) } + end end describe '#expire_caches_before_rename' do @@ -825,13 +836,13 @@ describe Project, models: true do end context 'with tags' do - before { stub_container_registry('test', 'test2') } + before { stub_container_registry_tags('test', 'test2') } it { is_expected.to be_truthy } end context 'when no tags' do - before { stub_container_registry } + before { stub_container_registry_tags } it { is_expected.to be_falsey } end -- cgit v1.2.1 From 04933fd572f60909e8dbd14bd9366e96dc40806e Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 16 May 2016 18:07:49 -0500 Subject: Use container registry config stub --- spec/models/project_spec.rb | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 262f4122220..e434d267896 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -797,7 +797,7 @@ describe Project, models: true do subject { project.container_registry_repository_url } - before { allow(Gitlab.config.registry).to receive_messages(registry_settings) } + before { stub_container_registry_config(**registry_settings) } context 'for enabled registry' do let(:registry_settings) do @@ -826,14 +826,8 @@ describe Project, models: true do subject { project.has_container_registry_tags? } - before { allow(Gitlab.config.registry).to receive_messages(registry_settings) } - context 'for enabled registry' do - let(:registry_settings) do - { - enabled: true - } - end + before { stub_container_registry_config(enabled: true) } context 'with tags' do before { stub_container_registry_tags('test', 'test2') } @@ -849,11 +843,7 @@ describe Project, models: true do end context 'for disabled registry' do - let(:registry_settings) do - { - enabled: false - } - end + before { stub_container_registry_config(enabled: false) } it { is_expected.to be_falsey } end -- cgit v1.2.1 From ac6992ba682de08b79e5ddde08dbf566827e2f07 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 16 May 2016 23:40:40 -0500 Subject: Fix specs --- spec/models/project_spec.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e434d267896..60e1ec43f2b 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -787,6 +787,8 @@ describe Project, models: true do describe '#container_registry_repository' do let(:project) { create(:empty_project) } + before { stub_container_registry_config(enabled: true) } + subject { project.container_registry_repository } it { is_expected.to_not be_nil } -- cgit v1.2.1 From 75739e54be0fca389c05d3d9d3de69737c0ff3ab Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 23 May 2016 19:37:59 -0400 Subject: Enable RSpec/NotToNot cop and auto-correct offenses Also removes the note from the development/testing.md guide --- spec/models/project_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 60e1ec43f2b..4d36a539a69 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -791,7 +791,7 @@ describe Project, models: true do subject { project.container_registry_repository } - it { is_expected.to_not be_nil } + it { is_expected.not_to be_nil } end describe '#container_registry_repository_url' do @@ -809,7 +809,7 @@ describe Project, models: true do } end - it { is_expected.to_not be_nil } + it { is_expected.not_to be_nil } end context 'for disabled registry' do -- cgit v1.2.1 From 497a28c59f042fcce36d1d0682cf225c9743369f Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Wed, 25 May 2016 08:52:13 +0100 Subject: Fixed project model tests --- spec/models/project_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 60e1ec43f2b..34dcbf133d6 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -60,7 +60,7 @@ describe Project, models: true do project2 = build(:project) allow(project2).to receive(:creator).and_return(double(can_create_project?: false, projects_limit: 0).as_null_object) expect(project2).not_to be_valid - expect(project2.errors[:limit_reached].first).to match(/Your project limit is 0/) + expect(project2.errors[:limit_reached].first).to match(/Personal project creation is not allowed/) end end -- cgit v1.2.1 From 6e58e7ff7ce151fb7a8329faef69cd3a42194216 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 1 Jun 2016 20:43:33 +0200 Subject: Use downcased path to container repository as this is expected path by Docker --- spec/models/project_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 6c1b0393682..65f06b51794 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -792,6 +792,13 @@ describe Project, models: true do subject { project.container_registry_repository } it { is_expected.not_to be_nil } + + context 'for uppercase project path' do + let(:project) { create(:empty_project, path: 'PROJECT') } + + it { expect(subject.path).not_to end_with(project.path) } + it { expect(subject.path).to end_with(project.path.downcase) } + end end describe '#container_registry_repository_url' do @@ -810,6 +817,13 @@ describe Project, models: true do end it { is_expected.not_to be_nil } + + context 'for uppercase project path' do + let(:project) { create(:empty_project, path: 'PROJECT') } + + it { is_expected.not_to end_with(project.path) } + it { is_expected.to end_with(project.path.downcase) } + end end context 'for disabled registry' do -- cgit v1.2.1 From 77cb8ec4d14e3a8b03164423176b3b95977ee809 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 1 Jun 2016 22:57:50 +0200 Subject: Introduce container_registry_path_with_namespace --- spec/models/project_spec.rb | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 65f06b51794..338a4c3d3f0 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -784,6 +784,15 @@ describe Project, models: true do end end + describe '#container_registry_path_with_namespace' do + let(:project) { create(:empty_project, path: 'PROJECT') } + + subject { project.container_registry_path_with_namespace } + + it { is_expected.not_to eq(project.path_with_namespace) } + it { is_expected.to eq(project.path_with_namespace.downcase) } + end + describe '#container_registry_repository' do let(:project) { create(:empty_project) } @@ -792,13 +801,6 @@ describe Project, models: true do subject { project.container_registry_repository } it { is_expected.not_to be_nil } - - context 'for uppercase project path' do - let(:project) { create(:empty_project, path: 'PROJECT') } - - it { expect(subject.path).not_to end_with(project.path) } - it { expect(subject.path).to end_with(project.path.downcase) } - end end describe '#container_registry_repository_url' do @@ -817,13 +819,6 @@ describe Project, models: true do end it { is_expected.not_to be_nil } - - context 'for uppercase project path' do - let(:project) { create(:empty_project, path: 'PROJECT') } - - it { is_expected.not_to end_with(project.path) } - it { is_expected.to end_with(project.path.downcase) } - end end context 'for disabled registry' do -- cgit v1.2.1 From 021d3810c300d1e0514f21ccb6f1439f59e20565 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 2 Jun 2016 16:19:18 +0200 Subject: Rename Ci::Commit to Ci::Pipeline and rename some of the ci_commit to pipeline --- spec/models/project_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 338a4c3d3f0..44debdbdc1c 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -403,7 +403,7 @@ describe Project, models: true do let(:project) { create :project } let(:commit) { create :ci_commit, project: project, ref: 'master' } - subject { project.ci_commit(commit.sha, 'master') } + subject { project.pipeline(commit.sha, 'master') } it { is_expected.to eq(commit) } -- cgit v1.2.1 From 4d5f7aa00827f425dd3d2c3bd5a395c8e948f0ba Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 3 Jun 2016 14:46:17 +0200 Subject: Fix more places where we should rename ci_commit to pipeline --- spec/models/project_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 44debdbdc1c..1135d7b6099 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -22,7 +22,7 @@ describe Project, models: true do it { is_expected.to have_one(:pushover_service).dependent(:destroy) } it { is_expected.to have_one(:asana_service).dependent(:destroy) } it { is_expected.to have_many(:commit_statuses) } - it { is_expected.to have_many(:ci_commits) } + it { is_expected.to have_many(:pipelines) } it { is_expected.to have_many(:builds) } it { is_expected.to have_many(:runner_projects) } it { is_expected.to have_many(:runners) } -- cgit v1.2.1 From 20c7144ed20bad499b878425d5fbab408ad066b5 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 3 Jun 2016 16:22:26 +0200 Subject: Rename all `[ci_]commit` to `[ci_]pipeline` in specs and features --- spec/models/project_spec.rb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 1135d7b6099..89f66092b15 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -399,23 +399,23 @@ describe Project, models: true do end end - describe :ci_commit do + describe :pipeline do let(:project) { create :project } - let(:commit) { create :ci_commit, project: project, ref: 'master' } + let(:pipeline) { create :pipeline, project: project, ref: 'master' } - subject { project.pipeline(commit.sha, 'master') } + subject { project.pipeline(pipeline.sha, 'master') } - it { is_expected.to eq(commit) } + it { is_expected.to eq(pipeline) } context 'return latest' do - let(:commit2) { create :ci_commit, project: project, ref: 'master' } + let(:pipeline2) { create :pipeline, project: project, ref: 'master' } before do - commit - commit2 + pipeline + pipeline2 end - it { is_expected.to eq(commit2) } + it { is_expected.to eq(pipeline2) } end end -- cgit v1.2.1 From dbf235f514cc919a10fee1d9ab8dc1c75bc25238 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 7 Jun 2016 10:25:57 +0200 Subject: Fix tests failures --- spec/models/project_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 89f66092b15..3431d0435b4 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -401,7 +401,7 @@ describe Project, models: true do describe :pipeline do let(:project) { create :project } - let(:pipeline) { create :pipeline, project: project, ref: 'master' } + let(:pipeline) { create :ci_pipeline, project: project, ref: 'master' } subject { project.pipeline(pipeline.sha, 'master') } -- cgit v1.2.1 From 8988c8743d2f74b7939a39fbd1c6ebcaa5ac6647 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 7 Jun 2016 13:14:37 +0200 Subject: Fix remaining test offenses --- spec/models/project_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 3431d0435b4..553556ed326 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -408,7 +408,7 @@ describe Project, models: true do it { is_expected.to eq(pipeline) } context 'return latest' do - let(:pipeline2) { create :pipeline, project: project, ref: 'master' } + let(:pipeline2) { create :ci_pipeline, project: project, ref: 'master' } before do pipeline -- cgit v1.2.1 From 24920bc52a5658dd1d16d38ba3dc46f92dfe7675 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Wed, 8 Jun 2016 17:03:51 +0200 Subject: Add Project.where_paths_in This method can be used to find multiple projects for multiple paths. For example, take this snippet: Project.where_paths_in(%w{gitlab-org/gitlab-ce gitlab-org/gitlab-ee}) This will return an ActiveRecord::Relation containing the GitLab CE and GitLab EE projects. This method takes care of matching rows both case-sensitively and case-insensitively where needed. Project.find_with_namespace in turn has been modified to use Project.where_paths_in without nuking any scoping (instead it uses reorder(nil)). This means that any default scopes (e.g. those used for "pending_delete" stay intact). The method Project.where_paths_in was added so the various Markdown filters can use a single query to grab all the projects referenced in a set of documents, something Project.find_with_namespace didn't allow. --- spec/models/project_spec.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 553556ed326..f687e3171a7 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -859,4 +859,37 @@ describe Project, models: true do it { is_expected.to be_falsey } end end + + describe '.where_paths_in' do + context 'without any paths' do + it 'returns an empty relation' do + expect(Project.where_paths_in([])).to eq([]) + end + end + + context 'without any valid paths' do + it 'returns an empty relation' do + expect(Project.where_paths_in(%w[foo])).to eq([]) + end + end + + context 'with valid paths' do + let!(:project1) { create(:project) } + let!(:project2) { create(:project) } + + it 'returns the projects matching the paths' do + projects = Project.where_paths_in([project1.path_with_namespace, + project2.path_with_namespace]) + + expect(projects).to contain_exactly(project1, project2) + end + + it 'returns projects regardless of the casing of paths' do + projects = Project.where_paths_in([project1.path_with_namespace.upcase, + project2.path_with_namespace.upcase]) + + expect(projects).to contain_exactly(project1, project2) + end + end + end end -- cgit v1.2.1 From 136a4ea39bb82d7e88b79a3bb7b2f3b4a5ec42ab Mon Sep 17 00:00:00 2001 From: Paco Guzman Date: Fri, 3 Jun 2016 10:21:18 +0200 Subject: Cache the presence of an issue_tracker at project level Using update_column to store the boolean flag to avoid any side effects with the current state of the project instance --- spec/models/project_spec.rb | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'spec/models/project_spec.rb') diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 553556ed326..b6f36d3481e 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -258,6 +258,69 @@ describe Project, models: true do end end + describe :external_issue_tracker do + let(:project) { create(:project) } + let(:ext_project) { create(:redmine_project) } + + context 'on existing projects with no value for has_external_issue_tracker' do + before(:each) do + project.update_column(:has_external_issue_tracker, nil) + ext_project.update_column(:has_external_issue_tracker, nil) + end + + it 'updates the has_external_issue_tracker boolean' do + expect do + project.external_issue_tracker + end.to change { project.reload.has_external_issue_tracker }.to(false) + + expect do + ext_project.external_issue_tracker + end.to change { ext_project.reload.has_external_issue_tracker }.to(true) + end + end + + it 'returns nil and does not query services when there is no external issue tracker' do + project.build_missing_services + project.reload + + expect(project).not_to receive(:services) + + expect(project.external_issue_tracker).to eq(nil) + end + + it 'retrieves external_issue_tracker querying services and cache it when there is external issue tracker' do + ext_project.reload # Factory returns a project with changed attributes + ext_project.build_missing_services + ext_project.reload + + expect(ext_project).to receive(:services).once.and_call_original + + 2.times { expect(ext_project.external_issue_tracker).to be_a_kind_of(RedmineService) } + end + end + + describe :cache_has_external_issue_tracker do + let(:project) { create(:project) } + + it 'stores true if there is any external_issue_tracker' do + services = double(:service, external_issue_trackers: [RedmineService.new]) + expect(project).to receive(:services).and_return(services) + + expect do + project.cache_has_external_issue_tracker + end.to change { project.has_external_issue_tracker}.to(true) + end + + it 'stores false if there is no external_issue_tracker' do + services = double(:service, external_issue_trackers: []) + expect(project).to receive(:services).and_return(services) + + expect do + project.cache_has_external_issue_tracker + end.to change { project.has_external_issue_tracker}.to(false) + end + end + describe :can_have_issues_tracker_id? do let(:project) { create(:project) } let(:ext_project) { create(:redmine_project) } -- cgit v1.2.1