diff --git a/.gitignore b/.gitignore index 9106b2a..ac51ff7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /pkg/ /spec/reports/ /tmp/ +file_cache_test.yaml diff --git a/lib/ruber/configuration.rb b/lib/ruber/configuration.rb index 768ec6e..c4661a7 100644 --- a/lib/ruber/configuration.rb +++ b/lib/ruber/configuration.rb @@ -1,13 +1,14 @@ # frozen_string_literal: true require_relative "configuration/null_cache" +require_relative "configuration/file_cache" module Ruber class Configuration - attr_accessor :customer_id, :client_id, :client_secret + attr_accessor :customer_id, :client_id, :client_secret, :file_cache_path def cache - @cache ||= NullCache.new + @cache ||= FileCache.new end def cache=(store) diff --git a/lib/ruber/configuration/file_cache.rb b/lib/ruber/configuration/file_cache.rb new file mode 100644 index 0000000..9de0a59 --- /dev/null +++ b/lib/ruber/configuration/file_cache.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "yaml/store" + +module Ruber + class FileCache + def initialize + raise "FileCache requires a file path" unless Ruber.configuration.file_cache_path + + @store = YAML::Store.new(Ruber.configuration.file_cache_path) + end + + def read(key) = @store.transaction { @store[key] } + def write(key, value) = @store.transaction { @store[key] = value } + + def clear + File.delete(Ruber.configuration.file_cache_path) if File.exist?(Ruber.configuration.file_cache_path) + end + + def delete(key) = @store.transaction { @store.delete(key) } + end +end diff --git a/test/ruber/authenticator_test.rb b/test/ruber/authenticator_test.rb index a330617..a4730ef 100644 --- a/test/ruber/authenticator_test.rb +++ b/test/ruber/authenticator_test.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "test_helper" +require File.expand_path("../test_helper", __dir__) require "webmock/minitest" module Ruber diff --git a/test/ruber/configuration/file_cache_test.rb b/test/ruber/configuration/file_cache_test.rb new file mode 100644 index 0000000..2c5e0b2 --- /dev/null +++ b/test/ruber/configuration/file_cache_test.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require File.expand_path("../../test_helper", __dir__) +require "yaml/store" +require "fileutils" + +module Ruber + class FileCacheTest < Minitest::Test + def setup + File.delete(Ruber.configuration.file_cache_path) if File.exist?(Ruber.configuration.file_cache_path) + + @cache = FileCache.new + end + + def teardown + @cache.clear + end + + def test_initialize_raises_error_if_no_file_path + Ruber.configuration.stub :file_cache_path, nil do + assert_raises(RuntimeError, "FileCache requires a file path") do + FileCache.new + end + end + end + + def test_write_and_read + @cache.write("foo", "bar") + assert_equal "bar", @cache.read("foo") + end + + def test_write_and_read_complex_object + @cache.write("foo", { foo: "bar", bar: "baz" }) + assert_equal "bar", @cache.read("foo")[:foo] + assert_equal "baz", @cache.read("foo")[:bar] + end + + def test_delete + @cache.write("key", "value") + @cache.delete("key") + assert_nil @cache.read("key") + end + + def test_clear + @cache.write("key1", "value1") + @cache.write("key2", "value2") + + @cache.clear + assert_nil @cache.read("key1") + assert_nil @cache.read("key2") + end + + def test_clear_and_write_again + @cache.write("key1", "value1") + @cache.write("key2", "value1") + @cache.clear + @cache.write("key1", "value2") + + assert "value2", @cache.read("key1") + assert_nil @cache.read("key2") + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 312aa10..f4149ef 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,16 @@ # frozen_string_literal: true $LOAD_PATH.unshift File.expand_path("../lib", __dir__) -require "ruber" require "minitest/autorun" require "webmock/minitest" + +require "ruber" + +class Minitest::Test # rubocop:disable Style/ClassAndModuleChildren + def before_setup + super + + Ruber.configuration.file_cache_path = "file_cache_test.yaml" + end +end