fix: bunch of TODOs
parent
faf7d12001
commit
97c3d50e6b
|
@ -8,8 +8,6 @@ import org.apache.velocity.VelocityContext;
|
||||||
import org.apache.velocity.tools.ToolManager;
|
import org.apache.velocity.tools.ToolManager;
|
||||||
import org.apache.velocity.util.StringBuilderWriter;
|
import org.apache.velocity.util.StringBuilderWriter;
|
||||||
|
|
||||||
// FIXME tests
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class aims to generate localized messages or strings either merging Velocity templates or
|
* This class aims to generate localized messages or strings either merging Velocity templates or
|
||||||
* taking directly the keys from {@link java.util.ResourceBundle}
|
* taking directly the keys from {@link java.util.ResourceBundle}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.github.polpetta.mezzotre.orm;
|
package com.github.polpetta.mezzotre.orm;
|
||||||
|
|
||||||
|
import com.github.polpetta.mezzotre.orm.model.CallbackQueryContext;
|
||||||
import com.github.polpetta.mezzotre.orm.model.query.QCallbackQueryContext;
|
import com.github.polpetta.mezzotre.orm.model.query.QCallbackQueryContext;
|
||||||
import io.ebean.typequery.PString;
|
import io.ebean.typequery.PString;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
@ -8,7 +9,14 @@ import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
// FIXME tests, doc
|
/**
|
||||||
|
* This class allows the system to lazily remove {@link CallbackQueryContextCleaner} entries that
|
||||||
|
* are no more needed, using the {@link BatchBeanCleanerService} service under the hood.
|
||||||
|
*
|
||||||
|
* @author Davide Polonio
|
||||||
|
* @see BatchBeanCleanerService
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class CallbackQueryContextCleaner {
|
public class CallbackQueryContextCleaner {
|
||||||
|
|
||||||
|
@ -26,11 +34,29 @@ public class CallbackQueryContextCleaner {
|
||||||
this.log = log;
|
this.log = log;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a group of {@link com.github.polpetta.mezzotre.orm.model.CallbackQueryContext} to be
|
||||||
|
* removed
|
||||||
|
*
|
||||||
|
* @param id the group id of the {@link
|
||||||
|
* com.github.polpetta.mezzotre.orm.model.CallbackQueryContext}
|
||||||
|
* @return a {@link CompletableFuture} with an {@link Integer} indicating how many entries have
|
||||||
|
* been deleted from the persistence layer
|
||||||
|
* @see CallbackQueryContext#getEntryGroup()
|
||||||
|
*/
|
||||||
public CompletableFuture<Integer> removeGroupAsync(String id) {
|
public CompletableFuture<Integer> removeGroupAsync(String id) {
|
||||||
log.trace("CallbackQueryContext entry group " + id + " queued for removal");
|
log.trace("CallbackQueryContext entry group " + id + " queued for removal");
|
||||||
return batchBeanCleanerService.removeAsync(id, ENTRY_GROUP.get());
|
return batchBeanCleanerService.removeAsync(id, ENTRY_GROUP.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single {@link com.github.polpetta.mezzotre.orm.model.CallbackQueryContext} to be removed
|
||||||
|
*
|
||||||
|
* @param id the id of the {@link CallbackQueryContext} to remove
|
||||||
|
* @return a {@link CompletableFuture} with an {@link Integer} indicating how many entries have
|
||||||
|
* been deleted from the persistence layer. Can be 0 or 1.
|
||||||
|
* @see CallbackQueryContext#getId()
|
||||||
|
*/
|
||||||
public CompletableFuture<Integer> removeIdAsync(String id) {
|
public CompletableFuture<Integer> removeIdAsync(String id) {
|
||||||
log.trace("CallbackQueryContext single entity " + id + " queued for removal");
|
log.trace("CallbackQueryContext single entity " + id + " queued for removal");
|
||||||
return batchBeanCleanerService.removeAsync(id, SINGLE_ENTRY.get());
|
return batchBeanCleanerService.removeAsync(id, SINGLE_ENTRY.get());
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
package com.github.polpetta.mezzotre.telegram.callbackquery;
|
package com.github.polpetta.mezzotre.telegram.callbackquery;
|
||||||
|
|
||||||
// FIXME doc
|
/**
|
||||||
|
* This interface is a placeholder to keep all fields in one place
|
||||||
|
*
|
||||||
|
* @author Davide Polonio
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
public interface Field {
|
public interface Field {
|
||||||
/**
|
/**
|
||||||
* Additional fields that are related to {@code changeLanguage} event
|
* Additional fields that are related to {@code changeLanguage} event
|
||||||
|
@ -22,6 +27,10 @@ public interface Field {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerator with custom fields for {@link
|
||||||
|
* com.github.polpetta.mezzotre.telegram.callbackquery.ShowHelp} callback query
|
||||||
|
*/
|
||||||
enum ShowHelp {
|
enum ShowHelp {
|
||||||
InvokedFromHelpMessage("invokedFromHelpMessage");
|
InvokedFromHelpMessage("invokedFromHelpMessage");
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,12 @@ import java.util.concurrent.CompletableFuture;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
// FIXME doc
|
/**
|
||||||
|
* Callback query event that is triggered only when a corresponding event is not found in the system
|
||||||
|
*
|
||||||
|
* @author Davide Polonio
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
public class NotFound implements Processor {
|
public class NotFound implements Processor {
|
||||||
|
|
||||||
private final Logger log;
|
private final Logger log;
|
||||||
|
|
|
@ -23,11 +23,21 @@ public interface Processor {
|
||||||
*/
|
*/
|
||||||
String getEventName();
|
String getEventName();
|
||||||
|
|
||||||
// FIXME javadoc
|
/**
|
||||||
|
* Determines if the Callback Query can directly be invoked by the user, such as starting an
|
||||||
|
* interaction from this point or invoking it from an inline query button
|
||||||
|
*
|
||||||
|
* @return true if it is, false otherwise
|
||||||
|
*/
|
||||||
default boolean canBeDirectlyInvokedByTheUser() {
|
default boolean canBeDirectlyInvokedByTheUser() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gives the ability to print a localized version of the event, in a pretty way
|
||||||
|
*
|
||||||
|
* @return the key for the corresponding localization string
|
||||||
|
*/
|
||||||
default Optional<String> getPrettyPrintLocaleKeyName() {
|
default Optional<String> getPrettyPrintLocaleKeyName() {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
package com.github.polpetta.mezzotre.i18n;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
import org.apache.velocity.VelocityContext;
|
||||||
|
import org.apache.velocity.app.VelocityEngine;
|
||||||
|
import org.apache.velocity.tools.ToolContext;
|
||||||
|
import org.apache.velocity.tools.ToolManager;
|
||||||
|
import org.apache.velocity.util.StringBuilderWriter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.parallel.Execution;
|
||||||
|
import org.junit.jupiter.api.parallel.ExecutionMode;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
|
@Execution(ExecutionMode.CONCURRENT)
|
||||||
|
class TemplateContentGeneratorTest {
|
||||||
|
|
||||||
|
private LocalizedMessageFactory fakeLocalizedMessageFactory;
|
||||||
|
private TemplateContentGenerator templateContentGenerator;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
fakeLocalizedMessageFactory = mock(LocalizedMessageFactory.class);
|
||||||
|
templateContentGenerator = new TemplateContentGenerator(fakeLocalizedMessageFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldCallMergeTemplateWithRightArguments() {
|
||||||
|
final VelocityEngine fakeVelocityEngine = mock(VelocityEngine.class);
|
||||||
|
final ToolManager fakeToolManager = mock(ToolManager.class);
|
||||||
|
when(fakeToolManager.getVelocityEngine()).thenReturn(fakeVelocityEngine);
|
||||||
|
final ToolContext fakeToolContext = mock(ToolContext.class);
|
||||||
|
when(fakeToolManager.createContext()).thenReturn(fakeToolContext);
|
||||||
|
when(fakeLocalizedMessageFactory.createVelocityToolManager(Locale.forLanguageTag("en-US")))
|
||||||
|
.thenReturn(fakeToolManager);
|
||||||
|
|
||||||
|
templateContentGenerator.mergeTemplate(
|
||||||
|
ctx -> {
|
||||||
|
ctx.put("testtesttest", "value");
|
||||||
|
},
|
||||||
|
"en-US",
|
||||||
|
"a/fake/path.vm");
|
||||||
|
|
||||||
|
final ArgumentCaptor<VelocityContext> velocityContextArgumentCaptor =
|
||||||
|
ArgumentCaptor.forClass(VelocityContext.class);
|
||||||
|
verify(fakeVelocityEngine, times(1))
|
||||||
|
.mergeTemplate(
|
||||||
|
eq("a/fake/path.vm"),
|
||||||
|
eq(StandardCharsets.UTF_8.name()),
|
||||||
|
velocityContextArgumentCaptor.capture(),
|
||||||
|
any(StringBuilderWriter.class));
|
||||||
|
|
||||||
|
final VelocityContext gotVelocityContext = velocityContextArgumentCaptor.getValue();
|
||||||
|
assertEquals("value", gotVelocityContext.get("testtesttest"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldCallLocaleFactoryWhenRetrievingKey() {
|
||||||
|
final Locale enUS = Locale.forLanguageTag("en-US");
|
||||||
|
|
||||||
|
class StubRB extends ResourceBundle {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object handleGetObject(@NotNull String s) {
|
||||||
|
return "testtest123";
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Enumeration<String> getKeys() {
|
||||||
|
return new Enumeration<String>() {
|
||||||
|
|
||||||
|
private boolean next = true;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasMoreElements() {
|
||||||
|
final boolean toRet = next;
|
||||||
|
next = !next;
|
||||||
|
return toRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nextElement() {
|
||||||
|
return "doens't matter";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final StubRB stubRB = new StubRB();
|
||||||
|
when(fakeLocalizedMessageFactory.createResourceBundle(any())).thenReturn(stubRB);
|
||||||
|
|
||||||
|
final String got = templateContentGenerator.getString(enUS, "a.string");
|
||||||
|
assertEquals("testtest123", got);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package com.github.polpetta.mezzotre.orm;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
import com.github.polpetta.mezzotre.helper.Loader;
|
||||||
|
import com.github.polpetta.mezzotre.helper.TestConfig;
|
||||||
|
import io.ebean.Database;
|
||||||
|
import io.ebean.typequery.PString;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Tag;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.Timeout;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.testcontainers.containers.PostgreSQLContainer;
|
||||||
|
import org.testcontainers.junit.jupiter.Container;
|
||||||
|
import org.testcontainers.junit.jupiter.Testcontainers;
|
||||||
|
|
||||||
|
@Tag("slow")
|
||||||
|
@Tag("database")
|
||||||
|
@Tag("velocity")
|
||||||
|
@Testcontainers
|
||||||
|
class CallbackQueryContextCleanerIntegrationTest {
|
||||||
|
|
||||||
|
@Container
|
||||||
|
private final PostgreSQLContainer<?> postgresServer =
|
||||||
|
new PostgreSQLContainer<>(TestConfig.POSTGRES_DOCKER_IMAGE);
|
||||||
|
|
||||||
|
private Database database;
|
||||||
|
|
||||||
|
private BatchBeanCleanerService fakeBatchBeanCleanerService;
|
||||||
|
private CallbackQueryContextCleaner callbackQueryContextCleaner;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() throws Exception {
|
||||||
|
database =
|
||||||
|
Loader.connectToDatabase(Loader.loadDefaultEbeanConfigWithPostgresSettings(postgresServer));
|
||||||
|
|
||||||
|
fakeBatchBeanCleanerService = mock(BatchBeanCleanerService.class);
|
||||||
|
|
||||||
|
callbackQueryContextCleaner =
|
||||||
|
new CallbackQueryContextCleaner(
|
||||||
|
fakeBatchBeanCleanerService,
|
||||||
|
LoggerFactory.getLogger(CallbackQueryContextCleaner.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Timeout(value = 1, unit = TimeUnit.MINUTES)
|
||||||
|
void shouldDeleteByGroupId() throws Exception {
|
||||||
|
when(fakeBatchBeanCleanerService.removeAsync(eq("an id"), any()))
|
||||||
|
.thenReturn(CompletableFuture.completedFuture(1));
|
||||||
|
|
||||||
|
final Integer got = callbackQueryContextCleaner.removeGroupAsync("an id").get();
|
||||||
|
|
||||||
|
final ArgumentCaptor<PString> pStringArgumentCaptor = ArgumentCaptor.forClass(PString.class);
|
||||||
|
verify(fakeBatchBeanCleanerService, times(1))
|
||||||
|
.removeAsync(eq("an id"), pStringArgumentCaptor.capture());
|
||||||
|
assertEquals(1, got);
|
||||||
|
assertEquals("entryGroup", pStringArgumentCaptor.getValue().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Timeout(value = 1, unit = TimeUnit.MINUTES)
|
||||||
|
void shouldDeleteById() throws Exception {
|
||||||
|
when(fakeBatchBeanCleanerService.removeAsync(eq("an id"), any()))
|
||||||
|
.thenReturn(CompletableFuture.completedFuture(1));
|
||||||
|
|
||||||
|
final Integer got = callbackQueryContextCleaner.removeIdAsync("an id").get();
|
||||||
|
|
||||||
|
final ArgumentCaptor<PString> pStringArgumentCaptor = ArgumentCaptor.forClass(PString.class);
|
||||||
|
verify(fakeBatchBeanCleanerService, times(1))
|
||||||
|
.removeAsync(eq("an id"), pStringArgumentCaptor.capture());
|
||||||
|
assertEquals(1, got);
|
||||||
|
assertEquals("id", pStringArgumentCaptor.getValue().toString());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue