/* Copyright (C) 2017 Cloudbase Solutions SRL This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import React from "react"; import { shallow } from "enzyme"; import sinon from "sinon"; import TW from "@src/utils/TestWrapper"; import ReplicaDetailsContent from "."; const wrap = props => new TW(shallow(), "rdContent"); const endpoints = [ { id: "endpoint-1", name: "Endpoint OPS", type: "openstack" }, { id: "endpoint-2", name: "Endpoint AZURE", type: "azure" }, ]; const item = { origin_endpoint_id: "endpoint-1", destination_endpoint_id: "endpoint-2", id: "item-id", created_at: new Date(2017, 10, 24, 16, 15), destination_environment: { description: "A description" }, type: "Replica", executions: [ { id: "execution-1", status: "ERROR", created_at: new Date() }, { id: "execution-2", status: "COMPLETED", created_at: new Date() }, { id: "execution-2-1", status: "CANCELED", created_at: new Date() }, { id: "execution-3", status: "RUNNING", created_at: new Date() }, ], }; describe("ReplicaDetailsContent Component", () => { it("renders main details page", () => { const wrapper = wrap({ endpoints, item, page: "" }); expect(wrapper.find("mainDetails").prop("item").id).toBe("item-id"); }); it("renders executions page", () => { const wrapper = wrap({ endpoints, item, page: "executions" }); expect(wrapper.find("executions").prop("item").executions[1].id).toBe( "execution-2" ); }); it("renders details loading", () => { const wrapper = wrap({ endpoints, item, page: "", detailsLoading: true }); expect(wrapper.find("mainDetails").prop("loading")).toBe(true); }); it("renders schedule page", () => { const wrapper = wrap({ endpoints, item, page: "schedule", scheduleStore: { schedules: [] }, }); expect(wrapper.find("schedule").prop("schedules").length).toBe(0); }); it("has `Create migration` button disabled if endpoint is missing", () => { const wrapper = wrap({ endpoints, item: null, page: "" }); const bottomControls = new TW( shallow(wrapper.find("mainDetails").prop("bottomControls")), "rdContent" ); expect(bottomControls.find("createButton").prop("disabled")).toBe(true); }); it("has `Create migration` button enabled if the last status is completed", () => { const newItem = { ...item, executions: [ ...item.executions, { id: "execution-4", status: "COMPLETED", created_at: new Date() }, ], }; const wrapper = wrap({ endpoints, item: newItem, page: "" }); const bottomControls = new TW( shallow(wrapper.find("mainDetails").prop("bottomControls")), "rdContent" ); expect(bottomControls.find("createButton").prop("disabled")).toBe(false); }); it("dispaches create migration click", () => { const onCreateMigrationClick = sinon.spy(); const wrapper = wrap({ endpoints, item, page: "", onCreateMigrationClick }); const bottomControls = new TW( shallow(wrapper.find("mainDetails").prop("bottomControls")), "rdContent" ); bottomControls.find("createButton").click(); expect(onCreateMigrationClick.calledOnce).toBe(true); }); it("has `Create migration` button disabled if endpoint is missing and last status is completed", () => { const newItem = { ...item, origin_endpoint_id: "missing", executions: [ ...item.executions, { id: "execution-4", status: "COMPLETED", created_at: new Date() }, ], }; const wrapper = wrap({ endpoints, item: newItem, page: "" }); const bottomControls = new TW( shallow(wrapper.find("mainDetails").prop("bottomControls")), "rdContent" ); expect(bottomControls.find("createButton").prop("disabled")).toBe(true); }); it("dispatches delete click", () => { const onDeleteReplicaClick = sinon.spy(); const wrapper = wrap({ endpoints, item, page: "", onDeleteReplicaClick }); const bottomControls = new TW( shallow(wrapper.find("mainDetails").prop("bottomControls")), "rdContent" ); bottomControls.find("deleteButton").click(); expect(onDeleteReplicaClick.calledOnce).toBe(true); }); });