Skip to content

Commit 43acc28

Browse files
authored
[bq] improve tests coverage
Signed-off-by: Volodymyr Perebykivskyi <vova235@gmail.com>
1 parent 49b250d commit 43acc28

File tree

5 files changed

+89
-23
lines changed

5 files changed

+89
-23
lines changed

spring-batch-bigquery/src/main/java/org/springframework/batch/extensions/bigquery/writer/BigQueryBaseItemWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,7 @@ public void write(final Chunk<? extends T> chunk) throws Exception {
123123
this.logger.debug(String.format("Mapping %d elements", items.size()));
124124
}
125125

126-
final ByteBuffer byteBuffer = mapDataToBigQueryFormat(items);
127-
doWriteDataToBigQuery(byteBuffer);
126+
doWriteDataToBigQuery(mapDataToBigQueryFormat(items));
128127
}
129128
}
130129

spring-batch-bigquery/src/main/java/org/springframework/batch/extensions/bigquery/writer/BigQueryCsvItemWriter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,6 @@ protected synchronized void doInitializeProperties(List<? extends T> items) {
6363
}
6464
}
6565

66-
/**
67-
* Row mapper which transforms single BigQuery row into a desired type.
68-
*
69-
* @param rowMapper your row mapper
70-
*/
71-
public void setRowMapper(Converter<T, byte[]> rowMapper) {
72-
this.rowMapper = rowMapper;
73-
}
74-
7566
@Override
7667
protected List<byte[]> convertObjectsToByteArrays(List<? extends T> items) {
7768
return items
@@ -105,6 +96,15 @@ protected void performFormatSpecificChecks() {
10596

10697
}
10798

99+
/**
100+
* Row mapper which transforms single BigQuery row into a desired type.
101+
*
102+
* @param rowMapper your row mapper
103+
*/
104+
public void setRowMapper(Converter<T, byte[]> rowMapper) {
105+
this.rowMapper = rowMapper;
106+
}
107+
108108
private byte[] mapItemToCsv(T t) {
109109
try {
110110
return rowMapper == null ? objectWriter.writeValueAsBytes(t) : rowMapper.convert(t);

spring-batch-bigquery/src/main/java/org/springframework/batch/extensions/bigquery/writer/BigQueryJsonItemWriter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,6 @@ protected void doInitializeProperties(List<? extends T> items) {
4646
// Unused
4747
}
4848

49-
/**
50-
* Converter that transforms a single row into a {@link String}.
51-
*
52-
* @param marshaller your JSON mapper
53-
*/
54-
public void setMarshaller(JsonObjectMarshaller<T> marshaller) {
55-
this.marshaller = marshaller;
56-
}
57-
5849
@Override
5950
protected List<byte[]> convertObjectsToByteArrays(List<? extends T> items) {
6051
return items
@@ -91,6 +82,15 @@ protected void performFormatSpecificChecks() {
9182
Assert.isTrue(Objects.equals(format, super.writeChannelConfig.getFormat()), "Only %s format is allowed".formatted(format));
9283
}
9384

85+
/**
86+
* Converter that transforms a single row into a {@link String}.
87+
*
88+
* @param marshaller your JSON mapper
89+
*/
90+
public void setMarshaller(JsonObjectMarshaller<T> marshaller) {
91+
this.marshaller = marshaller;
92+
}
93+
9494
/**
9595
* BigQuery uses <a href="https://github.com/ndjson/ndjson-spec">ndjson</a>.
9696
* It is expected that to pass here JSON line generated by

spring-batch-bigquery/src/test/java/org/springframework/batch/extensions/bigquery/unit/writer/BigQueryBaseItemWriterTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.batch.extensions.bigquery.common.TestConstants;
2525
import org.springframework.batch.extensions.bigquery.unit.base.AbstractBigQueryTest;
2626
import org.springframework.batch.extensions.bigquery.writer.BigQueryBaseItemWriter;
27+
import org.springframework.batch.extensions.bigquery.writer.BigQueryItemWriterException;
2728

2829
import java.lang.invoke.MethodHandles;
2930
import java.nio.ByteBuffer;
@@ -144,6 +145,46 @@ void testWrite() throws Exception {
144145
Mockito.verifyNoMoreInteractions(channel);
145146
}
146147

148+
@Test
149+
void testWrite_Exception() throws Exception {
150+
MethodHandles.Lookup handle = MethodHandles.privateLookupIn(BigQueryBaseItemWriter.class, MethodHandles.lookup());
151+
AtomicBoolean consumerCalled = new AtomicBoolean();
152+
153+
Job job = Mockito.mock(Job.class);
154+
Mockito.when(job.getJobId()).thenReturn(JobId.newBuilder().build());
155+
156+
TableDataWriteChannel channel = Mockito.mock(TableDataWriteChannel.class);
157+
Mockito.when(channel.getJob()).thenReturn(job);
158+
Mockito.when(channel.write(Mockito.any(ByteBuffer.class))).thenThrow(BigQueryException.class);
159+
160+
BigQuery bigQuery = prepareMockedBigQuery();
161+
Mockito.when(bigQuery.writer(Mockito.any(WriteChannelConfiguration.class))).thenReturn(channel);
162+
163+
TestWriter writer = new TestWriter();
164+
writer.setBigQuery(bigQuery);
165+
writer.setJobConsumer(j -> consumerCalled.set(true));
166+
writer.setWriteChannelConfig(WriteChannelConfiguration.of(TABLE_ID));
167+
168+
BigQueryItemWriterException actual = Assertions.assertThrows(BigQueryItemWriterException.class, () -> writer.write(TestConstants.CHUNK));
169+
Assertions.assertEquals("Error on write happened", actual.getMessage());
170+
171+
AtomicLong actualCounter = (AtomicLong) handle
172+
.findVarHandle(BigQueryBaseItemWriter.class, "bigQueryWriteCounter", AtomicLong.class)
173+
.get(writer);
174+
175+
boolean writeFailed = (Boolean) handle
176+
.findVarHandle(BigQueryBaseItemWriter.class, "writeFailed", boolean.class)
177+
.get(writer);
178+
179+
Assertions.assertEquals(0L, actualCounter.get());
180+
Assertions.assertTrue(writeFailed);
181+
Assertions.assertFalse(consumerCalled.get());
182+
183+
Mockito.verify(channel).write(Mockito.any(ByteBuffer.class));
184+
Mockito.verify(channel).close();
185+
Mockito.verifyNoMoreInteractions(channel);
186+
}
187+
147188
@Test
148189
void testBaseAfterPropertiesSet_Exception() {
149190
TestWriter writer = new TestWriter();

spring-batch-bigquery/src/test/java/org/springframework/batch/extensions/bigquery/unit/writer/BigQueryCsvItemWriterTest.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package org.springframework.batch.extensions.bigquery.unit.writer;
1818

19+
import com.fasterxml.jackson.core.JsonProcessingException;
1920
import com.fasterxml.jackson.databind.ObjectWriter;
2021
import com.fasterxml.jackson.dataformat.csv.CsvFactory;
22+
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
2123
import com.google.cloud.bigquery.BigQuery;
2224
import com.google.cloud.bigquery.Field;
2325
import com.google.cloud.bigquery.FormatOptions;
@@ -83,14 +85,38 @@ void testSetRowMapper() throws IllegalAccessException, NoSuchFieldException {
8385
@Test
8486
void testConvertObjectsToByteArrays() {
8587
TestWriter writer = new TestWriter();
88+
List<PersonDto> items = TestConstants.CHUNK.getItems();
8689

8790
// Empty
8891
Assertions.assertTrue(writer.testConvert(List.of()).isEmpty());
8992

90-
// Not empty
93+
// Not empty (row mapper)
9194
writer.setRowMapper(source -> source.toString().getBytes());
92-
List<byte[]> actual = writer.testConvert(TestConstants.CHUNK.getItems());
93-
List<byte[]> expected = TestConstants.CHUNK.getItems().stream().map(PersonDto::toString).map(String::getBytes).toList();
95+
List<byte[]> actual = writer.testConvert(items);
96+
List<byte[]> expected = items.stream().map(PersonDto::toString).map(String::getBytes).toList();
97+
Assertions.assertEquals(expected.size(), actual.size());
98+
99+
for (int i = 0; i < actual.size(); i++) {
100+
Assertions.assertArrayEquals(expected.get(i), actual.get(i));
101+
}
102+
103+
// Not empty (object writer)
104+
ObjectWriter csvWriter = new CsvMapper().writerWithTypedSchemaFor(PersonDto.class);
105+
writer.setRowMapper(null);
106+
writer.testInitializeProperties(items);
107+
actual = writer.testConvert(items);
108+
109+
expected = items
110+
.stream()
111+
.map(pd -> {
112+
try {
113+
return csvWriter.writeValueAsBytes(pd);
114+
} catch (JsonProcessingException e) {
115+
throw new RuntimeException(e);
116+
}
117+
})
118+
.toList();
119+
94120
Assertions.assertEquals(expected.size(), actual.size());
95121

96122
for (int i = 0; i < actual.size(); i++) {

0 commit comments

Comments
 (0)