summaryrefslogtreecommitdiff
path: root/spec/models/members/member_task_spec.rb
blob: b06aa05c255e3b9a8a850d1103d3e22ec5f0415e (plain)
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 MemberTask do
  describe 'Associations' do
    it { is_expected.to belong_to(:member) }
    it { is_expected.to belong_to(:project) }
  end

  describe 'Validations' do
    it { is_expected.to validate_presence_of(:member) }
    it { is_expected.to validate_presence_of(:project) }
    it { is_expected.to validate_inclusion_of(:tasks).in_array(MemberTask::TASKS.values) }

    describe 'unique tasks validation' do
      subject do
        build(:member_task, tasks: [0, 0])
      end

      it 'expects the task values to be unique' do
        expect(subject).to be_invalid
        expect(subject.errors[:tasks]).to include('are not unique')
      end
    end

    describe 'project validations' do
      let_it_be(:project) { create(:project) }

      subject do
        build(:member_task, member: member, project: project, tasks_to_be_done: [:ci, :code])
      end

      context 'when the member source is a group' do
        let_it_be(:member) { create(:group_member) }

        it "expects the project to be part of the member's group projects" do
          expect(subject).to be_invalid
          expect(subject.errors[:project]).to include('is not in the member group')
        end

        context "when the project is part of the member's group projects" do
          let_it_be(:project) { create(:project, namespace: member.source) }

          it { is_expected.to be_valid }
        end
      end

      context 'when the member source is a project' do
        let_it_be(:member) { create(:project_member) }

        it "expects the project to be the member's project" do
          expect(subject).to be_invalid
          expect(subject.errors[:project]).to include('is not the member project')
        end

        context "when the project is the member's project" do
          let_it_be(:project) { member.source }

          it { is_expected.to be_valid }
        end
      end
    end
  end

  describe '.for_members' do
    it 'returns the member_tasks for multiple members' do
      member1 = create(:group_member)
      member_task1 = create(:member_task, member: member1)
      create(:member_task)
      expect(described_class.for_members([member1])).to match_array([member_task1])
    end
  end

  describe '#tasks_to_be_done' do
    subject { member_task.tasks_to_be_done }

    let_it_be(:member_task) { build(:member_task) }

    before do
      member_task[:tasks] = [0, 1]
    end

    it 'returns an array of symbols for the corresponding integers' do
      expect(subject).to match_array([:ci, :code])
    end
  end

  describe '#tasks_to_be_done=' do
    let_it_be(:member_task) { build(:member_task) }

    context 'when passing valid values' do
      subject { member_task[:tasks] }

      before do
        member_task.tasks_to_be_done = tasks
      end

      context 'when passing tasks as strings' do
        let_it_be(:tasks) { %w(ci code) }

        it 'sets an array of integers for the corresponding tasks' do
          expect(subject).to match_array([0, 1])
        end
      end

      context 'when passing a single task' do
        let_it_be(:tasks) { :ci }

        it 'sets an array of integers for the corresponding tasks' do
          expect(subject).to match_array([1])
        end
      end

      context 'when passing a task twice' do
        let_it_be(:tasks) { %w(ci ci) }

        it 'is set only once' do
          expect(subject).to match_array([1])
        end
      end
    end
  end
end