Skip to content

Commit

Permalink
chore: add spotless plugin (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmyjames committed Mar 6, 2024
2 parents 64f69ff + 78ffa01 commit ac2933d
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 50 deletions.
28 changes: 26 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ plugins {
id 'org.springframework.boot' version '3.2.2' apply false
id 'io.spring.dependency-management' version '1.1.4'

id 'com.diffplug.spotless' version '6.25.0'

id 'maven-publish'
}

group = "dev.openfga"
version = "0.0.1-SNAPSHOT"

sourceCompatibility = 17
targetCompatibility = 17
java {
sourceCompatibility = 17
targetCompatibility = 17
}

repositories {
mavenCentral()
Expand Down Expand Up @@ -47,3 +51,23 @@ publishing {
}
}
}

spotless {
format 'misc', {
// define the files (e.g. '*.gradle', '*.md') to apply `misc` to
target '.gitignore', '*.gradle'
// define the steps to apply to those files
trimTrailingWhitespace()
indentWithSpaces()
endWithNewline()
}
java {
palantirJavaFormat()
removeUnusedImports()
importOrder()
}
}

tasks.register('fmt') {
dependsOn 'spotlessApply'
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
package dev.openfga.autoconfigure;

import dev.openfga.sdk.api.client.OpenFgaClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Target({ElementType.TYPE, ElementType.METHOD})
@ConditionalOnProperty(name = {"openfga.api-url"})
@ConditionalOnClass(OpenFgaClient.class)
public @interface ConditionalOnFgaProperties {}
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ public ClientConfiguration openFgaConfig() {
if (credentialsProperties != null) {
if (OpenFgaProperties.CredentialsMethod.API_TOKEN.equals(credentialsProperties.getMethod())) {
credentials.setCredentialsMethod(CredentialsMethod.API_TOKEN);
credentials.setApiToken(new ApiToken(credentialsProperties.getConfig().getApiToken()));
} else if (OpenFgaProperties.CredentialsMethod.CLIENT_CREDENTIALS.equals(credentialsProperties.getMethod())) {
credentials.setApiToken(
new ApiToken(credentialsProperties.getConfig().getApiToken()));
} else if (OpenFgaProperties.CredentialsMethod.CLIENT_CREDENTIALS.equals(
credentialsProperties.getMethod())) {
ClientCredentials clientCredentials = new ClientCredentials()
.clientId(credentialsProperties.getConfig().getClientId())
.clientSecret(credentialsProperties.getConfig().getClientSecret())
Expand Down
20 changes: 12 additions & 8 deletions src/main/java/dev/openfga/autoconfigure/OpenFgaProperties.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Set;

/**
* Properties used to configure an {@link dev.openfga.sdk.api.client.OpenFgaClient}
*/
@ConfigurationProperties(prefix="openfga")
@ConfigurationProperties(prefix = "openfga")
public class OpenFgaProperties implements InitializingBean {

private String apiUrl;
Expand Down Expand Up @@ -63,18 +61,24 @@ public void validate() {
}
CredentialsConfiguration credentialsConfig = credentialsProperty.getConfig();
switch (credentialsMethod) {
case NONE -> {}
case NONE -> {}
case API_TOKEN -> {
if (credentialsConfig == null || credentialsConfig.getApiToken() == null) {
throw new IllegalStateException("'API_TOKEN' credentials method specified, but no token specified");
throw new IllegalStateException(
"'API_TOKEN' credentials method specified, but no token specified");
}
}
case CLIENT_CREDENTIALS -> {
if (credentialsConfig == null || credentialsConfig.getApiTokenIssuer() == null || credentialsConfig.getClientId() == null || credentialsConfig.getClientSecret() == null) {
throw new IllegalStateException("'CLIENT_CREDENTIALS' configuration must contain 'client-id', 'client-secret', and 'api-token-issuer'");
if (credentialsConfig == null
|| credentialsConfig.getApiTokenIssuer() == null
|| credentialsConfig.getClientId() == null
|| credentialsConfig.getClientSecret() == null) {
throw new IllegalStateException(
"'CLIENT_CREDENTIALS' configuration must contain 'client-id', 'client-secret', and 'api-token-issuer'");
}
}
default -> throw new IllegalStateException("credentials method must be either 'NONE', 'API_TOKEN', or 'CLIENT_CREDENTIALS'");
default -> throw new IllegalStateException(
"credentials method must be either 'NONE', 'API_TOKEN', or 'CLIENT_CREDENTIALS'");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package dev.openfga.autoconfigure;

import dev.openfga.sdk.api.configuration.ClientConfiguration;
import dev.openfga.sdk.api.configuration.CredentialsMethod;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.jupiter.api.Assertions.assertThrows;

import dev.openfga.sdk.api.configuration.ClientConfiguration;
import dev.openfga.sdk.api.configuration.CredentialsMethod;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;

public class FgaAutoConfigurationTests {

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
Expand All @@ -38,12 +38,12 @@ public void beanConfiguredIfPropertiesPresent() {
@Test
public void beanConfiguredForNoAuthorization() {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=NONE",
"openfga.credentials.config.api-token=XYZ"
)
"openfga.credentials.config.api-token=XYZ")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> {
ClientConfiguration config = (ClientConfiguration) context.getBean("openFgaConfig");
Expand All @@ -57,10 +57,10 @@ public void beanConfiguredForNoAuthorization() {
@Test
public void beanConfiguredForNoAuthorizationIfCredentialsNotSet() {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID"
)
"openfga.store-id=store ID")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> {
ClientConfiguration config = (ClientConfiguration) context.getBean("openFgaConfig");
Expand All @@ -74,12 +74,12 @@ public void beanConfiguredForNoAuthorizationIfCredentialsNotSet() {
@Test
public void beanConfiguredForApiToken() {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=API_TOKEN",
"openfga.credentials.config.api-token=XYZ"
)
"openfga.credentials.config.api-token=XYZ")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> {
ClientConfiguration config = (ClientConfiguration) context.getBean("openFgaConfig");
Expand All @@ -94,7 +94,8 @@ public void beanConfiguredForApiToken() {
@Test
public void beanConfiguredForOauth2() {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=CLIENT_CREDENTIALS",
Expand All @@ -103,19 +104,20 @@ public void beanConfiguredForOauth2() {
"openfga.credentials.config.client-secret=CLIENT_SECRET",
"openfga.credentials.config.api-token-issuer=API_TOKEN_ISSUER",
"openfga.credentials.config.api-audience=API_AUDIENCE",
"openfga.credentials.config.scopes=SCOPE1 SCOPE2"
)
"openfga.credentials.config.scopes=SCOPE1 SCOPE2")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> {
ClientConfiguration config = (ClientConfiguration) context.getBean("openFgaConfig");
assertThat(config.getApiUrl(), is("https://api.fga.example"));
assertThat(config.getAuthorizationModelId(), is("authorization model ID"));
assertThat(config.getStoreId(), is("store ID"));
assertThat(config.getCredentials().getCredentialsMethod(), is(CredentialsMethod.CLIENT_CREDENTIALS));
assertThat(
config.getCredentials().getCredentialsMethod(), is(CredentialsMethod.CLIENT_CREDENTIALS));
assertThat(config.getCredentials().getApiToken(), is(nullValue()));
assertThat(config.getCredentials().getClientCredentials().getClientId(), is("CLIENT_ID"));
assertThat(config.getCredentials().getClientCredentials().getClientSecret(), is("CLIENT_SECRET"));
assertThat(config.getCredentials().getClientCredentials().getApiTokenIssuer(), is("API_TOKEN_ISSUER"));
assertThat(
config.getCredentials().getClientCredentials().getApiTokenIssuer(), is("API_TOKEN_ISSUER"));
assertThat(config.getCredentials().getClientCredentials().getApiAudience(), is("API_AUDIENCE"));
assertThat(config.getCredentials().getClientCredentials().getScopes(), is("SCOPE1 SCOPE2"));
});
Expand All @@ -125,43 +127,48 @@ public void beanConfiguredForOauth2() {
public void failsIfApiTokenMethodSetButNoToken() {
IllegalStateException exception = assertThrows(IllegalStateException.class, () -> {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=API_TOKEN"
)
"openfga.credentials.method=API_TOKEN")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> context.getBean("openFgaConfig"));
});

assertThat(exception.getCause().getMessage(), containsString("'API_TOKEN' credentials method specified, but no token specified"));
assertThat(
exception.getCause().getMessage(),
containsString("'API_TOKEN' credentials method specified, but no token specified"));
}

@Test
public void failsIfClientCredentialsMethodSetButNotConfigured() {
IllegalStateException exception = assertThrows(IllegalStateException.class, () -> {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=CLIENT_CREDENTIALS"
)
"openfga.credentials.method=CLIENT_CREDENTIALS")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> context.getBean("openFgaConfig"));
});

assertThat(exception.getCause().getMessage(), containsString("'CLIENT_CREDENTIALS' configuration must contain 'client-id', 'client-secret', and 'api-token-issuer'"));
assertThat(
exception.getCause().getMessage(),
containsString(
"'CLIENT_CREDENTIALS' configuration must contain 'client-id', 'client-secret', and 'api-token-issuer'"));
}

@Test
public void failsIfCredentialsWithNoMethod() {
IllegalStateException exception = assertThrows(IllegalStateException.class, () -> {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.config.api-token=API_TOKEN"
)
"openfga.credentials.config.api-token=API_TOKEN")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> context.getBean("openFgaConfig"));
});
Expand All @@ -173,12 +180,12 @@ public void failsIfCredentialsWithNoMethod() {
public void failsIfCredentialsWithInvalidMethod() {
assertThrows(IllegalStateException.class, () -> {
this.contextRunner
.withPropertyValues("openfga.api-url=https://api.fga.example",
.withPropertyValues(
"openfga.api-url=https://api.fga.example",
"openfga.authorization-model-id=authorization model ID",
"openfga.store-id=store ID",
"openfga.credentials.method=INVALID",
"openfga.credentials.config.api-token=API_TOKEN"
)
"openfga.credentials.config.api-token=API_TOKEN")
.withConfiguration(AutoConfigurations.of(OpenFgaAutoConfiguration.class))
.run((context) -> context.getBean("openFgaConfig"));
});
Expand Down

0 comments on commit ac2933d

Please sign in to comment.