Merge branch 'fix/wiring_print_button_with_functionality' into 'main'
wiring the print button with the export service See merge request cse1105/2025-2026/teams/csep-team-76!51
This commit is contained in:
commit
5a17179fcb
2 changed files with 166 additions and 6 deletions
|
|
@ -6,11 +6,15 @@ import client.utils.Config;
|
||||||
import client.utils.ConfigService;
|
import client.utils.ConfigService;
|
||||||
import client.utils.LocaleAware;
|
import client.utils.LocaleAware;
|
||||||
import client.utils.LocaleManager;
|
import client.utils.LocaleManager;
|
||||||
|
import client.utils.PrintExportService;
|
||||||
import client.utils.ServerUtils;
|
import client.utils.ServerUtils;
|
||||||
import client.utils.WebSocketDataService;
|
import client.utils.WebSocketDataService;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import commons.Recipe;
|
import commons.Recipe;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
@ -19,12 +23,13 @@ import javafx.scene.control.Button;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.control.ListView;
|
||||||
import javafx.scene.control.TextField;
|
import javafx.scene.control.TextField;
|
||||||
|
import javafx.scene.control.TextInputDialog;
|
||||||
import javafx.scene.control.ComboBox;
|
import javafx.scene.control.ComboBox;
|
||||||
import javafx.scene.input.KeyCode;
|
import javafx.scene.input.KeyCode;
|
||||||
import javafx.scene.layout.HBox;
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
import javafx.scene.text.Font;
|
import javafx.scene.text.Font;
|
||||||
import org.apache.commons.lang3.NotImplementedException;
|
import javafx.stage.DirectoryChooser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for the recipe detail view.
|
* Controller for the recipe detail view.
|
||||||
|
|
@ -251,15 +256,47 @@ public class RecipeDetailCtrl implements LocaleAware {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print the currently viewed recipe.
|
* Gives the User a download file prompt and lets the
|
||||||
|
* user change the name of the downloaded file and
|
||||||
|
* uses printExportService to create a downloadable file.
|
||||||
*/
|
*/
|
||||||
@FXML
|
@FXML
|
||||||
private void printRecipe() {
|
private void printRecipe() {
|
||||||
// TODO: actually make it print?
|
if (recipe == null) {
|
||||||
throw new NotImplementedException("TODO:: Integrate with Print/Export service");
|
return; // Do nothing if no recipe selected
|
||||||
// System.out.println("Recipe printed");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
// Open directory chooser
|
||||||
|
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||||||
|
directoryChooser.setTitle("Select Folder to Save Recipe");
|
||||||
|
|
||||||
|
File selectedDirectory = directoryChooser.showDialog(
|
||||||
|
printRecipeButton.getScene().getWindow());
|
||||||
|
|
||||||
|
if (selectedDirectory == null) {
|
||||||
|
return; // User cancelled
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ask for filename
|
||||||
|
TextInputDialog dialog = new TextInputDialog(recipe.getName() + ".txt");
|
||||||
|
dialog.setTitle("Save Recipe");
|
||||||
|
dialog.setHeaderText("Enter filename for the recipe");
|
||||||
|
dialog.setContentText("Filename:");
|
||||||
|
|
||||||
|
Optional<String> result = dialog.showAndWait();
|
||||||
|
|
||||||
|
if (result.isPresent()) {
|
||||||
|
String filename = result.get();
|
||||||
|
if (!filename.endsWith(".txt")) {
|
||||||
|
filename = filename + ".txt";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use PrintExportService methods
|
||||||
|
String recipeText = PrintExportService.buildRecipeText(recipe);
|
||||||
|
Path dirPath = selectedDirectory.toPath();
|
||||||
|
PrintExportService.exportToFile(recipeText, dirPath, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Toggles the favourite status of the currently viewed recipe in the
|
* Toggles the favourite status of the currently viewed recipe in the
|
||||||
* application configuration and writes the changes to disk.
|
* application configuration and writes the changes to disk.
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,129 @@ public class PrintExportTest {
|
||||||
()->PrintExportService.validateFolder(filePath));
|
()->PrintExportService.validateFolder(filePath));
|
||||||
assertEquals("Given path is not a folder", i.getMessage());
|
assertEquals("Given path is not a folder", i.getMessage());
|
||||||
}
|
}
|
||||||
|
@Test
|
||||||
|
public void buildRecipeTextWithMultipleIngredientsTest() {
|
||||||
|
List<RecipeIngredient> ingredients = new ArrayList<>();
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("Flour"));
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("Sugar"));
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("Eggs"));
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("Butter"));
|
||||||
|
|
||||||
|
final long testRecipeId = 300L;
|
||||||
|
|
||||||
|
List<String> steps = new ArrayList<>();
|
||||||
|
steps.add("Mix the solid ingredients");
|
||||||
|
steps.add("Then add the wet ingredients");
|
||||||
|
steps.add("Bake");
|
||||||
|
|
||||||
|
Recipe recipe = new Recipe(
|
||||||
|
testRecipeId,
|
||||||
|
"Cake",
|
||||||
|
"Test description",
|
||||||
|
ingredients,
|
||||||
|
steps
|
||||||
|
);
|
||||||
|
|
||||||
|
String result = PrintExportService.buildRecipeText(recipe);
|
||||||
|
|
||||||
|
assertTrue(result.contains("Some Flour"));
|
||||||
|
assertTrue(result.contains("Some Sugar"));
|
||||||
|
assertTrue(result.contains("Some Eggs"));
|
||||||
|
assertTrue(result.contains("Some Butter"));
|
||||||
|
assertTrue(result.contains("3: Bake"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void exportToFileWithComplexRecipeTest() throws IOException {
|
||||||
|
List<RecipeIngredient> ingredients = new ArrayList<>();
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("tomato"));
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("potato"));
|
||||||
|
|
||||||
|
final long testRecipeId = 500L;
|
||||||
|
|
||||||
|
List<String> steps = new ArrayList<>();
|
||||||
|
steps.add("cut up the ingredients");
|
||||||
|
steps.add("Cook");
|
||||||
|
|
||||||
|
Recipe recipe = new Recipe(
|
||||||
|
testRecipeId,
|
||||||
|
"stew",
|
||||||
|
"Test description",
|
||||||
|
ingredients,
|
||||||
|
steps
|
||||||
|
);
|
||||||
|
|
||||||
|
String recipeData = PrintExportService.buildRecipeText(recipe);
|
||||||
|
String fileName = "stew_recipe.txt";
|
||||||
|
|
||||||
|
PrintExportService.exportToFile(recipeData, tempDir, fileName);
|
||||||
|
|
||||||
|
Path expectedFile = tempDir.resolve(fileName);
|
||||||
|
assertTrue(Files.exists(expectedFile));
|
||||||
|
|
||||||
|
String fileContent = Files.readString(expectedFile);
|
||||||
|
assertTrue(fileContent.contains("stew"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void exportFileWithInvalidFolderTest(){
|
||||||
|
Path invalidfilePath = Path.of("/invalid/folder/path");
|
||||||
|
String recipeData = "Test Data";
|
||||||
|
String fileName = "test.txt";
|
||||||
|
assertThrows(IllegalArgumentException.class,
|
||||||
|
() -> PrintExportService.exportToFile(recipeData, invalidfilePath, fileName));
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void exportToFileOverwritesExistingFileTest() throws IOException {
|
||||||
|
String fileName = "recipe.txt";
|
||||||
|
Path filePath = tempDir.resolve(fileName);
|
||||||
|
Files.writeString(filePath, "Old stuff");
|
||||||
|
String newContent = "New recipe data";
|
||||||
|
PrintExportService.exportToFile(newContent, tempDir, fileName);
|
||||||
|
String fileContent = Files.readString(filePath);
|
||||||
|
assertEquals(newContent, fileContent);
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void exportToFileSuccessTest() throws IOException {
|
||||||
|
String recipeData = "Test Recipe Content";
|
||||||
|
String fileName = "test_recipe.txt";
|
||||||
|
PrintExportService.exportToFile(recipeData, tempDir, fileName);
|
||||||
|
Path expectedFile = tempDir.resolve(fileName);
|
||||||
|
assertTrue(Files.exists(expectedFile));
|
||||||
|
String fileContent = Files.readString(expectedFile);
|
||||||
|
assertEquals(recipeData, fileContent);
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void buildRecipeTextWithEmptyStepsTest() {
|
||||||
|
List<RecipeIngredient> ingredients = new ArrayList<>();
|
||||||
|
ingredients.add(DefaultValueFactory.getDefaultVagueIngredient("Water"));
|
||||||
|
|
||||||
|
final long testRecipeId = 200L;
|
||||||
|
|
||||||
|
Recipe recipe = new Recipe(
|
||||||
|
testRecipeId,
|
||||||
|
"Water",
|
||||||
|
"Test description",
|
||||||
|
ingredients,
|
||||||
|
new ArrayList<>()
|
||||||
|
);
|
||||||
|
|
||||||
|
String result = PrintExportService.buildRecipeText(recipe);
|
||||||
|
|
||||||
|
assertTrue(result.contains("Title: Water"));
|
||||||
|
assertTrue(result.contains("Recipe ID: 200"));
|
||||||
|
assertTrue(result.contains("Ingredients: Some Water"));
|
||||||
|
assertTrue(result.contains("Steps:"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateFolderWithGarbagePathTest(){
|
||||||
|
Path garbagePath = Path.of("/this/path/does/not/exist/at/all");
|
||||||
|
IllegalArgumentException i = assertThrows(IllegalArgumentException.class,
|
||||||
|
()->PrintExportService.validateFolder(garbagePath));
|
||||||
|
assertEquals("Folder does not exist", i.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void succesExportTest() throws IOException {
|
public void succesExportTest() throws IOException {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue