diff options
author | Douwe Maan <douwe@selenight.nl> | 2016-06-01 13:39:56 +0200 |
---|---|---|
committer | Douwe Maan <douwe@selenight.nl> | 2016-06-01 13:39:56 +0200 |
commit | d1c537ad32cdb4993d09318de3a6debf1d37261d (patch) | |
tree | 96c4e35cb35bf24426c43f24b34ff141d1dd86d9 | |
parent | 9d88a3a1ddf77a2512864df4785bce8f9f566ee1 (diff) | |
parent | aeb5262d427e1b61ded71cc4a20e8e2a7a0089ef (diff) | |
download | gitlab-ce-d1c537ad32cdb4993d09318de3a6debf1d37261d.tar.gz |
Merge branch 'long.polyglot/gitlab-ce-issue_17479_todos_not_remove_when_leave_project'
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | app/models/members/project_member.rb | 7 | ||||
-rw-r--r-- | spec/models/members/project_member_spec.rb | 42 |
3 files changed, 49 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG index e1af492eb62..4c6c0dc4217 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ v 8.9.0 (unreleased) - Allow enabling wiki page events from Webhook management UI - Make EmailsOnPushWorker use Sidekiq mailers queue - Fix wiki page events' webhook to point to the wiki repository + - Fix issue todo not remove when leave project !4150 (Long Nguyen) - Allow forking projects with restricted visibility level - Improve note validation to prevent errors when creating invalid note via API - Remove project notification settings associated with deleted projects diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index 8dae3bb2ef2..46955b430f3 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -5,7 +5,6 @@ class ProjectMember < Member belongs_to :project, class_name: 'Project', foreign_key: 'source_id' - # Make sure project member points only to project as it source default_value_for :source_type, SOURCE_TYPE validates_format_of :source_type, with: /\AProject\z/ @@ -15,6 +14,8 @@ class ProjectMember < Member scope :in_projects, ->(projects) { where(source_id: projects.pluck(:id)) } scope :with_user, ->(user) { where(user_id: user.id) } + before_destroy :delete_member_todos + class << self # Add users to project teams with passed access option @@ -102,6 +103,10 @@ class ProjectMember < Member private + def delete_member_todos + user.todos.where(project_id: source_id).destroy_all if user + end + def send_invite notification_service.invite_project_member(self, @raw_invite_token) diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb index 9f26d9eb5ce..9f13874b532 100644 --- a/spec/models/members/project_member_spec.rb +++ b/spec/models/members/project_member_spec.rb @@ -20,6 +20,48 @@ require 'spec_helper' describe ProjectMember, models: true do + describe 'associations' do + it { is_expected.to belong_to(:project).class_name('Project').with_foreign_key(:source_id) } + end + + describe 'validations' do + it { is_expected.to allow_value('Project').for(:source_type) } + it { is_expected.not_to allow_value('project').for(:source_type) } + end + + describe 'modules' do + it { is_expected.to include_module(Gitlab::ShellAdapter) } + end + + describe "#destroy" do + let(:owner) { create(:project_member, access_level: ProjectMember::OWNER) } + let(:project) { owner.project } + let(:master) { create(:project_member, project: project) } + + let(:owner_todos) { (0...2).map { create(:todo, user: owner.user, project: project) } } + let(:master_todos) { (0...3).map { create(:todo, user: master.user, project: project) } } + + before do + owner_todos + master_todos + end + + it "destroy itself and delete associated todos" do + expect(owner.user.todos.size).to eq(2) + expect(master.user.todos.size).to eq(3) + expect(Todo.count).to eq(5) + + master_todo_ids = master_todos.map(&:id) + master.destroy + + expect(owner.user.todos.size).to eq(2) + expect(Todo.count).to eq(2) + master_todo_ids.each do |id| + expect(Todo.exists?(id)).to eq(false) + end + end + end + describe :import_team do before do @abilities = Six.new |