File: project_namespace_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (124 lines) | stat: -rw-r--r-- 4,588 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Namespaces::ProjectNamespace, type: :model, feature_category: :groups_and_projects do
  let_it_be(:organization) { create(:organization) }

  describe 'relationships' do
    it { is_expected.to have_one(:project).inverse_of(:project_namespace) }

    specify do
      project = create(:project)
      namespace = project.project_namespace
      namespace.reload_project

      expect(namespace.project).to eq project
    end
  end

  describe 'validations' do
    it { is_expected.not_to validate_presence_of :owner }
  end

  context 'when deleting project namespace' do
    # using delete rather than destroy due to `delete` skipping AR hooks/callbacks
    # so it's ensured to work at the DB level. Uses ON DELETE CASCADE on foreign key
    let_it_be(:project) { create(:project) }
    let_it_be(:project_namespace) { project.project_namespace }

    it 'also deletes associated project' do
      project_namespace.delete

      expect { project_namespace.reload }.to raise_error(ActiveRecord::RecordNotFound)
      expect { project.reload }.to raise_error(ActiveRecord::RecordNotFound)
    end
  end

  describe '.create_from_project!' do
    context 'when namespace does not exist' do
      it 'new project_namespace is not saved' do
        expect_any_instance_of(described_class) do |instance|
          expect(instance).not_to receive(:save!)
        end

        project = Project.new(namespace: nil)
        described_class.create_from_project!(project)
      end
    end

    context 'for new record when namespace exists' do
      let(:project) { build(:project, organization: organization) }
      let(:project_namespace) { project.project_namespace }

      it 'syncs the project attributes to project namespace' do
        project_name = 'project 1 name'
        project.name = project_name

        described_class.create_from_project!(project)
        expect(project.project_namespace.name).to eq(project_name)
        expect(project.project_namespace.organization_id).to eq(project.organization_id)
      end

      context 'when project has an unsaved project namespace' do
        it 'saves the same project namespace' do
          described_class.create_from_project!(project)

          expect(project_namespace).to be_persisted
        end
      end
    end
  end

  describe '#sync_attributes_from_project' do
    context 'with existing project' do
      let(:project) { build(:project, organization: organization) }
      let(:project_namespace) { project.project_namespace }
      let(:project_new_namespace) { create(:namespace) }
      let(:project_new_path) { 'project-new-path' }
      let(:project_new_name) { project_new_path.titleize }
      let(:project_new_visibility_level) { Gitlab::VisibilityLevel::INTERNAL }
      let(:project_shared_runners_enabled) { !project.shared_runners_enabled }

      before do
        project.name = project_new_name
        project.path = project_new_path
        project.visibility_level = project_new_visibility_level
        project.namespace = project_new_namespace
        project.shared_runners_enabled = project_shared_runners_enabled
      end

      it 'syncs the relevant keys from the project' do
        project_namespace.sync_attributes_from_project(project)

        expect(project_namespace.name).to eq(project_new_name)
        expect(project_namespace.path).to eq(project_new_path)
        expect(project_namespace.visibility_level).to eq(project_new_visibility_level)
        expect(project_namespace.namespace).to eq(project_new_namespace)
        expect(project_namespace.namespace_id).to eq(project_new_namespace.id)
        expect(project_namespace.shared_runners_enabled).to eq(project_shared_runners_enabled)
        expect(project_namespace.organization_id).to eq(project.organization_id)
      end
    end

    it 'syncs visibility_level if project is new' do
      project = build(:project)
      project_namespace = project.project_namespace
      project_namespace.visibility_level = Gitlab::VisibilityLevel::PUBLIC

      project_namespace.sync_attributes_from_project(project)

      expect(project_namespace.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
    end
  end

  describe '#all_projects' do
    let(:project) { create(:project) }
    let(:project_namespace) { project.project_namespace }

    it 'returns single project relation' do
      expect(project_namespace.all_projects).to be_a(ActiveRecord::Relation)
      expect(project_namespace.all_projects).to match_array([project])
    end
  end
end