Skip to content

Commit 8465795

Browse files
authored
Add BigQueryEmulatorContainer (#7324)
1 parent bd70f5b commit 8465795

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

docs/modules/gcloud.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55

66
Testcontainers module for the Google Cloud Platform's [Cloud SDK](https://cloud.google.com/sdk/).
77

8-
Currently, the module supports `Bigtable`, `Datastore`, `Firestore`, `Spanner`, and `Pub/Sub` emulators. In order to use it, you should use the following classes:
8+
Currently, the module supports `BigQuery`, `Bigtable`, `Datastore`, `Firestore`, `Spanner`, and `Pub/Sub` emulators. In order to use it, you should use the following classes:
99

1010
Class | Container Image
1111
-|-
12+
BigQueryEmulatorContainer | ["ghcr.io/goccy/bigquery-emulator"]("ghcr.io/goccy/bigquery-emulator")
1213
BigtableEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk)
1314
DatastoreEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk)
1415
FirestoreEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk)
@@ -17,6 +18,14 @@ PubSubEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](h
1718

1819
## Usage example
1920

21+
### BigQuery
22+
23+
Start BigQuery Emulator during a test:
24+
25+
<!--codeinclude-->
26+
[Starting a BigQuery Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java) inside_block:emulatorContainer
27+
<!--/codeinclude-->
28+
2029
### Bigtable
2130

2231
Start Bigtable Emulator during a test:

modules/gcloud/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ dependencies {
44
api project(':testcontainers')
55

66
testImplementation platform("com.google.cloud:libraries-bom:26.18.0")
7+
testImplementation 'com.google.cloud:google-cloud-bigquery'
78
testImplementation 'com.google.cloud:google-cloud-datastore'
89
testImplementation 'com.google.cloud:google-cloud-firestore'
910
testImplementation 'com.google.cloud:google-cloud-pubsub'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.testcontainers.containers;
2+
3+
import org.testcontainers.utility.DockerImageName;
4+
5+
/**
6+
* Testcontainers implementation for BigQuery.
7+
*/
8+
public class BigQueryEmulatorContainer extends GenericContainer<BigQueryEmulatorContainer> {
9+
10+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("ghcr.io/goccy/bigquery-emulator");
11+
12+
private static final int HTTP_PORT = 9050;
13+
14+
private static final int GRPC_PORT = 9060;
15+
16+
private static final String PROJECT_ID = "test-project";
17+
18+
public BigQueryEmulatorContainer(String image) {
19+
this(DockerImageName.parse(image));
20+
}
21+
22+
public BigQueryEmulatorContainer(DockerImageName dockerImageName) {
23+
super(dockerImageName);
24+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
25+
addExposedPorts(HTTP_PORT, GRPC_PORT);
26+
withCommand("--project", PROJECT_ID);
27+
}
28+
29+
public String getEmulatorHttpEndpoint() {
30+
return String.format("http://%s:%d", getHost(), getMappedPort(HTTP_PORT));
31+
}
32+
33+
public String getProjectId() {
34+
return PROJECT_ID;
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.testcontainers.containers;
2+
3+
import com.google.cloud.bigquery.BigQuery;
4+
import com.google.cloud.bigquery.BigQueryOptions;
5+
import com.google.cloud.bigquery.QueryJobConfiguration;
6+
import com.google.cloud.bigquery.TableResult;
7+
import org.junit.Test;
8+
9+
import java.math.BigDecimal;
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
public class BigQueryEmulatorContainerTest {
16+
17+
@Test
18+
public void test() throws Exception {
19+
try (
20+
// emulatorContainer {
21+
BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3")
22+
// }
23+
) {
24+
container.start();
25+
26+
String url = container.getEmulatorHttpEndpoint();
27+
BigQueryOptions options = BigQueryOptions
28+
.newBuilder()
29+
.setProjectId(container.getProjectId())
30+
.setHost(url)
31+
.setLocation(url)
32+
.build();
33+
BigQuery bigQuery = options.getService();
34+
35+
String fn =
36+
"CREATE FUNCTION testr(arr ARRAY<STRUCT<name STRING, val INT64>>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))";
37+
38+
bigQuery.query(QueryJobConfiguration.newBuilder(fn).build());
39+
40+
String sql =
41+
"SELECT testr([STRUCT<name STRING, val INT64>(\"foo\", 10), STRUCT<name STRING, val INT64>(\"bar\", 40), STRUCT<name STRING, val INT64>(\"foo\", 20)])";
42+
TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build());
43+
List<BigDecimal> values = result
44+
.streamValues()
45+
.map(fieldValues -> fieldValues.get(0).getNumericValue())
46+
.collect(Collectors.toList());
47+
assertThat(values).containsOnly(BigDecimal.valueOf(30));
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)