def test_socket_disconnect(get_by_name, register_socket, engage):
    (
        "SocketManager().disconnect() should get by name, unregister then "
        "disconnect to the given address."
    )
    socket = get_by_name.return_value

    # Given a zmq mock
    zmq = Mock()
    poller = zmq.Poller.return_value

    # And a poller that raises an exception upon unregister
    poller.unregister.side_effect = RuntimeError("boom")

    # And a context
    context = Mock()

    # And a socket manager
    manager = SocketManager(zmq, context)
    manager.addresses = {"foobar": "baz", "another": "socket"}
    # When I call disconnect
    manager.disconnect("foobar").should.be.true

    # Then it should have removed the socket address from the table
    manager.addresses.should.equal({"another": "socket"})
    socket.disconnect.assert_has_calls([call("baz")])
    socket.disconnect.call_count.should.equal(1)
def test_socket_manager_can_poll_asynchronously():
    (
        "SocketManager should leverage a non-blocking socket "
        "collection can be used seamlessly in a blocking fashion [TCP SOCKET]"
    )

    # Given a socket manager for a server
    server = SocketManager(zmq, context)
    # And a reply socket listening on a tcp port
    server.ensure_and_bind(
        "reply-server", zmq.REP, "tcp://0.0.0.0:3458", zmq.POLLIN | zmq.POLLOUT
    )

    # And a socket manager for a client
    client = SocketManager(zmq, context)

    # And a request client connected to the server
    client.ensure_and_connect(
        "request-client",
        zmq.REQ,
        "tcp://0.0.0.0:3458",
        zmq.POLLIN | zmq.POLLOUT,
    )

    # And send a request from the client
    requester = client.wait_until_ready(
        "request-client", zmq.POLLOUT, timeout=2
    )
    requester.send_json({"client": 42})

    # Then I should receive a request from the client
    replier = server.wait_until_ready("reply-server", zmq.POLLIN, timeout=2)
    replier.should_not.be.none
    request = replier.recv_json()

    # And the request should be the one that the client just sent
    request.should.equal({"client": 42})

    # And disconnecting should work
    client.disconnect("request-client")
    server.disconnect("reply-server")
def test_socket_disconnect_not_available(get_by_name, register_socket, engage):
    (
        "SocketManager().disconnect() should return False if no sockets are available with that name"
    )
    # Background: get_by_name returns None
    get_by_name.return_value = None

    # Given a zmq mock
    zmq = Mock()

    # And a context
    context = Mock()

    manager = SocketManager(zmq, context)
    # When I call disconnect
    result = manager.disconnect("foobar")

    # Then it should return false
    result.should.be.false
def test_socket_disconnect_not_registered(get_by_name, register_socket, engage):
    (
        "SocketManager().disconnect() should return False if no sockets are registered with that name"
    )
    # Background: get_by_name returns None
    socket = get_by_name.return_value

    # Given a zmq mock
    zmq = Mock()

    # And a context
    context = Mock()

    # And a socket manager without registered sockets
    manager = SocketManager(zmq, context)
    manager.addresses = {}
    # When I call disconnect
    result = manager.disconnect("foobar")

    # Then it should return true
    result.should.be.true

    # But socket.disconnect
    socket.disconnect.call_count.should.equal(0)