/*
 * Copyright 2019, TeamDev. All rights reserved.
 *
 * Redistribution and use in source and/or binary forms, with or without
 * modification, must retain the above copyright notice and the following
 * disclaimer.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package io.spine.client;

import io.spine.core.UserId;
import io.spine.testing.TestValues;
import io.spine.testing.core.given.GivenUserId;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@DisplayName("`Client` should")
class ClientTest {

    private Client client;

    @BeforeEach
    void createClient() {
        int port = TestValues.random(64000, 65000);
        client = Client.connectTo("localhost", port)
                       .build();
    }

    @AfterEach
    void closeClient() {
        client.close();
    }

    @Test
    @DisplayName("be opened upon creation")
    void opened() {
        assertTrue(client.isOpen());
    }

    @Test
    @DisplayName("close upon request")
    void closing() {
        client.close();
        assertFalse(client.isOpen());
    }

    @Test
    @DisplayName("have `shutdown()` alias method")
    void shutdown() {
        client.shutdown();
        assertFalse(client.isOpen());
    }

    @Test
    @DisplayName("create requests on behalf of a user")
    void onBehalf() {
        UserId expected = GivenUserId.generated();
        ClientRequest request = client.onBehalfOf(expected);
        assertThat(request.user())
                .isEqualTo(expected);
    }

    @Test
    @DisplayName("create requests for a guest user")
    void guestRequest() {
        ClientRequest request = client.asGuest();
        assertThat(request.user())
                .isEqualTo(Client.DEFAULT_GUEST_ID);
    }
}

Test opening client request