From b8b28e8c51606a7a606cb66a048b13ac7bd2d2fd Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Fri, 6 Jun 2014 08:59:42 -0700 Subject: [PATCH 1/2] Extract OSX::Database and test it --- lib/desktop.rb | 3 ++- lib/desktop/osx/database.rb | 36 ++++++++++++++++++++++++++++++ lib/desktop/{ => osx}/osx.rb | 11 +++------ test/desktop/osx/database_test.rb | 28 +++++++++++++++++++++++ test/desktop/{ => osx}/osx_test.rb | 2 +- 5 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 lib/desktop/osx/database.rb rename lib/desktop/{ => osx}/osx.rb (86%) create mode 100644 test/desktop/osx/database_test.rb rename test/desktop/{ => osx}/osx_test.rb (97%) diff --git a/lib/desktop.rb b/lib/desktop.rb index fa0af10..427b3a6 100644 --- a/lib/desktop.rb +++ b/lib/desktop.rb @@ -1,5 +1,6 @@ require 'desktop/cli' require 'desktop/local_image' -require 'desktop/osx' require 'desktop/version' require 'desktop/web_image' + +require 'desktop/osx/osx' diff --git a/lib/desktop/osx/database.rb b/lib/desktop/osx/database.rb new file mode 100644 index 0000000..053f131 --- /dev/null +++ b/lib/desktop/osx/database.rb @@ -0,0 +1,36 @@ +require 'sqlite3' + +module Desktop + class OSX + class Database + attr_reader :connection + + def initialize(connection = nil) + @connection = connection || default_connection + end + + def clear_desktop_image + clear_data + end + + def close + connection.close + end + + private + + def clear_data + connection.execute 'DELETE FROM data' + connection.execute 'VACUUM data' + end + + def default_connection + SQLite3::Database.new path + end + + def path + File.expand_path '~/Library/Application Support/Dock/desktoppicture.db' + end + end + end +end diff --git a/lib/desktop/osx.rb b/lib/desktop/osx/osx.rb similarity index 86% rename from lib/desktop/osx.rb rename to lib/desktop/osx/osx.rb index b9598ba..cd4116a 100644 --- a/lib/desktop/osx.rb +++ b/lib/desktop/osx/osx.rb @@ -1,4 +1,4 @@ -require 'sqlite3' +require 'desktop/osx/database' module Desktop class OSX @@ -58,9 +58,8 @@ def write_default_desktop(image) end def clear_custom_desktop_image - db = SQLite3::Database.new(desktop_image_db_path) - db.execute 'DELETE FROM data' - db.execute 'VACUUM data' + db = Database.new + db.clear_desktop_image db.close end @@ -71,9 +70,5 @@ def reload_desktop def default_desktop_image_path '/System/Library/CoreServices/DefaultDesktop.jpg' end - - def desktop_image_db_path - File.expand_path '~/Library/Application Support/Dock/desktoppicture.db' - end end end diff --git a/test/desktop/osx/database_test.rb b/test/desktop/osx/database_test.rb new file mode 100644 index 0000000..56fc61d --- /dev/null +++ b/test/desktop/osx/database_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' +require 'desktop/osx/database' + +module Desktop + describe OSX::Database do + def with_connection + connection = SQLite3::Database.new ':memory:' + yield connection + ensure + connection.close + end + + describe '#clear_desktop_image' do + it 'clears contents of data table' do + with_connection do |connection| + connection.execute("CREATE TABLE data (FileName STRING)") + connection.execute("INSERT INTO data VALUES ('mydesktop.png')") + + refute_empty connection.execute("SELECT * FROM data") + + OSX::Database.new(connection).clear_desktop_image + + assert_empty connection.execute("SELECT * FROM data") + end + end + end + end +end diff --git a/test/desktop/osx_test.rb b/test/desktop/osx/osx_test.rb similarity index 97% rename from test/desktop/osx_test.rb rename to test/desktop/osx/osx_test.rb index afe9a79..ff069c1 100644 --- a/test/desktop/osx_test.rb +++ b/test/desktop/osx/osx_test.rb @@ -1,5 +1,5 @@ require 'test_helper' -require 'desktop/osx' +require 'desktop/osx/osx' require 'desktop/local_image' module Desktop From d2957c0592c511e90fa8a72e593362a086738df4 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Fri, 6 Jun 2014 09:00:16 -0700 Subject: [PATCH 2/2] Don't blow up if data table is missing in OSX db --- lib/desktop/osx/database.rb | 8 +++++++- test/desktop/osx/database_test.rb | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/desktop/osx/database.rb b/lib/desktop/osx/database.rb index 053f131..80fdf54 100644 --- a/lib/desktop/osx/database.rb +++ b/lib/desktop/osx/database.rb @@ -10,7 +10,7 @@ def initialize(connection = nil) end def clear_desktop_image - clear_data + clear_data if data? end def close @@ -19,6 +19,12 @@ def close private + def data? + connection.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='data'" + ).any? + end + def clear_data connection.execute 'DELETE FROM data' connection.execute 'VACUUM data' diff --git a/test/desktop/osx/database_test.rb b/test/desktop/osx/database_test.rb index 56fc61d..ec5d475 100644 --- a/test/desktop/osx/database_test.rb +++ b/test/desktop/osx/database_test.rb @@ -23,6 +23,16 @@ def with_connection assert_empty connection.execute("SELECT * FROM data") end end + + it 'does not blow up if data table does not exist' do + with_connection do |connection| + assert_empty connection.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='data'" + ) + + OSX::Database.new(connection).clear_desktop_image + end + end end end end