UNPKG

opds-web-client

Version:
212 lines (211 loc) 11.2 kB
"use strict"; var chai_1 = require("chai"); var sinon_1 = require("sinon"); var React = require("react"); var moment = require("moment"); var enzyme_1 = require("enzyme"); var BookDetails_1 = require("../BookDetails"); var BookCover_1 = require("../BookCover"); var BorrowButton_1 = require("../BorrowButton"); var DownloadButton_1 = require("../DownloadButton"); var book = { id: "urn:librarysimplified.org/terms/id/3M%20ID/crrmnr9", url: "http://circulation.librarysimplified.org/works/3M/crrmnr9", title: "The Mayan Secrets", authors: ["Clive Cussler", "Thomas Perry"], contributors: ["contributor 1"], summary: "<b>Sam and Remi Fargo race for treasure—and survival—in this lightning-paced new adventure from #1<i> New York Times</i> bestselling author Clive Cussler.</b><br /><br />Husband-and-wife team Sam and Remi Fargo are in Mexico when they come upon a remarkable discovery—the mummified remainsof a man clutching an ancient sealed pot. Within the pot is a Mayan book larger than any known before.<br /><br />The book contains astonishing information about the Mayans, their cities, and about mankind itself. The secrets are so powerful that some people would do anything to possess them—as the Fargos are about to find out. Many men and women are going to die for that book.", imageUrl: "https://dlotdqc6pnwqb.cloudfront.net/3M/crrmnr9/cover.jpg", openAccessLinks: [{ url: "secrets.epub", type: "application/epub+zip" }], borrowUrl: "borrow url", publisher: "Penguin Publishing Group", published: "February 29, 2016", categories: ["category 1", "category 2"], series: { name: "Fake Series" }, language: "de" }; describe("BookDetails", function () { var wrapper; beforeEach(function () { wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: book, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); }); it("shows cover", function () { var cover = wrapper.find(BookCover_1.default); chai_1.expect(cover.props().book).to.equal(book); }); it("shows title", function () { var title = wrapper.find(".title"); chai_1.expect(title.text()).to.equal(book.title); }); it("shows series", function () { var series = wrapper.find(".series"); chai_1.expect(series.text()).to.equal(book.series.name); }); it("shows authors", function () { var author = wrapper.find(".authors"); chai_1.expect(author.text()).to.equal(book.authors.join(", ")); }); it("shows contributors", function () { var contributor = wrapper.find(".contributors"); chai_1.expect(contributor.text()).to.equal("Contributors: " + book.contributors.join(", ")); }); it("shows publisher", function () { var publisher = wrapper.find(".publisher"); chai_1.expect(publisher.text()).to.equal("Publisher: " + book.publisher); }); it("doesn't show publisher when there isn't one", function () { var bookCopy = Object.assign({}, book, { publisher: null }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var publisher = wrapper.find(".publisher"); chai_1.expect(publisher.length).to.equal(0); }); it("shows publish date", function () { var published = wrapper.find(".published"); chai_1.expect(published.text()).to.equal("Published: " + book.published); }); it("shows categories", function () { var categories = wrapper.find(".categories"); chai_1.expect(categories.text()).to.equal("Categories: category 1, category 2"); }); it("doesn't show categories when there aren't any", function () { var bookCopy = Object.assign({}, book, { categories: [] }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var categories = wrapper.find(".categories"); chai_1.expect(categories.length).to.equal(0); }); it("has book's language as overall language for the top details", function () { var top = wrapper.find(".book-details > .top"); chai_1.expect(top.props().lang).to.equal("de"); }); it("has english as the language for the fields", function () { var fields = wrapper.find(".fields"); chai_1.expect(fields.props().lang).to.equal("en"); }); it("shows summary, in book's language", function () { var summary = wrapper.find(".summary"); chai_1.expect(summary.html()).to.contain("Sam and Remi"); chai_1.expect(summary.props().lang).to.equal("de"); }); it("shows download button for open access url", function () { var button = wrapper.find(DownloadButton_1.default); chai_1.expect(button.props().url).to.equal("secrets.epub"); chai_1.expect(button.props().mimeType).to.equal("application/epub+zip"); chai_1.expect(button.props().isPlainLink).to.equal(true); }); it("shows borrow/hold button", function () { var bookCopy = Object.assign({}, book, { borrowUrl: "borrow url" }); var updateBook = sinon_1.stub(); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: updateBook, fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var button = wrapper.find(BorrowButton_1.default); chai_1.expect(button.children().text()).to.equal("Get"); button.props().borrow(); chai_1.expect(updateBook.callCount).to.equal(1); chai_1.expect(updateBook.args[0][0]).to.equal(bookCopy.borrowUrl); wrapper.setProps({ book: Object.assign({}, bookCopy, { copies: { total: 2, available: 0 } }) }); button = wrapper.find(BorrowButton_1.default); chai_1.expect(button.children().text()).to.equal("Reserve"); }); it("shows fulfill button if there's no download button", function () { var link = { url: "fulfillment url", type: "application/vnd.adobe.adept+xml" }; var bookCopy = Object.assign({}, book, { openAccessLinks: [], fulfillmentLinks: [link] }); var fulfillBook = sinon_1.stub(); var indirectFulfillBook = sinon_1.stub(); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: fulfillBook, indirectFulfillBook: indirectFulfillBook, isSignedIn: false })); var button = wrapper.find(DownloadButton_1.default); chai_1.expect(button.props().fulfill).to.equal(fulfillBook); chai_1.expect(button.props().indirectFulfill).to.equal(indirectFulfillBook); chai_1.expect(button.props().url).to.equal(link.url); chai_1.expect(button.props().title).to.equal(bookCopy.title); chai_1.expect(button.props().mimeType).to.equal(link.type); chai_1.expect(button.props().isPlainLink).to.equal(true); }); it("shows 'on hold'", function () { var bookCopy = Object.assign({}, book, { openAccessLinks: [], availability: { status: "reserved" } }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var button = wrapper.find("button"); chai_1.expect(button.text()).to.equal("Reserved"); chai_1.expect(button.props().className).to.contain("disabled"); }); it("shows holds when there are no copies available", function () { var bookCopy = Object.assign({}, book, { openAccessLinks: [], copies: { available: 0, total: 12 }, holds: { total: 6 } }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var circulationInfo = wrapper.find(".circulation-info"); chai_1.expect(circulationInfo.text()).to.contain("0 of 12 copies available"); chai_1.expect(circulationInfo.text()).to.contain("6 patrons in hold queue"); }); it("doesn't show holds when there are copies available", function () { var bookCopy = Object.assign({}, book, { openAccessLinks: [], copies: { available: 5, total: 12 }, holds: { total: 6 } }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var circulationInfo = wrapper.find(".circulation-info"); chai_1.expect(circulationInfo.text()).to.contain("5 of 12 copies available"); chai_1.expect(circulationInfo.text()).not.to.contain("6"); }); it("shows circulation info for open access book", function () { var circulationInfo = wrapper.find(".circulation-info"); chai_1.expect(circulationInfo.text()).to.contain("open-access"); }); it("shows circulation info for borrowed book", function () { var tomorrow = moment().add(1, "day").format(); var bookCopy = Object.assign({}, book, { openAccessLinks: [], fulfillmentLinks: ["http://fulfill"], availability: { status: "available", until: tomorrow } }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var circulationInfo = wrapper.find(".circulation-info"); chai_1.expect(circulationInfo.text()).to.contain("on loan for a day"); }); it("shows circulation info for reserved book", function () { var bookCopy = Object.assign({}, book, { openAccessLinks: [], availability: { status: "reserved" }, copies: { available: 0, total: 12 }, holds: { total: 6, position: 3 } }); wrapper = enzyme_1.shallow(React.createElement(BookDetails_1.default, { book: bookCopy, updateBook: sinon_1.stub(), fulfillBook: sinon_1.stub(), indirectFulfillBook: sinon_1.stub() })); var circulationInfo = wrapper.find(".circulation-info"); chai_1.expect(circulationInfo.text()).to.contain("0 of 12 copies available"); chai_1.expect(circulationInfo.text()).to.contain("6 patrons in hold queue"); chai_1.expect(circulationInfo.text()).to.contain("Your holds position: 3"); }); });