Skip to content

Commit c5ce78f

Browse files
committed
feat: add unit tests for CommandListener and implement TestCommandListener for tracking operations
1 parent 38978f0 commit c5ce78f

File tree

2 files changed

+260
-0
lines changed

2 files changed

+260
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.redis.om.spring.ops;
2+
3+
import com.redis.om.spring.AbstractBaseDocumentTest;
4+
import com.redis.om.spring.ops.search.SearchOperations;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.ValueSource;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import redis.clients.jedis.search.*;
12+
import redis.clients.jedis.search.aggr.AggregationBuilder;
13+
import redis.clients.jedis.search.aggr.AggregationResult;
14+
import redis.clients.jedis.search.schemafields.SchemaField;
15+
import redis.clients.jedis.search.schemafields.TextField;
16+
import java.util.List;
17+
import java.util.UUID;
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertNotNull;
21+
22+
@Slf4j
23+
class CommandListenerTest extends AbstractBaseDocumentTest {
24+
@Autowired
25+
private RedisModulesOperations<String> modulesOperations;
26+
27+
@Autowired
28+
private TestCommandListener testListener;
29+
30+
@BeforeEach
31+
void setUp() {
32+
testListener.reset();
33+
}
34+
35+
@ParameterizedTest
36+
@ValueSource(strings = { "test-create-index", "another-create-index", "yet-another-create-index" })
37+
void givenIndexName_whenCreateAndDropIndex_thenAssertResult(final String indexName) {
38+
// When
39+
final SearchOperations<String> searchOps = createIndex(indexName + "-" + UUID.randomUUID());
40+
// Then
41+
final String result = searchOps.dropIndex();
42+
// Then
43+
assertNotNull(result);
44+
assertEquals(1, testListener.dropIndexStartedCount.get());
45+
assertEquals(1, testListener.dropIndexFinishedCount.get());
46+
assertEquals(indexName, testListener.lastDropIndexName);
47+
assertEquals(result, testListener.lastDropIndexResult);
48+
}
49+
50+
@Test
51+
void given_whenSearch_thenAssertResult() {
52+
// Given
53+
final String indexName = "test-search-index-" + UUID.randomUUID();
54+
final SearchOperations<String> searchOps = createIndex(indexName + "-" + UUID.randomUUID());
55+
// When
56+
final Query query = new Query("*");
57+
final SearchResult result = searchOps.search(query);
58+
// Then
59+
assertEquals(1, testListener.searchStartedCount.get());
60+
assertEquals(1, testListener.searchFinishedCount.get());
61+
assertEquals(indexName, testListener.lastSearchIndexName);
62+
assertEquals(query, testListener.lastSearchQuery);
63+
assertEquals(result, testListener.lastSearchResult);
64+
searchOps.dropIndex();
65+
}
66+
67+
@Test
68+
void given_whenAggregate_thenAssertResult() {
69+
// Given
70+
final String indexName = "test-aggregate-index-" + UUID.randomUUID();
71+
final SearchOperations<String> searchOps = createIndex(indexName);
72+
// When
73+
final AggregationBuilder aggBuilder = new AggregationBuilder("*");
74+
final AggregationResult aggResult = searchOps.aggregate(aggBuilder);
75+
// Then
76+
assertNotNull(aggResult);
77+
assertEquals(1, testListener.aggregateStartedCount.get());
78+
assertEquals(1, testListener.aggregateFinishedCount.get());
79+
assertEquals(indexName, testListener.lastAggregateIndexName);
80+
assertEquals(aggBuilder, testListener.lastAggregationBuilder);
81+
}
82+
83+
private SearchOperations<String> createIndex(final String indexName) {
84+
// Given
85+
final SearchOperations<String> searchOps = modulesOperations.opsForSearch(indexName);
86+
try {
87+
searchOps.dropIndex();
88+
} catch (Exception e) {
89+
log.warn("Index did not exist prior to test setup: {}", e.getMessage());
90+
}
91+
final FTCreateParams params = FTCreateParams.createParams()
92+
.on(IndexDataType.HASH)
93+
.prefix(indexName + ":");
94+
final List<SchemaField> fields = List.of( TextField.of("content"));
95+
// When
96+
final String result = searchOps.createIndex(params, fields);
97+
// Then
98+
assertThat(testListener.createIndexStartedCount.get()).isEqualTo(1);
99+
assertThat(testListener.createIndexFinishedCount.get()).isEqualTo(1);
100+
assertThat(testListener.lastCreateIndexName).isEqualTo(indexName);
101+
assertThat(testListener.lastCreateParams).isEqualTo(params);
102+
assertThat(testListener.lastCreateFields).isEqualTo(fields);
103+
assertThat(testListener.lastCreateResult).isEqualTo(result);
104+
return searchOps;
105+
}
106+
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
package com.redis.om.spring.ops;
2+
3+
import org.springframework.boot.test.context.TestComponent;
4+
import org.springframework.context.annotation.Primary;
5+
import org.springframework.stereotype.Component;
6+
import redis.clients.jedis.search.FTCreateParams;
7+
import redis.clients.jedis.search.FTSearchParams;
8+
import redis.clients.jedis.search.IndexOptions;
9+
import redis.clients.jedis.search.Query;
10+
import redis.clients.jedis.search.Schema;
11+
import redis.clients.jedis.search.SearchResult;
12+
import redis.clients.jedis.search.aggr.AggregationBuilder;
13+
import redis.clients.jedis.search.schemafields.SchemaField;
14+
15+
import java.util.List;
16+
import java.util.Map;
17+
import java.util.concurrent.atomic.AtomicInteger;
18+
19+
/**
20+
* Test implementation of CommandListener that tracks all invocations
21+
*/
22+
@Component
23+
@Primary
24+
class TestCommandListener implements CommandListener {
25+
// Search tracking
26+
AtomicInteger searchStartedCount = new AtomicInteger(0);
27+
AtomicInteger searchFinishedCount = new AtomicInteger(0);
28+
String lastSearchIndexName;
29+
Query lastSearchQuery;
30+
FTSearchParams lastSearchParams;
31+
SearchResult lastSearchResult;
32+
33+
// Create index tracking
34+
AtomicInteger createIndexStartedCount = new AtomicInteger(0);
35+
AtomicInteger createIndexFinishedCount = new AtomicInteger(0);
36+
String lastCreateIndexName;
37+
FTCreateParams lastCreateParams;
38+
List<SchemaField> lastCreateFields;
39+
Schema lastCreateSchema;
40+
IndexOptions lastCreateOptions;
41+
String lastCreateResult;
42+
43+
// Aggregate tracking
44+
AtomicInteger aggregateStartedCount = new AtomicInteger(0);
45+
AtomicInteger aggregateFinishedCount = new AtomicInteger(0);
46+
String lastAggregateIndexName;
47+
AggregationBuilder lastAggregationBuilder;
48+
49+
// Drop index tracking
50+
AtomicInteger dropIndexStartedCount = new AtomicInteger(0);
51+
AtomicInteger dropIndexFinishedCount = new AtomicInteger(0);
52+
String lastDropIndexName;
53+
String lastDropIndexResult;
54+
55+
// Info tracking
56+
AtomicInteger infoStartedCount = new AtomicInteger(0);
57+
AtomicInteger infoFinishedCount = new AtomicInteger(0);
58+
59+
@Override
60+
public void searchStarted(String indexName, Query q, FTSearchParams params) {
61+
searchStartedCount.incrementAndGet();
62+
lastSearchIndexName = indexName;
63+
lastSearchQuery = q;
64+
lastSearchParams = params;
65+
}
66+
67+
@Override
68+
public void searchFinished(String indexName, Query q, FTSearchParams params, SearchResult searchResult) {
69+
searchFinishedCount.incrementAndGet();
70+
lastSearchResult = searchResult;
71+
}
72+
73+
@Override
74+
public void createIndexStarted(String indexName, FTCreateParams params, List<SchemaField> fields,
75+
Schema schema, IndexOptions options) {
76+
createIndexStartedCount.incrementAndGet();
77+
lastCreateIndexName = indexName;
78+
lastCreateParams = params;
79+
lastCreateFields = fields;
80+
lastCreateSchema = schema;
81+
lastCreateOptions = options;
82+
}
83+
84+
@Override
85+
public void createIndexFinished(String indexName, FTCreateParams params, List<SchemaField> fields,
86+
Schema schema, IndexOptions options, String result) {
87+
createIndexFinishedCount.incrementAndGet();
88+
lastCreateResult = result;
89+
}
90+
91+
@Override
92+
public void aggregateStarted(String indexName, AggregationBuilder q) {
93+
aggregateStartedCount.incrementAndGet();
94+
lastAggregateIndexName = indexName;
95+
lastAggregationBuilder = q;
96+
}
97+
98+
@Override
99+
public void aggregateFinished(String indexName, AggregationBuilder q) {
100+
aggregateFinishedCount.incrementAndGet();
101+
}
102+
103+
@Override
104+
public void dropIndexStarted(String indexName) {
105+
dropIndexStartedCount.incrementAndGet();
106+
lastDropIndexName = indexName;
107+
}
108+
109+
@Override
110+
public void dropIndexFinished(String indexName, String result) {
111+
dropIndexFinishedCount.incrementAndGet();
112+
lastDropIndexResult = result;
113+
}
114+
115+
@Override
116+
public void infoStarted(String indexName) {
117+
infoStartedCount.incrementAndGet();
118+
}
119+
120+
@Override
121+
public void infoFinished(String indexName, Map<String, Object> info) {
122+
infoFinishedCount.incrementAndGet();
123+
}
124+
125+
/**
126+
* Reset all counters and tracked values
127+
*/
128+
void reset() {
129+
searchStartedCount.set(0);
130+
searchFinishedCount.set(0);
131+
createIndexStartedCount.set(0);
132+
createIndexFinishedCount.set(0);
133+
aggregateStartedCount.set(0);
134+
aggregateFinishedCount.set(0);
135+
dropIndexStartedCount.set(0);
136+
dropIndexFinishedCount.set(0);
137+
infoStartedCount.set(0);
138+
infoFinishedCount.set(0);
139+
lastSearchIndexName = null;
140+
lastSearchQuery = null;
141+
lastSearchParams = null;
142+
lastSearchResult = null;
143+
lastCreateIndexName = null;
144+
lastCreateParams = null;
145+
lastCreateFields = null;
146+
lastCreateSchema = null;
147+
lastCreateOptions = null;
148+
lastCreateResult = null;
149+
lastAggregateIndexName = null;
150+
lastAggregationBuilder = null;
151+
lastDropIndexName = null;
152+
lastDropIndexResult = null;
153+
}
154+
}

0 commit comments

Comments
 (0)