firebrew 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +127 -0
- data/Rakefile +6 -0
- data/bin/firebrew +5 -0
- data/firebrew.gemspec +29 -0
- data/lib/firebrew.rb +20 -0
- data/lib/firebrew/amo_api/search.rb +50 -0
- data/lib/firebrew/command_line.rb +140 -0
- data/lib/firebrew/entity.rb +39 -0
- data/lib/firebrew/firefox/basic_extension.rb +10 -0
- data/lib/firebrew/firefox/command.rb +27 -0
- data/lib/firebrew/firefox/extension.rb +104 -0
- data/lib/firebrew/firefox/profile.rb +56 -0
- data/lib/firebrew/runner.rb +83 -0
- data/lib/firebrew/version.rb +3 -0
- data/spec/double/firefox.rb +2 -0
- data/spec/firebrew/amo_api/search_spec.rb +69 -0
- data/spec/firebrew/command_line_spec.rb +150 -0
- data/spec/firebrew/entity_spec.rb +79 -0
- data/spec/firebrew/firefox/command_spec.rb +39 -0
- data/spec/firebrew/firefox/extension_spec.rb +159 -0
- data/spec/firebrew/firefox/profile_spec.rb +69 -0
- data/spec/firebrew/runner_spec.rb +142 -0
- data/spec/firebrew_spec.rb +7 -0
- data/spec/fixtures/amo_api/search/base.xml +28 -0
- data/spec/fixtures/amo_api/search/empty.xml +4 -0
- data/spec/fixtures/amo_api/search/single.xml +12 -0
- data/spec/fixtures/firefox/extension/extensions.v16.json +227 -0
- data/spec/fixtures/firefox/extension/extensions_added_hoge.v16.json +235 -0
- data/spec/fixtures/firefox/profile/base.ini +18 -0
- data/spec/fixtures/firefox/profile/empty.ini +2 -0
- data/spec/spec_helper.rb +13 -0
- metadata +196 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Firebrew
|
4
|
+
class EntityTest1
|
5
|
+
include Entity
|
6
|
+
entity_attr :value1, :value2
|
7
|
+
def initialize(params={})
|
8
|
+
params.each{|(k,v)| self.send("#{k}=", v) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class EntityTest2
|
13
|
+
include Entity
|
14
|
+
entity_attr :value3, :value4
|
15
|
+
end
|
16
|
+
|
17
|
+
class EntityTest1Ex < EntityTest1
|
18
|
+
entity_attr :value5, :value6
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Firebrew::Entity do
|
22
|
+
describe '::attributes()' do
|
23
|
+
describe 'EntityTest1(value1, value2)' do
|
24
|
+
it { expect(EntityTest1.attributes).to eq([:value1, :value2]) }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'EntityTest2(value3, value4)' do
|
28
|
+
it { expect(EntityTest2.attributes).to eq([:value3, :value4]) }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'EntityTest1Ex(value1, value2, value5, value6)' do
|
32
|
+
it { expect(EntityTest1Ex.attributes).to eq([:value1, :value2, :value5, :value6]) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '::entity_attr(*attrs)' do
|
37
|
+
subject do
|
38
|
+
Class.new do
|
39
|
+
include Entity
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should add the `attrs`' do
|
44
|
+
expect(subject.entity_attr(:attr1, :attr2)).to eq([:attr1, :attr2])
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when the `attrs` was already existed' do
|
48
|
+
it 'should add attributes which not exist in the `::attributes`' do
|
49
|
+
subject.entity_attr(:attr1)
|
50
|
+
expect(subject.entity_attr(:attr1, :attr2)).to eq([:attr2])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when the `attrs` contain duplicate values' do
|
55
|
+
it 'should add attributes which not contain duplicate values' do
|
56
|
+
expect(subject.entity_attr(:attr1, :attr2, :attr2)).to eq([:attr1, :attr2])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#==(rop)' do
|
62
|
+
context 'when `self` equaled `rop`' do
|
63
|
+
it do
|
64
|
+
a = EntityTest1.new(value1: 1, value2: 2)
|
65
|
+
b = EntityTest1.new(value1: 1, value2: 2)
|
66
|
+
expect(a == b).to be_truthy
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'when `self` not equaled `rop`' do
|
71
|
+
it do
|
72
|
+
a = EntityTest1.new(value1: 1, value2: 2)
|
73
|
+
b = EntityTest1.new(value1: 3, value2: 2)
|
74
|
+
expect(a == b).to be_falsy
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Firebrew::Firefox
|
4
|
+
describe Command do
|
5
|
+
subject do
|
6
|
+
Command.new(self.config, self.executer)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:config){Firebrew::Runner.default_config}
|
10
|
+
let(:executer){Command::Executer.new}
|
11
|
+
|
12
|
+
context 'when the indicated firefox command by the `config[:firefox]` not existed' do
|
13
|
+
let(:config){super().merge firefox: 'firefox/not/existed/path'}
|
14
|
+
it { expect{subject}.to raise_error(Firebrew::FirefoxCommandError) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when the indicated command by the `config[:firefox]` was not firefox' do
|
18
|
+
let(:executer) do
|
19
|
+
double('executer', exec: ['Other program', 0])
|
20
|
+
end
|
21
|
+
it { expect{subject}.to raise_error(Firebrew::FirefoxCommandError) }
|
22
|
+
|
23
|
+
describe 'command status' do
|
24
|
+
let(:executer) do
|
25
|
+
double('executer', exec: ['Fake Mozilla Firefox', 1])
|
26
|
+
end
|
27
|
+
it { expect{subject}.to raise_error(Firebrew::FirefoxCommandError) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#version()' do
|
32
|
+
subject { super().version }
|
33
|
+
let(:executer) do
|
34
|
+
double('executer', exec: ['Mozilla Firefox 30.0', 0])
|
35
|
+
end
|
36
|
+
it { is_expected.to eq('30.0') }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Firebrew::Firefox
|
5
|
+
describe Firebrew::Firefox::Extension do
|
6
|
+
let(:manager) do
|
7
|
+
Extension::Manager.new(
|
8
|
+
profile: Profile.new(
|
9
|
+
path: './tmp'
|
10
|
+
)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:extensions){[
|
15
|
+
Extension.new({
|
16
|
+
name: 'Japanese Language Pack',
|
17
|
+
guid: 'langpack-ja@firefox.mozilla.org',
|
18
|
+
version: '30.0',
|
19
|
+
uri: './tmp/extensions/langpack-ja@firefox.mozilla.org.xpi'
|
20
|
+
}, self.manager),
|
21
|
+
Extension.new({
|
22
|
+
name: 'Vimperator',
|
23
|
+
guid: 'vimperator@mozdev.org',
|
24
|
+
version: '3.8.2',
|
25
|
+
uri: './tmp/extensions/vimperator@mozdev.org.xpi'
|
26
|
+
}, self.manager)
|
27
|
+
]}
|
28
|
+
|
29
|
+
before do
|
30
|
+
FileUtils.cp('./spec/fixtures/firefox/extension/extensions.v16.json', './tmp/extensions.json')
|
31
|
+
end
|
32
|
+
|
33
|
+
describe :Manager do
|
34
|
+
subject { self.instance }
|
35
|
+
let(:instance){self.manager}
|
36
|
+
|
37
|
+
describe '#all()' do
|
38
|
+
subject { self.instance.all }
|
39
|
+
|
40
|
+
it { is_expected.to be_instance_of(Array) }
|
41
|
+
it { expect(subject.size).to eq(2) }
|
42
|
+
|
43
|
+
it 'should construct' do
|
44
|
+
expect(subject[0]).to eq(self.extensions[0])
|
45
|
+
expect(subject[1]).to eq(self.extensions[1])
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when not existed `extension.json`' do
|
49
|
+
before {FileUtils.rm_f './tmp/extensions.json'}
|
50
|
+
it { expect{subject}.to raise_error(Firebrew::ExtensionsFileNotFoundError) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#find(name)' do
|
55
|
+
subject {super().find self.name}
|
56
|
+
let(:name){self.extensions[1].name}
|
57
|
+
|
58
|
+
it 'should find' do
|
59
|
+
is_expected.to eq(self.extensions[1])
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when the extension corresponding to the `name` not existed' do
|
63
|
+
let(:name){'hoge'}
|
64
|
+
it { is_expected.to be_nil }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#find!(name)' do
|
69
|
+
subject {super().find! self.name}
|
70
|
+
let(:name){self.extensions[1].name}
|
71
|
+
|
72
|
+
it { expect{subject}.to_not raise_error }
|
73
|
+
it 'should find' do
|
74
|
+
is_expected.to eq(self.extensions[1])
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when the extension corresponding to the `name` not existed' do
|
78
|
+
let(:name){'hoge'}
|
79
|
+
it { expect{subject}.to raise_error(Firebrew::ExtensionNotFoundError) }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#install(extension)' do
|
84
|
+
before { self.instance.install(self.extension) }
|
85
|
+
|
86
|
+
let(:extension) do
|
87
|
+
Extension.new({
|
88
|
+
guid: 'hoge@example.org',
|
89
|
+
uri: './spec/fixtures/amo_api/search/base.xml'
|
90
|
+
}, self.manager)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should copy the `path/to/profile/extensions/guid.xpi`' do
|
94
|
+
path = File.join(self.instance.profile.path, 'extensions/%s.xpi' % self.extension.guid)
|
95
|
+
expect(File.exists? path).to be_truthy
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should add the `extension` extension' do
|
99
|
+
all = self.instance.all
|
100
|
+
extension = self.extension
|
101
|
+
extension.uri = './tmp/extensions/hoge@example.org.xpi'
|
102
|
+
expect(all.size).to eq(3)
|
103
|
+
expect(all[0]).to eq(self.extensions[0])
|
104
|
+
expect(all[1]).to eq(self.extensions[1])
|
105
|
+
expect(all[2]).to eq(self.extension)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#uninstall(extension)' do
|
110
|
+
let(:extension) do
|
111
|
+
Extension.new({
|
112
|
+
guid: 'hoge@example.org',
|
113
|
+
uri: './tmp/extensions/hoge@example.org.xpi'
|
114
|
+
}, self.manager)
|
115
|
+
end
|
116
|
+
|
117
|
+
before do
|
118
|
+
FileUtils.cp('./spec/fixtures/firefox/extension/extensions_added_hoge.v16.json', './tmp/extensions.json')
|
119
|
+
File.write self.extension.uri, ''
|
120
|
+
self.manager.uninstall(self.extension)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should remove the `extension` file' do
|
124
|
+
expect(File.exists? self.extension.uri).to be_falsey
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should remove the `extension` extension' do
|
128
|
+
all = self.instance.all
|
129
|
+
expect(all.size).to eq(2)
|
130
|
+
expect(all[0]).to eq(self.extensions[0])
|
131
|
+
expect(all[1]).to eq(self.extensions[1])
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe 'instance' do
|
137
|
+
subject {self.instance}
|
138
|
+
let(:instance){self.extensions[1]}
|
139
|
+
|
140
|
+
before do
|
141
|
+
open(self.instance.uri,'w'){|o| o.write self.instance.name}
|
142
|
+
end
|
143
|
+
|
144
|
+
after do
|
145
|
+
FileUtils.rm_f self.instance.uri
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '#delete()' do
|
149
|
+
before do
|
150
|
+
self.instance().delete
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should not existed this file' do
|
154
|
+
expect(File.exists? self.instance.uri).to be_falsey
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Firebrew::Firefox
|
4
|
+
describe Firebrew::Firefox::Profile do
|
5
|
+
describe :Manager do
|
6
|
+
subject do
|
7
|
+
Profile::Manager.new(
|
8
|
+
base_dir: self.base_dir,
|
9
|
+
data_file: self.data_file
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:base_dir){'./spec/fixtures/firefox/profile'}
|
14
|
+
let(:data_file){'base.ini'}
|
15
|
+
|
16
|
+
context 'when "profiles.ini" not existed' do
|
17
|
+
let(:base_dir){'not/existed/directory'}
|
18
|
+
let(:data_file){'not_found.ini'}
|
19
|
+
it { expect{subject}.to raise_error(Firebrew::ProfilesFileNotFoundError) }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#all()' do
|
23
|
+
subject { super().all }
|
24
|
+
it { expect(subject.size).to eq(3) }
|
25
|
+
|
26
|
+
it 'should construct records' do
|
27
|
+
expect(subject[0].name).to eq('default')
|
28
|
+
expect(subject[0].path).to eq(File.expand_path File.join(self.base_dir, 'Profiles/abcd.default'))
|
29
|
+
expect(subject[0].is_default).to be_truthy
|
30
|
+
|
31
|
+
expect(subject[1].name).to eq('other_profile')
|
32
|
+
expect(subject[1].path).to eq(File.expand_path File.join(self.base_dir, 'Profiles/efgh.other_profile'))
|
33
|
+
expect(subject[1].is_default).to be_falsey
|
34
|
+
|
35
|
+
expect(subject[2].name).to eq('abs_profile')
|
36
|
+
expect(subject[2].path).to eq('/path/to/abs_profile')
|
37
|
+
expect(subject[2].is_default).to be_falsey
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when profiles were empty' do
|
41
|
+
let(:data_file){'empty.ini'}
|
42
|
+
it { is_expected.to be_empty }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#find(name)' do
|
47
|
+
subject { super().find(self.name) }
|
48
|
+
let(:name){'other_profile'}
|
49
|
+
it { expect(subject.name).to eq('other_profile') }
|
50
|
+
|
51
|
+
context 'when not existed the `name` in the profiles.' do
|
52
|
+
let(:name){'not_existed_profile_name'}
|
53
|
+
it { is_expected.to be_nil }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#find!(name)' do
|
58
|
+
subject {super().find! self.name}
|
59
|
+
let(:name){'other_profile'}
|
60
|
+
it { expect{subject}.to_not raise_error}
|
61
|
+
|
62
|
+
context 'when not existed the `name` in the profiles.' do
|
63
|
+
let(:name){'not_existed_profile_name'}
|
64
|
+
it { expect{subject}.to raise_error(Firebrew::ProfileNotFoundError) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Firebrew
|
4
|
+
describe Firebrew::Runner do
|
5
|
+
describe '::default_config(platform)' do
|
6
|
+
subject do
|
7
|
+
Runner.default_config(self.platform)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:platform){RUBY_PLATFORM}
|
11
|
+
|
12
|
+
before do
|
13
|
+
ENV['FIREBREW_FIREFOX_PROFILE_BASE_DIR'] = nil
|
14
|
+
ENV['FIREBREW_FIREFOX_PROFILE'] = nil
|
15
|
+
ENV['FIREBREW_FIREFOX'] = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when the `platform` was "MacOS"' do
|
19
|
+
let(:platform){'x86_64-darwin13.0'}
|
20
|
+
it do
|
21
|
+
is_expected.to eq(
|
22
|
+
base_dir: '~/Library/Application Support/Firefox',
|
23
|
+
firefox: '/Applications/Firefox.app/Contents/MacOS/firefox-bin',
|
24
|
+
profile: 'default'
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when the `platform` was "Linux"' do
|
30
|
+
let(:platform){'x86_64-linux'}
|
31
|
+
it do
|
32
|
+
is_expected.to eq(
|
33
|
+
base_dir: '~/.mozilla/firefox',
|
34
|
+
firefox: '/usr/bin/firefox',
|
35
|
+
profile: 'default'
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when the `platform` was "Windows 7 x86_64"' do
|
41
|
+
let(:platform){'x64-mingw32'}
|
42
|
+
it do
|
43
|
+
is_expected.to eq(
|
44
|
+
base_dir: '~/AppData/Roming/Mozilla/Firefox',
|
45
|
+
firefox: 'C:/Program Files (x86)/Mozilla Firefox/firefox.exe',
|
46
|
+
profile: 'default'
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when set environment variables' do
|
52
|
+
before do
|
53
|
+
ENV['FIREBREW_FIREFOX_PROFILE_BASE_DIR'] = 'path/to/profile_base_directory'
|
54
|
+
ENV['FIREBREW_FIREFOX_PROFILE'] = 'profile-name'
|
55
|
+
ENV['FIREBREW_FIREFOX'] = 'path/to/firefox'
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
ENV['FIREBREW_FIREFOX_PROFILE_BASE_DIR'] = nil
|
60
|
+
ENV['FIREBREW_FIREFOX_PROFILE'] = nil
|
61
|
+
ENV['FIREBREW_FIREFOX'] = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it do
|
65
|
+
is_expected.to eq(
|
66
|
+
base_dir: 'path/to/profile_base_directory',
|
67
|
+
firefox: 'path/to/firefox',
|
68
|
+
profile: 'profile-name'
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe :Instance do
|
75
|
+
subject {self.instance}
|
76
|
+
|
77
|
+
let(:instance) do
|
78
|
+
Runner.new(
|
79
|
+
base_dir: './tmp',
|
80
|
+
data_file: 'profiles.ini',
|
81
|
+
firefox: './spec/double/firefox.rb'
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
let(:search_params){{term: 'hoge', version: '30.0', max: 1}}
|
86
|
+
|
87
|
+
before do
|
88
|
+
FileUtils.cp './spec/fixtures/firefox/profile/base.ini', './tmp/profiles.ini'
|
89
|
+
response = File.read("./spec/fixtures/amo_api/search/base.xml")
|
90
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
91
|
+
mock.get AmoApi::Search.path(self.search_params), {}, response
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
after do
|
96
|
+
FileUtils.rm_f './tmp/*'
|
97
|
+
ActiveResource::HttpMock.reset!
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#install(params)' do
|
101
|
+
subject do
|
102
|
+
extensions_double = double('extensions', install: nil, find: nil)
|
103
|
+
self.instance.profile = double('profile', extensions: extensions_double)
|
104
|
+
self.instance.install(self.search_params)
|
105
|
+
end
|
106
|
+
|
107
|
+
it { expect{subject}.to_not raise_error }
|
108
|
+
|
109
|
+
context 'when the `params[:term]` existed' do
|
110
|
+
subject do
|
111
|
+
extensions_double = double('extensions', install: nil, find: Firefox::BasicExtension.new)
|
112
|
+
self.instance.profile = double('profile', extensions: extensions_double)
|
113
|
+
self.instance.install(self.search_params)
|
114
|
+
end
|
115
|
+
|
116
|
+
it { expect{subject}.to raise_error(Firebrew::OperationAlreadyCompletedError) }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe '#uninstall(params)' do
|
121
|
+
subject do
|
122
|
+
extensions_double = double('extensions', find!: double('ext', delete: nil))
|
123
|
+
self.instance.profile = double('profile', extensions: extensions_double)
|
124
|
+
self.instance.uninstall(term: 'not-existed-extension')
|
125
|
+
end
|
126
|
+
|
127
|
+
it { expect{subject}.to_not raise_error }
|
128
|
+
|
129
|
+
context 'when the `params[:term]` not existed' do
|
130
|
+
subject do
|
131
|
+
extensions_double = double('extensions')
|
132
|
+
allow(extensions_double).to receive(:find!).and_raise(Firebrew::ExtensionNotFoundError)
|
133
|
+
self.instance.profile = double('profile', extensions: extensions_double)
|
134
|
+
self.instance.uninstall(term: 'not-existed-extension')
|
135
|
+
end
|
136
|
+
|
137
|
+
it { expect{subject}.to raise_error(Firebrew::OperationAlreadyCompletedError) }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|