# Copyright (c) 2021 Jerome Arbez-Gindre # frozen_string_literal: true require('defmastership') RSpec.describe(DefMastership::RenameIncludedFilesLineModifier) do subject(:includeschanger) { described_class.new } describe '.new' do it { is_expected.not_to(be(nil)) } it { is_expected.to(have_attributes(from_regexp: '')) } it { is_expected.to(have_attributes(to_template: '')) } it { is_expected.to(have_attributes(changes: [])) } it { expect { includeschanger.user_defined_attribute }.to(raise_error(NoMethodError)) } end describe '.from_config' do subject(:includeschanger) do described_class.from_config( from_regexp: 'Whatever.+', to_template: 'Whatever' ) end it { is_expected.not_to(be(nil)) } it { is_expected.to(have_attributes(from_regexp: 'Whatever.+')) } it { is_expected.to(have_attributes(to_template: 'Whatever')) } end describe '#replace' do context 'when NOT valid include' do before do includeschanger.from_config( from_regexp: 'orig', cancel_if_match: 'REF', to_template: 'dest' ) allow(File).to(receive(:rename)) end context 'when the include statement do not match' do before do ['[define,requirement,REFERENCE]', '--'].each do |line| includeschanger.replace(line) end end it do expect(includeschanger.replace('badinclude::orig[]')) .to(eq('badinclude::orig[]')) end it do includeschanger.replace('badinclude::orig[]') expect(includeschanger).to(have_attributes(changes: [])) end end context 'when the include is not in a definition' do before do ['[define,requirement,REFERENCE]', '--', 'text', '--'].each do |line| includeschanger.replace(line) end end it do expect(includeschanger.replace('include::orig[]')) .to(eq('include::orig[]')) end it do includeschanger.replace('include::orig[]') expect(includeschanger).to(have_attributes(changes: [])) end end context 'when the cancel regexp is met' do before do ['[define,requirement,REFERENCE]', '--'].each do |line| includeschanger.replace(line) end end it do expect(includeschanger.replace('include::REFERENCE_orig[]')) .to(eq('include::REFERENCE_orig[]')) end it do includeschanger.replace('include::REFERENCE_orig[]') expect(includeschanger).to(have_attributes(changes: [])) end end end context 'when valid include' do before do allow(File).to(receive(:rename)) end context 'when really simple rule' do before do includeschanger.from_config( from_regexp: 'orig', cancel_if_match: 'REF', to_template: 'dest' ) includeschanger.replace('[define,requirement,REFERENCE]') includeschanger.replace('--') end it do expect(includeschanger.replace('include::orig[]')) .to(eq('include::dest[]')) end it do includeschanger.replace('include::orig[]') expect(File).to(have_received(:rename).with('orig', 'dest')) end it do includeschanger.replace('include::orig[]') expect(includeschanger).to(have_attributes(changes: [%w[orig dest]])) end it do expect(includeschanger.replace('include::toto/orig[]')) .to(eq('include::toto/dest[]')) end it do includeschanger.replace('include::toto/orig[]') expect(File).to(have_received(:rename).with('toto/orig', 'toto/dest')) end it do includeschanger.replace('include::toto/orig[]') expect(includeschanger).to(have_attributes(changes: [%w[toto/orig toto/dest]])) end end context 'when complex from_regexp' do before do includeschanger.from_config( from_regexp: '(?.*\.extension)', to_template: '%s_%s' ) includeschanger.replace('[define,requirement,REF]') end it do expect(includeschanger.replace('include::any_path/one_file.extension[]')) .to(eq('include::any_path/REF_one_file.extension[]')) end it do includeschanger.replace('include::any_path/one_file.extension[]') expect(File).to(have_received(:rename).with('any_path/one_file.extension', 'any_path/REF_one_file.extension')) end it do changes = [%w[any_path/one_file.extension any_path/REF_one_file.extension]] includeschanger.replace('include::any_path/one_file.extension[]') expect(includeschanger).to(have_attributes(changes: changes)) end end context 'when path with variable' do before do includeschanger.from_config( from_regexp: 'orig', to_template: 'dest' ) includeschanger.replace(':any: one') includeschanger.replace(':path: two') includeschanger.replace('[define,requirement,REFERENCE]') includeschanger.replace('--') end it do expect(includeschanger.replace('include::{any}/orig[]')) .to(eq('include::{any}/dest[]')) end it do includeschanger.replace('include::{any}/orig[]') expect(File).to(have_received(:rename).with('one/orig', 'one/dest')) end it do includeschanger.replace('include::{any}_{path}/orig[]') expect(File).to(have_received(:rename).with('one_two/orig', 'one_two/dest')) end it do includeschanger.replace('include::{any}_{path}/orig[]') expect(includeschanger).to(have_attributes(changes: [%w[one_two/orig one_two/dest]])) end end end end end