use duoload::duocards::models::{LearningStatus, VocabularyCard};
use duoload::output::anki::AnkiPackageBuilder;
use duoload::output::{OutputBuilder, OutputDestination};
use tempfile::NamedTempFile;
fn create_test_card(
word: &str,
translation: &str,
example: Option<&str>,
status: LearningStatus,
) -> VocabularyCard {
VocabularyCard {
word: word.to_string(),
translation: translation.to_string(),
example: example.map(|s| s.to_string()),
status,
}
}
#[tokio::test]
async fn test_end_to_end_anki_package_creation() {
let mut builder = AnkiPackageBuilder::new("Integration Test Deck");
let cards = vec![
create_test_card("hello", "hola", Some("Hello, world!"), LearningStatus::New),
create_test_card(
"goodbye",
"adiós",
Some("Goodbye, world!"),
LearningStatus::Learning,
),
create_test_card(
"thank you",
"gracias",
Some("Thank you very much!"),
LearningStatus::Known,
),
];
for card in cards {
assert!(builder.add_note(card).unwrap());
}
let temp_file = NamedTempFile::new().unwrap();
let result = builder.write(OutputDestination::File(temp_file.path()));
assert!(result.is_ok()); assert!(temp_file.path().exists()); }
#[tokio::test]
async fn test_anki_duplicate_handling() {
let mut builder = AnkiPackageBuilder::new("Duplicate Test Deck");
let card1 = create_test_card("hello", "hola", Some("Hello, world!"), LearningStatus::New);
assert!(builder.add_note(card1).unwrap());
let card2 = create_test_card(
"hello", "bonjour", Some("Bonjour le monde!"), LearningStatus::Learning, );
assert!(!builder.add_note(card2).unwrap());
let card3 = create_test_card(
"goodbye",
"adiós",
Some("Goodbye, world!"),
LearningStatus::Known,
);
assert!(builder.add_note(card3).unwrap());
let temp_file = NamedTempFile::new().unwrap();
let result = builder.write(OutputDestination::File(temp_file.path()));
assert!(result.is_ok()); assert!(temp_file.path().exists()); }
#[tokio::test]
async fn test_empty_anki_deck_creation() {
let builder = AnkiPackageBuilder::new("Empty Deck");
let temp_file = NamedTempFile::new().unwrap();
let result = builder.write(OutputDestination::File(temp_file.path()));
assert!(result.is_ok()); assert!(temp_file.path().exists()); }
#[tokio::test]
async fn test_large_anki_deck_creation() {
let mut builder = AnkiPackageBuilder::new("Large Test Deck");
for i in 0..100 {
let word = format!("word{}", i);
let translation = format!("translation{}", i);
let example = format!("Example sentence for word{}", i);
let status = match i % 3 {
0 => LearningStatus::New,
1 => LearningStatus::Learning,
_ => LearningStatus::Known,
};
let card = create_test_card(&word, &translation, Some(&example), status);
assert!(builder.add_note(card).unwrap());
}
let temp_file = NamedTempFile::new().unwrap();
let result = builder.write(OutputDestination::File(temp_file.path()));
assert!(result.is_ok()); assert!(temp_file.path().exists()); }