/* * Copyright (C) 2015 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package keywhiz.service.daos; import java.time.OffsetDateTime; import java.util.Set; import javax.inject.Inject; import keywhiz.KeywhizTestRunner; import keywhiz.api.ApiDate; import keywhiz.api.model.Client; import keywhiz.service.daos.ClientDAO.ClientDAOFactory; import org.jooq.DSLContext; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static keywhiz.jooq.tables.Clients.CLIENTS; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertTrue; @RunWith(KeywhizTestRunner.class) public class ClientDAOTest { @Inject DSLContext jooqContext; @Inject ClientDAOFactory clientDAOFactory; Client client1, client2; ClientDAO clientDAO; @Before public void setUp() throws Exception { clientDAO = clientDAOFactory.readwrite(); long now = OffsetDateTime.now().toEpochSecond(); jooqContext.insertInto(CLIENTS, CLIENTS.NAME, CLIENTS.DESCRIPTION, CLIENTS.CREATEDBY, CLIENTS.UPDATEDBY, CLIENTS.ENABLED, CLIENTS.CREATEDAT, CLIENTS.UPDATEDAT) .values("client1", "desc1", "creator", "updater", false, now, now) .values("client2", "desc2", "creator", "updater", false, now, now) .execute(); client1 = clientDAO.getClient("client1").get(); client2 = clientDAO.getClient("client2").get(); } @Test public void createClient() { int before = tableSize(); clientDAO.createClient("newClient", "creator", ""); Client newClient = clientDAO.getClient("newClient").orElseThrow(RuntimeException::new); assertThat(tableSize()).isEqualTo(before + 1); assertThat(clientDAO.getClients()).containsOnly(client1, client2, newClient); } @Test public void createClientReturnsId() { long id = clientDAO.createClient("newClientWithSameId", "creator2", ""); Client clientById = clientDAO.getClient("newClientWithSameId") .orElseThrow(RuntimeException::new); assertThat(clientById.getId()).isEqualTo(id); } @Test public void deleteClient() { int before = tableSize(); clientDAO.deleteClient(client1); assertThat(tableSize()).isEqualTo(before - 1); assertThat(clientDAO.getClients()).containsOnly(client2); } @Test public void getClientByName() { assertThat(clientDAO.getClient("client1")).contains(client1); } @Test public void getNonExistentClientByName() { assertThat(clientDAO.getClient("non-existent")).isEmpty(); } @Test public void getClientById() { Client client = clientDAO.getClientById(client1.getId()).orElseThrow(RuntimeException::new); assertThat(client).isEqualTo(client1); } @Test public void getNonExistentClientById() { assertThat(clientDAO.getClientById(-1)).isEmpty(); } @Test public void getsClients() { Set<Client> clients = clientDAO.getClients(); assertThat(clients).containsOnly(client1, client2); } @Test public void sawClientTest() { assertThat(client1.getLastSeen()).isNull(); assertThat(client2.getLastSeen()).isNull(); ApiDate now = ApiDate.now(); clientDAO.sawClient(client1); // reload clients from db, as sawClient doesn't update in-memory object Client client1v2 = clientDAO.getClient(client1.getName()).get(); Client client2v2 = clientDAO.getClient(client2.getName()).get(); // verify client1 from db has updated lastSeen, and client2 hasn't changed assertThat(client1v2.getLastSeen()).isNotNull(); assertTrue(client1v2.getLastSeen().toEpochSecond() >= now.toEpochSecond()); assertThat(client2v2.getLastSeen()).isNull(); } private int tableSize() { return jooqContext.fetchCount(CLIENTS); } }