Throw a stale connection exception when authentication token expires in Snowflake (#6612)
* Throw a stale connection on authentication token expired * Added JUnit test
This commit is contained in:
parent
b2ade8e17e
commit
f05e32a97e
|
|
@ -14,6 +14,7 @@ import com.appsmith.external.plugins.BasePlugin;
|
||||||
import com.appsmith.external.plugins.PluginExecutor;
|
import com.appsmith.external.plugins.PluginExecutor;
|
||||||
import com.external.utils.SqlUtils;
|
import com.external.utils.SqlUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.snowflake.client.jdbc.SnowflakeReauthenticationRequest;
|
||||||
import org.pf4j.Extension;
|
import org.pf4j.Extension;
|
||||||
import org.pf4j.PluginWrapper;
|
import org.pf4j.PluginWrapper;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
@ -88,6 +89,9 @@ public class SnowflakePlugin extends BasePlugin {
|
||||||
rowsList.add(row);
|
rowsList.add(row);
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
if (e instanceof SnowflakeReauthenticationRequest) {
|
||||||
|
throw new StaleConnectionException();
|
||||||
|
}
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
throw new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, e.getMessage());
|
throw new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,21 @@
|
||||||
package com.external.plugins;
|
package com.external.plugins;
|
||||||
|
|
||||||
|
import com.appsmith.external.exceptions.pluginExceptions.StaleConnectionException;
|
||||||
|
import com.appsmith.external.models.ActionConfiguration;
|
||||||
|
import com.appsmith.external.models.ActionExecutionResult;
|
||||||
import com.appsmith.external.models.DBAuth;
|
import com.appsmith.external.models.DBAuth;
|
||||||
import com.appsmith.external.models.DatasourceConfiguration;
|
import com.appsmith.external.models.DatasourceConfiguration;
|
||||||
import com.appsmith.external.models.Property;
|
import com.appsmith.external.models.Property;
|
||||||
import lombok.extern.log4j.Log4j;
|
import lombok.extern.log4j.Log4j;
|
||||||
|
import net.snowflake.client.jdbc.SnowflakeReauthenticationRequest;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.test.StepVerifier;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
@ -17,7 +27,7 @@ public class SnowflakePluginTest {
|
||||||
SnowflakePlugin.SnowflakePluginExecutor pluginExecutor = new SnowflakePlugin.SnowflakePluginExecutor();
|
SnowflakePlugin.SnowflakePluginExecutor pluginExecutor = new SnowflakePlugin.SnowflakePluginExecutor();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testValidateDatasource_InvalidCredentials_returnsInvalids() {
|
public void testValidateDatasource_withInvalidCredentials_returnsInvalids() {
|
||||||
DatasourceConfiguration datasourceConfiguration = new DatasourceConfiguration();
|
DatasourceConfiguration datasourceConfiguration = new DatasourceConfiguration();
|
||||||
DBAuth auth = new DBAuth();
|
DBAuth auth = new DBAuth();
|
||||||
auth.setUsername(null);
|
auth.setUsername(null);
|
||||||
|
|
@ -32,4 +42,29 @@ public class SnowflakePluginTest {
|
||||||
assertTrue(output.contains("Missing database name."));
|
assertTrue(output.contains("Missing database name."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExecute_authenticationTimeout_returnsStaleConnectionException() throws SQLException {
|
||||||
|
final String testQuery = "testQuery";
|
||||||
|
final Connection connection = Mockito.mock(Connection.class);
|
||||||
|
Mockito.when(connection.isValid(30))
|
||||||
|
.thenReturn(true);
|
||||||
|
final Statement statement = Mockito.mock(Statement.class);
|
||||||
|
Mockito.when(connection.createStatement())
|
||||||
|
.thenReturn(statement);
|
||||||
|
Mockito.when(statement.executeQuery(testQuery))
|
||||||
|
.thenThrow(new SnowflakeReauthenticationRequest(
|
||||||
|
"1",
|
||||||
|
"Authentication token expired",
|
||||||
|
"",
|
||||||
|
0));
|
||||||
|
final ActionConfiguration actionConfiguration = new ActionConfiguration();
|
||||||
|
actionConfiguration.setBody(testQuery);
|
||||||
|
final Mono<ActionExecutionResult> actionExecutionResultMono =
|
||||||
|
pluginExecutor.execute(connection, new DatasourceConfiguration(), actionConfiguration);
|
||||||
|
|
||||||
|
StepVerifier.create(actionExecutionResultMono)
|
||||||
|
.expectErrorMatches(e -> e instanceof StaleConnectionException)
|
||||||
|
.verify();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user