| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  | require "cache_store" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe CacheStoreDatabase do | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |   subject { described_class.new(:sample) } | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "self.use" do | 
					
						
							|  |  |  |     let(:type) { :test } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 15:31:58 -04:00
										 |  |  |     it "creates a new `DatabaseCache` instance" do | 
					
						
							| 
									
										
										
										
											2020-09-11 12:56:15 +01:00
										 |  |  |       cache_store = double("cache_store", write_if_dirty!: nil) | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       expect(described_class).to receive(:new).with(type).and_return(cache_store) | 
					
						
							| 
									
										
										
										
											2020-09-11 12:56:15 +01:00
										 |  |  |       expect(cache_store).to receive(:write_if_dirty!) | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       described_class.use(type) { |_db| } | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#set" do | 
					
						
							|  |  |  |     let(:db) { double("db", :[]= => nil) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |     it "sets the value in the `CacheStoreDatabase`" do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       allow(File).to receive(:write) | 
					
						
							|  |  |  |       allow(subject).to receive(:created?).and_return(true) | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |       allow(subject).to receive(:db).and_return(db) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |       expect(db).to receive(:has_key?).with(:foo).and_return(false) | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       expect(db).not_to have_key(:foo) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       subject.set(:foo, "bar") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#get" do | 
					
						
							|  |  |  |     context "database created" do | 
					
						
							|  |  |  |       let(:db) { double("db", :[] => "bar") } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |       it "gets value in the `CacheStoreDatabase` corresponding to the key" do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         allow(subject).to receive(:created?).and_return(true) | 
					
						
							|  |  |  |         expect(db).to receive(:has_key?).with(:foo).and_return(true) | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |         allow(subject).to receive(:db).and_return(db) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         expect(db).to have_key(:foo) | 
					
						
							| 
									
										
										
										
											2018-05-22 15:31:58 -04:00
										 |  |  |         expect(subject.get(:foo)).to eq("bar") | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "database not created" do | 
					
						
							|  |  |  |       let(:db) { double("db", :[] => nil) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         allow(subject).to receive(:created?).and_return(false) | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |         allow(subject).to receive(:db).and_return(db) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "does not get value in the `CacheStoreDatabase` corresponding to key" do | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |         expect(subject.get(:foo)).not_to be("bar") | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "does not call `db[]` if `CacheStoreDatabase.created?` is `false`" do | 
					
						
							|  |  |  |         expect(db).not_to receive(:[]) | 
					
						
							|  |  |  |         subject.get(:foo) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#delete" do | 
					
						
							|  |  |  |     context "database created" do | 
					
						
							|  |  |  |       let(:db) { double("db", :[] => { foo: "bar" }) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         allow(subject).to receive(:created?).and_return(true) | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |         allow(subject).to receive(:db).and_return(db) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "deletes value in the `CacheStoreDatabase` corresponding to the key" do | 
					
						
							|  |  |  |         expect(db).to receive(:delete).with(:foo) | 
					
						
							|  |  |  |         subject.delete(:foo) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "database not created" do | 
					
						
							|  |  |  |       let(:db) { double("db", delete: nil) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         allow(subject).to receive(:created?).and_return(false) | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |         allow(subject).to receive(:db).and_return(db) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "does not call `db.delete` if `CacheStoreDatabase.created?` is `false`" do | 
					
						
							|  |  |  |         expect(db).not_to receive(:delete) | 
					
						
							|  |  |  |         subject.delete(:foo) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-11 12:56:15 +01:00
										 |  |  |   describe "#write_if_dirty!" do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |     context "database open" do | 
					
						
							|  |  |  |       it "does not raise an error when `close` is called on the database" do | 
					
						
							| 
									
										
										
										
											2020-09-11 12:56:15 +01:00
										 |  |  |         expect { subject.write_if_dirty! }.not_to raise_error(NoMethodError) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "database not open" do | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |         subject.instance_variable_set(:@db, nil) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "does not raise an error when `close` is called on the database" do | 
					
						
							| 
									
										
										
										
											2020-09-11 12:56:15 +01:00
										 |  |  |         expect { subject.write_if_dirty! }.not_to raise_error(NoMethodError) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#created?" do | 
					
						
							| 
									
										
										
										
											2018-09-25 20:19:30 +01:00
										 |  |  |     let(:cache_path) { Pathname("path/to/homebrew/cache/sample.json") } | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |     before do | 
					
						
							| 
									
										
										
										
											2018-05-25 23:19:13 +02:00
										 |  |  |       allow(subject).to receive(:cache_path).and_return(cache_path) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 14:36:38 +01:00
										 |  |  |     context "`cache_path.exist?` returns `true`" do | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-09-20 13:40:38 +01:00
										 |  |  |         allow(cache_path).to receive(:exist?).and_return(true) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns `true`" do | 
					
						
							|  |  |  |         expect(subject.created?).to be(true) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 14:36:38 +01:00
										 |  |  |     context "`cache_path.exist?` returns `false`" do | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |       before do | 
					
						
							| 
									
										
										
										
											2018-09-20 13:40:38 +01:00
										 |  |  |         allow(cache_path).to receive(:exist?).and_return(false) | 
					
						
							| 
									
										
										
										
											2018-05-22 14:15:36 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns `false`" do | 
					
						
							|  |  |  |         expect(subject.created?).to be(false) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |