Skip to content

Commit

Permalink
Merge pull request #64 from lahsivjar/issue-56
Browse files Browse the repository at this point in the history
refs #56 Improve test coverage.
  • Loading branch information
lahsivjar committed Sep 18, 2018
2 parents 4dcdd9e + 184c834 commit f586d63
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 114 deletions.
13 changes: 7 additions & 6 deletions src/client.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ class SockJsClient extends React.Component {
headers: {},
subscribeHeaders: {},
autoReconnect: true,
debug: false
debug: false,
heartbeat: 10000
}

static propTypes = {
Expand Down Expand Up @@ -78,10 +79,10 @@ class SockJsClient extends React.Component {
_initStompClient = () => {
// Websocket held by stompjs can be opened only once
this.client = Stomp.over(new SockJS(this.props.url, null, this.props.options));
if (this.props.heartbeat) {
this.client.heartbeat.outgoing = this.props.heartbeat;
this.client.heartbeat.incoming = this.props.heartbeat;
}

this.client.heartbeat.outgoing = this.props.heartbeat;
this.client.heartbeat.incoming = this.props.heartbeat;

if (Object.keys(this.props).includes("heartbeatIncoming")) {
this.client.heartbeat.incoming = this.props.heartbeatIncoming;
}
Expand Down Expand Up @@ -163,7 +164,7 @@ class SockJsClient extends React.Component {
if (this.state.connected) {
this.client.send(topic, opt_headers, msg);
} else {
console.error("Send error: SockJsClient is disconnected");
throw new Error("Send error: SockJsClient is disconnected");
}
}
}
Expand Down
58 changes: 27 additions & 31 deletions test/e2e/connect.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,37 @@ import { mount, shallow } from "enzyme";
import { expect } from "chai";
import SockJsClient from "../../src/client.jsx";

describe("<SockJsClient />", () => {
describe("connect()", () => {
it("Websocket is connected", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/all"]} onMessage={(msg) => { console.log(msg); }} />);
describe("<SockJsClient /> -> connect", () => {
it("Websocket is connected", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/all"]} onMessage={(msg) => { console.log(msg); }} />);

setTimeout(() => {
expect(mountedComponent.state().connected).to.be.true;
mountedComponent.unmount();
done();
}, 500);
});
setTimeout(() => {
expect(mountedComponent.state().connected).to.be.true;
mountedComponent.unmount();
done();
}, 500);
});

describe("disconnect()", () => {
it("Websocket is disconnected", (done) => {
var clientRef = null;
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/all"]} ref={(client) => { clientRef = client; }}
onMessage={(msg) => { console.log(msg); }} />);
it("Websocket is disconnected", (done) => {
var clientRef = null;
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/all"]} ref={(client) => { clientRef = client; }}
onMessage={(msg) => { console.log(msg); }} />);

setTimeout(() => {
expect(mountedComponent.state().connected).to.be.true;
mountedComponent.instance().disconnect();
verifyDisconnect();
}, 500);
setTimeout(() => {
expect(mountedComponent.state().connected).to.be.true;
mountedComponent.instance().disconnect();
verifyDisconnect();
}, 500);

const verifyDisconnect = () => {
setTimeout(() => {
expect(mountedComponent.state().connected).to.be.false;
expect(mountedComponent.instance().subscriptions.size).to.equal(0);
mountedComponent.unmount();
done();
}, 100);
};
});
const verifyDisconnect = () => {
setTimeout(() => {
expect(mountedComponent.state().connected).to.be.false;
expect(mountedComponent.instance().subscriptions.size).to.equal(0);
mountedComponent.unmount();
done();
}, 100);
};
});
});
63 changes: 44 additions & 19 deletions test/e2e/send.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,54 @@ import { mount, shallow } from "enzyme";
import { expect } from "chai";
import SockJsClient from "../../src/client.jsx";

describe("<SockJsClient />", () => {
describe("sendMessage()", () => {
it("Ping and pong", (done) => {
const messageContainer = [];
const onMessageHandler = (msg) => {
messageContainer.push(msg);
};
describe("<SockJsClient /> -> sendMessage", () => {
it("Ping and pong", (done) => {
const messageContainer = [];
const onMessageHandler = (msg) => {
messageContainer.push(msg);
};

const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/ping"]} onMessage={ onMessageHandler } />);
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/ping"]} onMessage={ onMessageHandler } />);

setTimeout(() => {
mountedComponent.instance().sendMessage("/app/ping", "ping");
validateSend();
}, 500);

const validateSend = () => {
setTimeout(() => {
mountedComponent.instance().sendMessage("/app/ping", "ping");
validateSend();
expect(messageContainer).to.deep.include({ "msg": "pong" });
mountedComponent.unmount();
done();
}, 500);
};
});

it("Ping me and I pong you", (done) => {
const messageContainer = [];
const onMessageHandler = (msg) => {
messageContainer.push(msg);
};

const reciever = mount(<SockJsClient url="http://localhost:8089/handler"
topics={["/topic/ping"]} onMessage={ onMessageHandler } />);

const validateSend = () => {
setTimeout(() => {
expect(messageContainer).to.deep.include({ "msg": "pong" });
mountedComponent.unmount();
done();
}, 500);
};
});
const sender = mount(<SockJsClient url="http://localhost:8089/handler"
topics={[]} onMessage={ (msg) => { console.log(msg); } } />);

setTimeout(() => {
sender.instance().sendMessage("/app/ping", "ping");
validateSend();
}, 500);

const validateSend = () => {
setTimeout(() => {
expect(messageContainer).to.deep.include({ "msg": "pong" });
sender.unmount();
reciever.unmount();
done();
}, 500);
};
});
});
104 changes: 49 additions & 55 deletions test/e2e/subscribe.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,75 +3,69 @@ import { mount, shallow } from "enzyme";
import { expect } from "chai";
import SockJsClient from "../../src/client.jsx";

describe("<SockJsClient />", () => {
describe("subscribe()", () => {
it("Subscribe to topic", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ [] } onMessage={(msg) => { console.log(msg); }} />);
describe("<SockJsClient /> -> subscribe", () => {
it("Subscribe to topic", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ [] } onMessage={(msg) => { console.log(msg); }} />);

mountedComponent.setProps({ topics: ["/topic/all"] });
mountedComponent.setProps({ topics: ["/topic/all"] });

setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(1);
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
addSubscription();
}, 500);

const addSubscription = () => {
mountedComponent.setProps({ topics: ["/topic/all", "/topic/1"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(1);
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
addSubscription();
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
expect(mountedComponent.instance().subscriptions.has("/topic/1")).to.be.true;
mountedComponent.unmount();
done();
}, 500);

const addSubscription = () => {
mountedComponent.setProps({ topics: ["/topic/all", "/topic/1"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
expect(mountedComponent.instance().subscriptions.has("/topic/1")).to.be.true;
mountedComponent.unmount();
done();
}, 500);
};
});
};
});

describe("unsubscribe()", () => {
it("Unsubscribe from topic", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ ["/topic/all", "/topic/1"] } onMessage={(msg) => { console.log(msg); }} />);
it("Unsubscribe from topic", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ ["/topic/all", "/topic/1"] } onMessage={(msg) => { console.log(msg); }} />);

setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
removeSubscription();
}, 500);

const removeSubscription = () => {
mountedComponent.setProps({ topics: ["/topic/all"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
removeSubscription();
expect(mountedComponent.instance().subscriptions.size).to.equal(1);
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
mountedComponent.unmount();
done();
}, 500);

const removeSubscription = () => {
mountedComponent.setProps({ topics: ["/topic/all"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(1);
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
mountedComponent.unmount();
done();
}, 500);
};
});
};
});

describe("subscribe -> unsubscribe -> subscribe", () => {
it("Subscribe and unsubscibe together", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ ["/topic/all", "/topic/1"] } onMessage={(msg) => { console.log(msg); }} />);
it("Subscribe and unsubscibe mayhem", (done) => {
const mountedComponent = mount(<SockJsClient url="http://localhost:8089/handler"
topics={ ["/topic/all", "/topic/1"] } onMessage={(msg) => { console.log(msg); }} />);

setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
updateSubscription();
}, 500);

const updateSubscription = () => {
// Subscribe to '/topic/2' and unsubscribe from '/topic/1'
mountedComponent.setProps({ topics: ["/topic/all", "/topic/2"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
updateSubscription();
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
expect(mountedComponent.instance().subscriptions.has("/topic/2")).to.be.true;
mountedComponent.unmount();
done();
}, 500);

const updateSubscription = () => {
// Subscribe to '/topic/2' and unsubscribe from '/topic/1'
mountedComponent.setProps({ topics: ["/topic/all", "/topic/2"] });
setTimeout(() => {
expect(mountedComponent.instance().subscriptions.size).to.equal(2);
expect(mountedComponent.instance().subscriptions.has("/topic/all")).to.be.true;
expect(mountedComponent.instance().subscriptions.has("/topic/2")).to.be.true;
mountedComponent.unmount();
done();
}, 500);
};
});
};
});
});
22 changes: 19 additions & 3 deletions test/unit/render.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import { expect } from "chai";
import SockJsClient from "../../src/client.jsx";

const clientTypes = {
onlyRequired: <SockJsClient url="http://localhost:8080/ws" topics={["/topics/all"]}
onlyRequired: <SockJsClient url="http://thisisfakewsurl/ws" topics={["/topics/all"]}
onMessage={(msg) => { console.log(msg); }} />,
withDebug: <SockJsClient url="http://localhost:8080/ws" topics={["/topics/all"]}
withDebug: <SockJsClient url="http://thisisfakewsurl/ws" topics={["/topics/all"]}
debug={ true } onMessage={(msg) => { console.log(msg); }} />
};

Expand All @@ -24,7 +24,6 @@ describe("<SockJsClient />", () => {
expect(wrapper.getElement()).to.be.null;
wrapper.unmount();
});

it("Connect is called once", () => {
const connectSpy = sinon.spy(SockJsClient.prototype, "componentDidMount");
const mountedComponent = mount(clientTypes.onlyRequired);
Expand All @@ -40,4 +39,21 @@ describe("<SockJsClient />", () => {
expect(disconnectSpy.calledOnce).to.be.true;
disconnectSpy.restore();
});

it("Attempt reconnect on bad connection", () => {
const retryIntervalFunc = sinon.fake.returns(100);
const mountedComponent = mount(<SockJsClient url="http://thisisfakewsurl/ws" topics={["/topics/all"]}
debug={ true } onMessage={(msg) => { console.log(msg); }} getRetryInterval={ retryIntervalFunc } />);

setTimeout(() => {
expect(retryIntervalFunc.calledTwice).to.be.true;
}, 210);
});

it("Send without connect should throw error", () => {
const mountedComponent = mount(<SockJsClient url="http://thisisfakewsurl/ws" topics={["/topics/all"]}
debug={ true } onMessage={(msg) => { console.log(msg); }} />);
const client = mountedComponent.instance();
expect(() => { client.sendMessage("/app/all", "i will fail"); }).to.throw("Send error: SockJsClient is disconnected");
});
});

0 comments on commit f586d63

Please sign in to comment.