# frozen_string_literal: true RSpec.describe WatchedWordGroup do fab!(:watched_word_group) fab!(:watched_word_1) { Fabricate(:watched_word, watched_word_group_id: watched_word_group.id) } fab!(:watched_word_2) { Fabricate(:watched_word, watched_word_group_id: watched_word_group.id) } describe "#create_or_update_members" do it "updates watched word action" do words = [watched_word_1.word, watched_word_2.word, "damn", "4sale"] old_action = watched_word_group.action watched_words_before_update = watched_word_group.watched_words expect(old_action).to eq(WatchedWord.actions[:block]) expect(watched_words_before_update.map(&:action).uniq).to contain_exactly(old_action) watched_word_group.create_or_update_members(words, action_key: :censor) expect(watched_word_group.reload.errors).to be_empty watched_words = watched_word_group.watched_words expect(watched_words.size).to eq(4) expect(watched_words.map(&:word)).to contain_exactly(*words) expect(watched_words.map(&:action).uniq).to contain_exactly(WatchedWord.actions[:censor]) expect(watched_word_group.action).to eq(WatchedWord.actions[:censor]) end it "leaves membership intact if update fails" do words = [watched_word_1.word, watched_word_2.word, "a" * 120] old_action = watched_word_group.action watched_words_before_update = watched_word_group.watched_words expect(watched_words_before_update.size).to eq(2) expect(watched_words_before_update.map(&:word)).to contain_exactly( watched_word_1.word, watched_word_2.word, ) expect(watched_words_before_update.map(&:action).uniq).to contain_exactly(old_action) watched_word_group.create_or_update_members( words, action_key: WatchedWord.actions[watched_word_group.action], ) expect(watched_word_group.reload.errors).not_to be_empty watched_words = watched_word_group.watched_words expect(watched_word_group.action).to eq(old_action) expect(watched_words.size).to eq(2) expect(watched_words.map(&:word)).to contain_exactly(watched_word_1.word, watched_word_2.word) expect(watched_words.map(&:action).uniq).to contain_exactly(old_action) end end end