imap-backup 4.0.7 → 4.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/bin/imap-backup +5 -2
  3. data/lib/imap/backup/account/connection.rb +53 -33
  4. data/lib/imap/backup/account/folder.rb +22 -2
  5. data/lib/imap/backup/account.rb +4 -0
  6. data/lib/imap/backup/cli/accounts.rb +43 -0
  7. data/lib/imap/backup/cli/folders.rb +3 -1
  8. data/lib/imap/backup/cli/helpers.rb +8 -9
  9. data/lib/imap/backup/cli/local.rb +4 -2
  10. data/lib/imap/backup/cli/setup.rb +1 -1
  11. data/lib/imap/backup/cli/utils.rb +3 -2
  12. data/lib/imap/backup/{configuration/store.rb → configuration.rb} +16 -3
  13. data/lib/imap/backup/downloader.rb +26 -12
  14. data/lib/imap/backup/logger.rb +42 -0
  15. data/lib/imap/backup/sanitizer.rb +42 -0
  16. data/lib/imap/backup/serializer/mbox_store.rb +2 -2
  17. data/lib/imap/backup/{configuration → setup}/account.rb +29 -19
  18. data/lib/imap/backup/{configuration → setup}/asker.rb +5 -5
  19. data/lib/imap/backup/setup/connection_tester.rb +26 -0
  20. data/lib/imap/backup/{configuration → setup}/folder_chooser.rb +18 -8
  21. data/lib/imap/backup/setup/helpers.rb +15 -0
  22. data/lib/imap/backup/{configuration/setup.rb → setup.rb} +23 -17
  23. data/lib/imap/backup/uploader.rb +2 -2
  24. data/lib/imap/backup/version.rb +2 -2
  25. data/lib/imap/backup.rb +7 -33
  26. data/lib/retry_on_error.rb +1 -1
  27. data/spec/features/backup_spec.rb +1 -0
  28. data/spec/features/support/email_server.rb +5 -2
  29. data/spec/support/higline_test_helpers.rb +1 -1
  30. data/spec/support/silence_logging.rb +1 -1
  31. data/spec/unit/imap/backup/account/connection_spec.rb +14 -9
  32. data/spec/unit/imap/backup/cli/accounts_spec.rb +47 -0
  33. data/spec/unit/imap/backup/cli/local_spec.rb +7 -3
  34. data/spec/unit/imap/backup/cli/utils_spec.rb +15 -5
  35. data/spec/unit/imap/backup/{configuration/store_spec.rb → configuration_spec.rb} +2 -2
  36. data/spec/unit/imap/backup/downloader_spec.rb +1 -1
  37. data/spec/unit/imap/backup/logger_spec.rb +48 -0
  38. data/spec/unit/imap/backup/{configuration → setup}/account_spec.rb +31 -24
  39. data/spec/unit/imap/backup/{configuration → setup}/asker_spec.rb +2 -2
  40. data/spec/unit/imap/backup/{configuration → setup}/connection_tester_spec.rb +10 -10
  41. data/spec/unit/imap/backup/{configuration → setup}/folder_chooser_spec.rb +8 -8
  42. data/spec/unit/imap/backup/{configuration/setup_spec.rb → setup_spec.rb} +48 -40
  43. metadata +49 -46
  44. data/lib/imap/backup/configuration/connection_tester.rb +0 -14
  45. data/lib/imap/backup/configuration/list.rb +0 -53
  46. data/spec/unit/imap/backup/configuration/list_spec.rb +0 -96
  47. data/spec/unit/imap/backup_spec.rb +0 -28
@@ -1,8 +1,10 @@
1
+ require "imap/backup/setup/helpers"
2
+
1
3
  module Imap::Backup
2
- module Configuration; end
4
+ class Setup; end
3
5
 
4
- Configuration::Account = Struct.new(:store, :account, :highline) do
5
- def initialize(store, account, highline)
6
+ Setup::Account = Struct.new(:config, :account, :highline) do
7
+ def initialize(config, account, highline)
6
8
  super
7
9
  end
8
10
 
@@ -28,34 +30,38 @@ module Imap::Backup
28
30
  modify_connection_options menu
29
31
  test_connection menu
30
32
  delete_account menu
31
- menu.choice("return to main menu") { throw :done }
33
+ menu.choice("(q) return to main menu") { throw :done }
32
34
  menu.hidden("quit") { throw :done }
33
35
  end
34
36
  end
35
37
 
36
38
  def header(menu)
39
+ modified = account.modified? ? "*" : ""
37
40
  connection_options =
38
41
  if account.connection_options
39
42
  escaped =
40
43
  JSON.generate(account.connection_options).
41
44
  gsub('"', '\"')
42
- "\n connection options: #{escaped}"
45
+ "\n connection options #{escaped}"
43
46
  end
44
- menu.header = <<~HEADER
45
- Account:
46
- email: #{account.username}
47
- password: #{masked_password}
48
- path: #{account.local_path}
49
- folders: #{folders.map { |f| f[:name] }.join(', ')}
50
- server: #{account.server}#{connection_options}
47
+ menu.header = <<~HEADER.chomp
48
+ #{helpers.title_prefix} Account#{modified}
49
+
50
+ email #{account.username}
51
+ password #{masked_password}
52
+ path #{account.local_path}
53
+ folders #{folders.map { |f| f[:name] }.join(', ')}
54
+ server #{account.server}#{connection_options}
55
+
56
+ Choose an action
51
57
  HEADER
52
58
  end
53
59
 
54
60
  def modify_email(menu)
55
61
  menu.choice("modify email") do
56
- username = Configuration::Asker.email(username)
62
+ username = Setup::Asker.email(username)
57
63
  Kernel.puts "username: #{username}"
58
- other_accounts = store.accounts.reject { |a| a == account }
64
+ other_accounts = config.accounts.reject { |a| a == account }
59
65
  others = other_accounts.map { |a| a.username }
60
66
  Kernel.puts "others: #{others.inspect}"
61
67
  if others.include?(username)
@@ -76,7 +82,7 @@ module Imap::Backup
76
82
 
77
83
  def modify_password(menu)
78
84
  menu.choice("modify password") do
79
- password = Configuration::Asker.password
85
+ password = Setup::Asker.password
80
86
 
81
87
  account.password = password if !password.nil?
82
88
  end
@@ -97,7 +103,7 @@ module Imap::Backup
97
103
  end
98
104
 
99
105
  def path_modification_validator(path)
100
- same = store.accounts.find do |a|
106
+ same = config.accounts.find do |a|
101
107
  a.username != account.username && a.local_path == path
102
108
  end
103
109
  if same
@@ -112,7 +118,7 @@ module Imap::Backup
112
118
  def modify_backup_path(menu)
113
119
  menu.choice("modify backup path") do
114
120
  existing = account.local_path.clone
115
- account.local_path = Configuration::Asker.backup_path(
121
+ account.local_path = Setup::Asker.backup_path(
116
122
  account.local_path, ->(path) { path_modification_validator(path) }
117
123
  )
118
124
  end
@@ -120,13 +126,13 @@ module Imap::Backup
120
126
 
121
127
  def choose_folders(menu)
122
128
  menu.choice("choose backup folders") do
123
- Configuration::FolderChooser.new(account).run
129
+ Setup::FolderChooser.new(account).run
124
130
  end
125
131
  end
126
132
 
127
133
  def test_connection(menu)
128
134
  menu.choice("test connection") do
129
- result = Configuration::ConnectionTester.test(account)
135
+ result = Setup::ConnectionTester.new(account).test
130
136
  Kernel.puts result
131
137
  highline.ask "Press a key "
132
138
  end
@@ -163,5 +169,9 @@ module Imap::Backup
163
169
 
164
170
  provider.host
165
171
  end
172
+
173
+ def helpers
174
+ Setup::Helpers.new
175
+ end
166
176
  end
167
177
  end
@@ -1,7 +1,7 @@
1
1
  module Imap::Backup
2
- module Configuration; end
2
+ class Setup; end
3
3
 
4
- Configuration::Asker = Struct.new(:highline) do
4
+ Setup::Asker = Struct.new(:highline) do
5
5
  EMAIL_MATCHER = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$/i.freeze
6
6
 
7
7
  def initialize(highline)
@@ -40,15 +40,15 @@ module Imap::Backup
40
40
  end
41
41
 
42
42
  def self.email(default = "")
43
- new(Configuration::Setup.highline).email(default)
43
+ new(Setup.highline).email(default)
44
44
  end
45
45
 
46
46
  def self.password
47
- new(Configuration::Setup.highline).password
47
+ new(Setup.highline).password
48
48
  end
49
49
 
50
50
  def self.backup_path(default, validator)
51
- new(Configuration::Setup.highline).backup_path(default, validator)
51
+ new(Setup.highline).backup_path(default, validator)
52
52
  end
53
53
  end
54
54
  end
@@ -0,0 +1,26 @@
1
+ module Imap::Backup
2
+ class Setup; end
3
+
4
+ class Setup::ConnectionTester
5
+ attr_reader :account
6
+
7
+ def initialize(account)
8
+ @account = account
9
+ end
10
+
11
+ def test
12
+ connection.client
13
+ "Connection successful"
14
+ rescue Net::IMAP::NoResponseError
15
+ "No response"
16
+ rescue StandardError => e
17
+ "Unexpected error: #{e}"
18
+ end
19
+
20
+ private
21
+
22
+ def connection
23
+ Account::Connection.new(account)
24
+ end
25
+ end
26
+ end
@@ -1,7 +1,9 @@
1
+ require "imap/backup/setup/helpers"
2
+
1
3
  module Imap::Backup
2
- module Configuration; end
4
+ class Setup; end
3
5
 
4
- class Configuration::FolderChooser
6
+ class Setup::FolderChooser
5
7
  attr_reader :account
6
8
 
7
9
  def initialize(account)
@@ -10,13 +12,13 @@ module Imap::Backup
10
12
 
11
13
  def run
12
14
  if connection.nil?
13
- Imap::Backup.logger.warn "Connection failed"
15
+ Imap::Backup::Logger.logger.warn "Connection failed"
14
16
  highline.ask "Press a key "
15
17
  return
16
18
  end
17
19
 
18
20
  if imap_folders.nil?
19
- Imap::Backup.logger.warn "Unable to get folder list"
21
+ Imap::Backup::Logger.logger.warn "Unable to get folder list"
20
22
  highline.ask "Press a key "
21
23
  return
22
24
  end
@@ -35,10 +37,14 @@ module Imap::Backup
35
37
 
36
38
  def show_menu
37
39
  highline.choose do |menu|
38
- menu.header = "Add/remove folders"
40
+ menu.header = <<~MENU.chomp
41
+ #{helpers.title_prefix} Add/remove folders
42
+
43
+ Select a folder (toggles)
44
+ MENU
39
45
  menu.index = :number
40
46
  add_folders menu
41
- menu.choice("return to the account menu") { throw :done }
47
+ menu.choice("(q) return to the account menu") { throw :done }
42
48
  menu.hidden("quit") { throw :done }
43
49
  end
44
50
  end
@@ -99,11 +105,15 @@ module Imap::Backup
99
105
  end
100
106
 
101
107
  def imap_folders
102
- @imap_folders ||= connection.folders
108
+ @imap_folders ||= connection.folder_names
103
109
  end
104
110
 
105
111
  def highline
106
- Configuration::Setup.highline
112
+ Setup.highline
113
+ end
114
+
115
+ def helpers
116
+ Setup::Helpers.new
107
117
  end
108
118
  end
109
119
  end
@@ -0,0 +1,15 @@
1
+ require "imap/backup/version"
2
+
3
+ module Imap::Backup
4
+ class Setup; end
5
+
6
+ class Setup::Helpers
7
+ def title_prefix
8
+ "imap-backup –"
9
+ end
10
+
11
+ def version
12
+ Version::VERSION
13
+ end
14
+ end
15
+ end
@@ -1,18 +1,16 @@
1
1
  require "highline"
2
2
 
3
3
  require "imap/backup/account"
4
+ require "imap/backup/setup/helpers"
4
5
 
5
6
  module Imap::Backup
6
- module Configuration; end
7
-
8
- class Configuration::Setup
7
+ class Setup
9
8
  class << self
10
9
  attr_accessor :highline
11
10
  end
12
11
  self.highline = HighLine.new
13
12
 
14
13
  def run
15
- Imap::Backup.setup_logging config
16
14
  catch :done do
17
15
  loop do
18
16
  Kernel.system("clear")
@@ -25,16 +23,22 @@ module Imap::Backup
25
23
 
26
24
  def show_menu
27
25
  self.class.highline.choose do |menu|
28
- menu.header = "Choose an action"
26
+ menu.header = <<~MENU.chomp
27
+ #{helpers.title_prefix} Main Menu
28
+
29
+ Choose an action
30
+ MENU
29
31
  account_items menu
30
32
  add_account_item menu
31
33
  toggle_logging_item menu
32
- menu.choice("save and exit") do
33
- config.save
34
- throw :done
35
- end
36
- menu.choice("exit without saving changes") do
37
- throw :done
34
+ if config.modified?
35
+ menu.choice("save and exit") do
36
+ config.save
37
+ throw :done
38
+ end
39
+ menu.choice("exit without saving changes") { throw :done }
40
+ else
41
+ menu.choice("quit") { throw :done }
38
42
  end
39
43
  end
40
44
  end
@@ -53,7 +57,7 @@ module Imap::Backup
53
57
 
54
58
  def add_account_item(menu)
55
59
  menu.choice("add account") do
56
- username = Configuration::Asker.email
60
+ username = Asker.email
57
61
  edit_account username
58
62
  end
59
63
  end
@@ -63,12 +67,12 @@ module Imap::Backup
63
67
  new_setting = !config.debug?
64
68
  menu.choice(menu_item) do
65
69
  config.debug = new_setting
66
- Imap::Backup.setup_logging config
70
+ Imap::Backup::Logger.setup_logging(config)
67
71
  end
68
72
  end
69
73
 
70
74
  def config
71
- @config ||= Configuration::Store.new
75
+ @config ||= Configuration.new
72
76
  end
73
77
 
74
78
  def default_account_config(username)
@@ -89,9 +93,11 @@ module Imap::Backup
89
93
  account = default_account_config(username)
90
94
  config.accounts << account
91
95
  end
92
- Configuration::Account.new(
93
- config, account, Configuration::Setup.highline
94
- ).run
96
+ Account.new(config, account, Setup.highline).run
97
+ end
98
+
99
+ def helpers
100
+ Helpers.new
95
101
  end
96
102
  end
97
103
  end
@@ -12,12 +12,12 @@ module Imap::Backup
12
12
  count = missing_uids.count
13
13
  return if count.zero?
14
14
 
15
- Imap::Backup.logger.debug "[#{folder.name}] #{count} to restore"
15
+ Imap::Backup::Logger.logger.debug "[#{folder.name}] #{count} to restore"
16
16
  serializer.each_message(missing_uids).with_index do |(uid, message), i|
17
17
  next if message.nil?
18
18
 
19
19
  log_prefix = "[#{folder.name}] uid: #{uid} (#{i + 1}/#{count}) -"
20
- Imap::Backup.logger.debug(
20
+ Imap::Backup::Logger.logger.debug(
21
21
  "#{log_prefix} #{message.supplied_body.size} bytes"
22
22
  )
23
23
 
@@ -2,8 +2,8 @@ module Imap; end
2
2
 
3
3
  module Imap::Backup
4
4
  MAJOR = 4
5
- MINOR = 0
6
- REVISION = 7
5
+ MINOR = 1
6
+ REVISION = 1
7
7
  PRE = nil
8
8
  VERSION = [MAJOR, MINOR, REVISION, PRE].compact.map(&:to_s).join(".")
9
9
  end
data/lib/imap/backup.rb CHANGED
@@ -3,46 +3,20 @@ module Imap; end
3
3
  require "imap/backup/utils"
4
4
  require "imap/backup/account/connection"
5
5
  require "imap/backup/account/folder"
6
- require "imap/backup/configuration/account"
7
- require "imap/backup/configuration/asker"
8
- require "imap/backup/configuration/connection_tester"
9
- require "imap/backup/configuration/folder_chooser"
10
- require "imap/backup/configuration/list"
11
- require "imap/backup/configuration/setup"
12
- require "imap/backup/configuration/store"
6
+ require "imap/backup/configuration"
13
7
  require "imap/backup/downloader"
8
+ require "imap/backup/logger"
14
9
  require "imap/backup/uploader"
15
10
  require "imap/backup/serializer"
16
11
  require "imap/backup/serializer/mbox"
12
+ require "imap/backup/setup"
13
+ require "imap/backup/setup/account"
14
+ require "imap/backup/setup/asker"
15
+ require "imap/backup/setup/connection_tester"
16
+ require "imap/backup/setup/folder_chooser"
17
17
  require "imap/backup/version"
18
18
  require "email/provider"
19
19
 
20
- require "logger"
21
-
22
20
  module Imap::Backup
23
21
  class ConfigurationNotFound < StandardError; end
24
-
25
- class Logger
26
- include Singleton
27
-
28
- attr_reader :logger
29
-
30
- def initialize
31
- @logger = ::Logger.new($stdout)
32
- $stdout.sync = true
33
- end
34
- end
35
-
36
- def self.logger
37
- Logger.instance.logger
38
- end
39
-
40
- def self.setup_logging(config)
41
- logger.level =
42
- if config.debug?
43
- ::Logger::Severity::DEBUG
44
- else
45
- ::Logger::Severity::ERROR
46
- end
47
- end
48
22
  end
@@ -5,7 +5,7 @@ module RetryOnError
5
5
  rescue *errors => e
6
6
  if tries < limit
7
7
  message = "#{e}, attempt #{tries} of #{limit}"
8
- Imap::Backup.logger.debug message
8
+ Imap::Backup::Logger.logger.debug message
9
9
  tries += 1
10
10
  retry
11
11
  end
@@ -58,6 +58,7 @@ RSpec.describe "backup", type: :feature, docker: true do
58
58
  email3
59
59
  original_folder_uid_validity
60
60
  connection.run_backup
61
+ connection.disconnect
61
62
  server_rename_folder folder, new_name
62
63
  end
63
64
  let(:renamed_folder) { "#{folder}.#{original_folder_uid_validity}" }
@@ -63,11 +63,14 @@ module EmailServerHelpers
63
63
  end
64
64
 
65
65
  def server_folders
66
- root_info = imap.list("", "")[0]
67
- root = root_info.name
68
66
  imap.list(root, "*")
69
67
  end
70
68
 
69
+ def root
70
+ root_info = imap.list("", "")[0]
71
+ root_info.name
72
+ end
73
+
71
74
  def server_create_folder(folder)
72
75
  imap.create(folder)
73
76
  imap.disconnect
@@ -2,7 +2,7 @@ module HighLineTestHelpers
2
2
  def prepare_highline
3
3
  @input = instance_double(IO, eof?: false, gets: "q\n")
4
4
  @output = StringIO.new
5
- Imap::Backup::Configuration::Setup.highline = HighLine.new(@input, @output)
5
+ Imap::Backup::Setup.highline = HighLine.new(@input, @output)
6
6
  [@input, @output]
7
7
  end
8
8
  end
@@ -1,7 +1,7 @@
1
1
  def silence_logging
2
2
  RSpec.configure do |config|
3
3
  config.before(:suite) do
4
- Imap::Backup.logger.level = Logger::UNKNOWN
4
+ Imap::Backup::Logger.logger.level = Logger::UNKNOWN
5
5
  end
6
6
  end
7
7
  end
@@ -5,6 +5,7 @@ describe Imap::Backup::Account::Connection do
5
5
  FOLDER_CONFIG = {name: BACKUP_FOLDER}.freeze
6
6
  FOLDER_NAME = "my_folder".freeze
7
7
  GMAIL_IMAP_SERVER = "imap.gmail.com".freeze
8
+ IMAP_FOLDER = "imap_folder".freeze
8
9
  LOCAL_PATH = "local_path".freeze
9
10
  LOCAL_UID = "local_uid".freeze
10
11
  PASSWORD = "secret".freeze
@@ -101,19 +102,23 @@ describe Imap::Backup::Account::Connection do
101
102
  end
102
103
  end
103
104
 
104
- describe "#folders" do
105
+ describe "#folder_names" do
105
106
  let(:imap_folders) do
106
- [BACKUP_FOLDER]
107
+ [IMAP_FOLDER]
107
108
  end
108
109
 
109
110
  it "returns the list of folders" do
110
- expect(subject.folders).to eq([BACKUP_FOLDER])
111
+ expect(subject.folder_names).to eq([IMAP_FOLDER])
111
112
  end
112
113
  end
113
114
 
114
115
  describe "#status" do
115
116
  let(:folder) do
116
- instance_double(Imap::Backup::Account::Folder, uids: [remote_uid])
117
+ instance_double(
118
+ Imap::Backup::Account::Folder,
119
+ uids: [remote_uid],
120
+ name: IMAP_FOLDER
121
+ )
117
122
  end
118
123
  let(:remote_uid) { "remote_uid" }
119
124
 
@@ -123,7 +128,7 @@ describe Imap::Backup::Account::Connection do
123
128
  end
124
129
 
125
130
  it "returns the names of folders" do
126
- expect(subject.status[0][:name]).to eq(BACKUP_FOLDER)
131
+ expect(subject.status[0][:name]).to eq(IMAP_FOLDER)
127
132
  end
128
133
 
129
134
  it "returns local message uids" do
@@ -139,7 +144,7 @@ describe Imap::Backup::Account::Connection do
139
144
  let(:folder) do
140
145
  instance_double(
141
146
  Imap::Backup::Account::Folder,
142
- name: "folder",
147
+ name: IMAP_FOLDER,
143
148
  exist?: exists,
144
149
  uid_validity: uid_validity
145
150
  )
@@ -150,11 +155,11 @@ describe Imap::Backup::Account::Connection do
150
155
 
151
156
  before do
152
157
  allow(Imap::Backup::Downloader).
153
- to receive(:new).with(folder, serializer) { downloader }
158
+ to receive(:new).with(folder, serializer, anything) { downloader }
154
159
  allow(Imap::Backup::Account::Folder).to receive(:new).
155
160
  with(subject, BACKUP_FOLDER) { folder }
156
161
  allow(Imap::Backup::Serializer::Mbox).to receive(:new).
157
- with(LOCAL_PATH, BACKUP_FOLDER) { serializer }
162
+ with(LOCAL_PATH, IMAP_FOLDER) { serializer }
158
163
  end
159
164
 
160
165
  context "with supplied config_folders" do
@@ -248,7 +253,7 @@ describe Imap::Backup::Account::Connection do
248
253
  Imap::Backup::Account::Folder,
249
254
  create: nil,
250
255
  uids: uids,
251
- name: FOLDER_NAME,
256
+ name: IMAP_FOLDER,
252
257
  uid_validity: uid_validity
253
258
  )
254
259
  end
@@ -0,0 +1,47 @@
1
+ require "imap/backup/cli/accounts"
2
+
3
+ describe Imap::Backup::CLI::Accounts do
4
+ subject { described_class.new }
5
+
6
+ let(:accounts) { [account1, account2] }
7
+ let(:account1) do
8
+ instance_double(
9
+ Imap::Backup::Account,
10
+ username: "a1@example.com"
11
+ )
12
+ end
13
+ let(:account2) do
14
+ instance_double(
15
+ Imap::Backup::Account,
16
+ username: "a2@example.com"
17
+ )
18
+ end
19
+ let(:store) do
20
+ instance_double(Imap::Backup::Configuration, accounts: accounts)
21
+ end
22
+ let(:exists) { true }
23
+
24
+ before do
25
+ allow(Imap::Backup::Configuration).to receive(:new) { store }
26
+ allow(Imap::Backup::Configuration).
27
+ to receive(:exist?) { exists }
28
+ end
29
+
30
+ describe "#each" do
31
+ specify "calls the block with each account" do
32
+ result = subject.map { |a| a }
33
+
34
+ expect(result).to eq(accounts)
35
+ end
36
+
37
+ context "when the configuration file is missing" do
38
+ let(:exists) { false }
39
+
40
+ it "fails" do
41
+ expect do
42
+ subject.each {}
43
+ end.to raise_error(Imap::Backup::ConfigurationNotFound, /not found/)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,6 +1,9 @@
1
1
  describe Imap::Backup::CLI::Local do
2
- let(:list) do
3
- instance_double(Imap::Backup::Configuration::List, accounts: [account])
2
+ let(:accounts) do
3
+ instance_double(
4
+ Imap::Backup::CLI::Accounts,
5
+ find: ->(&block) { [account].find { |a| block.call(a) } }
6
+ )
4
7
  end
5
8
  let(:account) do
6
9
  instance_double(
@@ -38,9 +41,10 @@ describe Imap::Backup::CLI::Local do
38
41
 
39
42
  before do
40
43
  allow(Kernel).to receive(:puts)
41
- allow(Imap::Backup::Configuration::List).to receive(:new) { list }
44
+ allow(Imap::Backup::CLI::Accounts).to receive(:new) { accounts }
42
45
  allow(Imap::Backup::Account::Connection).to receive(:new) { connection }
43
46
  allow(Mail).to receive(:new) { mail }
47
+ allow(accounts).to receive(:each).and_yield(account)
44
48
  end
45
49
 
46
50
  describe "accounts" do
@@ -1,16 +1,25 @@
1
1
  module Imap::Backup
2
2
  describe CLI::Utils do
3
- let(:list) do
4
- instance_double(Configuration::List, accounts: [account])
3
+ let(:accounts) do
4
+ instance_double(
5
+ CLI::Accounts,
6
+ find: ->(&block) { [account].find { |a| block.call(a) } }
7
+ )
5
8
  end
6
9
  let(:account) { instance_double(Account, username: email) }
7
10
  let(:connection) do
8
11
  instance_double(
9
12
  Account::Connection,
10
- local_folders: local_folders
13
+ account: account,
14
+ backup_folders: [folder]
15
+ )
16
+ end
17
+ let(:account) do
18
+ instance_double(
19
+ Account,
20
+ local_path: "path"
11
21
  )
12
22
  end
13
- let(:local_folders) { [[serializer, folder]] }
14
23
  let(:folder) do
15
24
  instance_double(
16
25
  Account::Folder,
@@ -31,8 +40,9 @@ module Imap::Backup
31
40
  let(:email) { "foo@example.com" }
32
41
 
33
42
  before do
34
- allow(Configuration::List).to receive(:new) { list }
43
+ allow(CLI::Accounts).to receive(:new) { accounts }
35
44
  allow(Account::Connection).to receive(:new) { connection }
45
+ allow(Serializer::Mbox).to receive(:new) { serializer }
36
46
  end
37
47
 
38
48
  describe "ignore_history" do