fix: bunch of TODOs
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user