require_relative '../../../test_helper' require_relative '../../../../lib/docs' class ManifestTest < MiniTest::Spec let :doc do doc = Class.new Docs::Scraper doc.name = 'TestDoc' doc.options[:attribution] = 'foo' doc end let :store do Docs::NullStore.new end let :manifest do Docs::Manifest.new store, [doc] end describe "#store" do before do stub(manifest).as_json end it "stores a file" do mock(store).write.with_any_args manifest.store end describe "the file" do it "is named ::FILENAME" do mock(store).write Docs::Manifest::FILENAME, anything manifest.store end it "contains the manifest's JSON dump" do stub(manifest).to_json { 'json' } mock(store).write anything, 'json' manifest.store end end end describe "#as_json" do let :meta_path do 'meta_path' end before do stub(doc).meta_path { meta_path } end it "returns an array" do manifest = Docs::Manifest.new store, [] assert_instance_of Array, manifest.as_json end context "when the doc has a meta file" do before do stub(store).exist?(meta_path) { true } stub(store).read(meta_path) { '{"name":"Test", "db_size": 776533}' } end it "includes the doc's meta representation" do json = manifest.as_json assert_equal 1, json.length assert_equal "{\"name\"=>\"Test\", \"db_size\"=>776533, :attribution=>\"foo\"}", json[0].to_s end end context "when the doc doesn't have a meta file" do it "doesn't include the doc" do stub(store).exist?(meta_path) { false } assert_empty manifest.as_json end end end describe "#to_json" do it "returns the JSON string for #as_json" do stub(manifest).as_json { { test: 'ok' } } assert_equal "{\n \"test\": \"ok\"\n}", manifest.to_json end end end