No anterior blog expliquei como usar o Docker executando o Couchbase durante seus testes. Ambas as publicações tinham o requisito de que você precisava criar sua própria imagem do Docker do Couchbase com o cluster e os dados já configurados. Nesta publicação, mostrarei como você pode usar nossa imagem oficial do Docker e configurar o cluster como desejar durante a fase de configuração do seu teste.
Um contêiner de teste personalizado do Couchbase
O TestContainers já oferece suporte a vários tipos específicos de contêineres, especialmente no mundo relacional, como você pode ver na página documentação. Eles oferecem alguns recursos avançados, como uma conexão JDBC que permite que você use o banco de dados subjacente diretamente. Com o mesmo espírito, podemos criar um CouchbaseContainer personalizado que permitirá que você configure o cluster e os buckets durante os testes.
Ele será responsável por iniciar a imagem do Docker e retornará uma instância configurada do CouchbaseCluster. Primeiro, definimos o identificador padrão da imagem da plataforma e a porta Liveness como a porta 8091. Essa é a porta que será testada pela estratégia de espera HTTP padrão para o caminho '/ui/index.html#/'. Quando conseguirmos acessar essa página, poderemos começar a configurar o cluster.
|
1 2 3 4 5 6 7 8 9 |
public CouchbaseContainer() { super("couchbase:4.5.0"); } @Override protected Integer getLivenessCheckPort() { return getMappedPort(8091); } |
A segunda etapa é substituir o método configure para garantir que todas as portas necessárias sejam expostas e definir a estratégia de espera HTTP,
|
1 2 3 4 5 6 |
@Override protected void configure() { addExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093); setWaitStrategy(new HttpWaitStrategy().forPath("/ui/index.html#/")); } |
Nesse ponto, você pode testar esse contêiner genérico. A imagem será executada em um estado em que você precisará configurar o Couchbase. Você precisa passar por todas as etapas do assistente. Essas etapas podem ser automatizadas por meio das ferramentas da CLI ou da API REST. Vamos usar a API para configurar o cluster.
Há três chamadas obrigatórias que precisamos fazer. Uma para configurar as cotas de RAM, uma para configurar o nome de usuário e a senha do usuário administrador e uma para configurar os serviços disponíveis no cluster (chave/valor, índice, consulta e fts).
Usando o curl, essas chamadas teriam a seguinte aparência:
|
1 2 3 4 |
curl -v -X POST https://192.168.99.100:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 curl -v https://192.168.99.100:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex' curl -v -X POST curl -v -X POST https://192.168.99.100:8091/settings/web -d port=8091 -d username=Administrator -d password=password |
Há várias maneiras de fazer um POST em Java, veja um exemplo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public void callCouchbaseRestAPI(String url, String payload, String username, String password) throws IOException { HttpURLConnection httpConnection = (HttpURLConnection) ((new URL(url).openConnection())); httpConnection.setDoOutput(true); httpConnection.setDoInput(true); httpConnection.setRequestMethod("POST"); httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); if (username != null) { String encoded = Base64.encode((username + ":" + password).getBytes("UTF-8")); httpConnection.setRequestProperty("Authorization", "Basic "+encoded); } DataOutputStream out = new DataOutputStream(httpConnection.getOutputStream()); out.writeBytes(payload); out.flush(); out.close(); httpConnection.getResponseCode(); httpConnection.disconnect(); } |
Todas essas chamadas serão feitas a partir do initCluster method. O conteúdo dessas chamadas dependerá da configuração fornecida ao contêiner. Podemos adicionar alguns métodos para definir quais serviços estão ativados, quais são o nome de usuário e a senha, as cotas de RAM ou os buckets de amostra a serem instalados.
Depois de implementar esse método, vamos expor um CouchbaseEnvironnement e um CouchbaseCluster. O getter do ambiente é responsável por executar initCluster se ainda não tiver sido inicializado. Esse método também requer o estratégia de espera personalizada escreveu na postagem anterior. Basicamente, ele faz uma pesquisa em '/pools/default' até que o primeiro nó apresente um estado íntegro.
Aqui está o código da classe completa:
Uso
Para usar o CouchbaseContainer, basta fazer algo como:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@ClassRule public static CouchbaseContainer couchbase = new CouchbaseContainer(); @Test public void testSimple() throws Exception { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrator","password"); BucketSettings settings = DefaultBucketSettings.builder() .enableFlush(true).name("default").quota(100).replicas(0).type(BucketType.COUCHBASE).build(); settings = cm.insertBucket(settings); CouchbaseWaitStrategy s = new CouchbaseWaitStrategy(); s.withBasicCredentials("Administrator", "password"); s.waitUntilReady(couchbase); Bucket bucket = cc.openBucket("default"); Assert.assertNotNull(bucket); } |
Se você quiser ter apenas o serviço k/v em execução com todas as amostras de dados importadas:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class CouchbaseDriverTest { @ClassRule public static CouchbaseContainer couchbase = new CouchbaseContainer() .withBeerSample(true) .withGamesIMSample(true) .withTravelSample(true) .withFTS(false) .withIndex(false) .withQuery(false); @Test public void testSimple() throws Exception { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrator","password"); List buckets = cm.getBuckets(); Assert.assertNotNull(buckets); Assert.assertTrue(buckets.size() == 3); } } |
Como você pode ver, isso é muito simples e permite que qualquer pessoa execute testes no Couchbase, desde que tenha o Docker instalado.
Conclusão
Diga-nos nos comentários abaixo se você gostou e se deseja que forneçamos configurações adicionais e atalhos para configurar seu cluster do Couchbase durante os testes.