This tutorial demonstrates running within Google Functions.
Google Functions is supported by OfficeFloor through the following plugin:
<dependency> <groupId>net.officefloor.server</groupId> <artifactId>officeserver_googlefunction</artifactId> </dependency>
The only additional configuration is Google Function requiring the application be shaded as follows:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> </transformers> <filters> <filter> <!-- Exclude signing --> <artifact>*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Running the Google Function application locally typically requires running Firestore and then starting local emulation of Google Functions. To ease running and testing the application, the following plugin is available:
<plugin> <groupId>net.officefloor.maven</groupId> <artifactId>officefloor-googlefunction-maven-plugin</artifactId> <configuration> <httpPort>8381</httpPort> <firestorePort>8383</firestorePort> </configuration> <executions> <execution> <id>start</id> <phase>pre-integration-test</phase> <goals> <goal>start</goal> </goals> </execution> <execution> <id>stop</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin> <!-- Run integration tests against locally started Google Function --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>
The application may then be manually started with the following:
mvn officefloor-googlefunction:run
The functionality can be tested just like any other Web on OfficeFloor (WoOF) application:
public static final @Order(1) @RegisterExtension FirestoreExtension firestore = new FirestoreExtension();
public static final @Order(2) @RegisterExtension MockWoofServerExtension server = new MockWoofServerExtension();
@Test
public void createPost() throws Exception {
// Create the entity
MockWoofResponse response = server
.send(MockWoofServer.mockJsonRequest(HttpMethod.POST, "/posts", new Post("TEST")));
PostEntity entity = response.getJson(200, PostEntity.class);
// Ensure in store
PostEntity post = firestore.getFirestore().collection(PostEntity.class.getSimpleName()).document(entity.getId())
.get().get().toObject(PostEntity.class);
assertNotNull(post, "Should find entity in Firestore " + entity.getId());
assertEquals("TEST", post.getMessage(), "Incorrent entity");
}
To test within the Google Function emulator, use integration testing. The officefloor-googlefunction-maven-plugin above sets up the application running within a Google Function emulator. It also sets up a local Firestore. This enables the following integration testing:
public static final @RegisterExtension HttpClientExtension serverClient = new HttpClientExtension(false, 8381)
.timeout(30_000);
public static final @Order(1) @RegisterExtension FirestoreConnectExtension firestore = new FirestoreConnectExtension(
new Configuration().port(8383));
private static final ObjectMapper mapper = new ObjectMapper();
@Test
public void createPost() throws Exception {
// Create the entity
HttpPost request = new HttpPost(serverClient.url("/posts"));
request.setHeader("Content-Type", "application/json");
request.setEntity(new StringEntity(mapper.writeValueAsString(new Post("TEST"))));
HttpResponse response = serverClient.execute(request);
String responseBody = EntityUtils.toString(response.getEntity());
assertEquals(200, response.getStatusLine().getStatusCode(), "Should be successful: " + responseBody);
PostEntity entity = mapper.readValue(responseBody, PostEntity.class);
// Ensure in store
PostEntity post = firestore.getFirestore().collection(PostEntity.class.getSimpleName()).document(entity.getId())
.get().get().toObject(PostEntity.class);
assertNotNull(post, "Should find entity in Firestore " + entity.getId());
assertEquals("TEST", post.getMessage(), "Incorrent entity");
}
Note that a different Firestore extension is used for each type of testing:
officefloor-googlefunction-maven-pluginReturn to the tutorials index.