lightweight com.atproto.sync.listReposByCollection
45
fork

Configure Feed

Select the types of activity you want to include in your feed.

tests for scan_repos

phil 096ecf45 72d7b103

+150 -1
+1 -1
src/mst/mortality.rs
··· 310 310 use cid::Cid as IpldCid; 311 311 use jacquard_api::com_atproto::sync::subscribe_repos::RepoOp; 312 312 use jacquard_common::CowStr; 313 - use jacquard_common::types::string::{Did, Nsid}; 313 + use jacquard_common::types::string::Did; 314 314 use jacquard_common::types::tid::Tid; 315 315 use jacquard_repo::car::reader::ParsedCar; 316 316 use jacquard_repo::commit::Commit;
+149
src/storage/repo.rs
··· 658 658 assert_eq!(next1, None); 659 659 } 660 660 661 + // --- scan_repos --- 662 + 663 + fn mk_state(db: &DbRef, d: &Did<'static>, state: RepoState, status: AccountStatus) { 664 + put_info( 665 + db, 666 + d, 667 + &RepoInfo { 668 + state, 669 + status, 670 + error: None, 671 + }, 672 + ) 673 + .unwrap(); 674 + } 675 + 676 + #[test] 677 + fn scan_repos_empty_returns_empty() { 678 + let db = open_temporary().unwrap(); 679 + let (entries, next) = scan_repos(&db, None, 10).unwrap(); 680 + assert!(entries.is_empty()); 681 + assert_eq!(next, None); 682 + } 683 + 684 + #[test] 685 + fn scan_repos_returns_all_regardless_of_status() { 686 + let db = open_temporary().unwrap(); 687 + let alice = did("did:web:alice.test"); 688 + let bob = did("did:web:bob.test"); 689 + let carol = did("did:web:carol.test"); 690 + mk_state(&db, &alice, RepoState::Active, AccountStatus::Active); 691 + mk_state(&db, &bob, RepoState::Takendown, AccountStatus::Takendown); 692 + mk_state(&db, &carol, RepoState::Suspended, AccountStatus::Suspended); 693 + 694 + let (entries, next) = scan_repos(&db, None, 10).unwrap(); 695 + assert_eq!(entries.len(), 3); 696 + assert_eq!(entries[0].did, alice); 697 + assert_eq!(entries[0].info.status, AccountStatus::Active); 698 + assert_eq!(entries[1].did, bob); 699 + assert_eq!(entries[1].info.status, AccountStatus::Takendown); 700 + assert_eq!(entries[2].did, carol); 701 + assert_eq!(entries[2].info.status, AccountStatus::Suspended); 702 + assert_eq!(next, None); 703 + } 704 + 705 + #[test] 706 + fn scan_repos_prev_is_none_when_absent() { 707 + let db = open_temporary().unwrap(); 708 + let d = did("did:web:example.test"); 709 + mk_state(&db, &d, RepoState::Active, AccountStatus::Active); 710 + 711 + let (entries, _) = scan_repos(&db, None, 10).unwrap(); 712 + assert_eq!(entries.len(), 1); 713 + assert!(entries[0].prev.is_none()); 714 + } 715 + 716 + #[test] 717 + fn scan_repos_prev_is_some_when_present() { 718 + let db = open_temporary().unwrap(); 719 + let d = did("did:web:example.test"); 720 + mk_state(&db, &d, RepoState::Active, AccountStatus::Active); 721 + put_prev( 722 + &db, 723 + &d, 724 + &RepoPrev { 725 + rev: tid("3lczouzaqmo2e"), 726 + prev_data: vec![1, 2, 3], 727 + }, 728 + ) 729 + .unwrap(); 730 + 731 + let (entries, _) = scan_repos(&db, None, 10).unwrap(); 732 + assert_eq!(entries.len(), 1); 733 + let prev = entries[0].prev.as_ref().unwrap(); 734 + assert_eq!(prev.rev.as_str(), "3lczouzaqmo2e"); 735 + assert_eq!(prev.prev_data, vec![1, 2, 3]); 736 + } 737 + 738 + #[test] 739 + fn scan_repos_paginates() { 740 + let db = open_temporary().unwrap(); 741 + let alice = did("did:web:alice.test"); 742 + let bob = did("did:web:bob.test"); 743 + let carol = did("did:web:carol.test"); 744 + for d in [&alice, &bob, &carol] { 745 + mk(&db, d, AccountStatus::Active); 746 + } 747 + 748 + let (page0, next0) = scan_repos(&db, None, 2).unwrap(); 749 + assert_eq!(page0.len(), 2); 750 + assert_eq!(page0[0].did, alice); 751 + assert_eq!(page0[1].did, bob); 752 + assert_eq!(next0, Some(carol.clone())); 753 + 754 + let (page1, next1) = scan_repos(&db, next0.as_ref(), 2).unwrap(); 755 + assert_eq!(page1.len(), 1); 756 + assert_eq!(page1[0].did, carol); 757 + assert_eq!(next1, None); 758 + } 759 + 760 + #[test] 761 + fn scan_repos_cursor_is_inclusive() { 762 + let db = open_temporary().unwrap(); 763 + let alice = did("did:web:alice.test"); 764 + let bob = did("did:web:bob.test"); 765 + mk(&db, &alice, AccountStatus::Active); 766 + mk(&db, &bob, AccountStatus::Active); 767 + 768 + // Starting at alice returns alice onwards, not skipping it. 769 + let (entries, _) = scan_repos(&db, Some(&alice), 10).unwrap(); 770 + assert_eq!(entries.len(), 2); 771 + assert_eq!(entries[0].did, alice); 772 + assert_eq!(entries[1].did, bob); 773 + } 774 + 775 + #[test] 776 + fn scan_repos_limit_exceeds_total() { 777 + let db = open_temporary().unwrap(); 778 + let d = did("did:web:example.test"); 779 + mk(&db, &d, AccountStatus::Active); 780 + 781 + let (entries, next) = scan_repos(&db, None, 100).unwrap(); 782 + assert_eq!(entries.len(), 1); 783 + assert_eq!(next, None); 784 + } 785 + 786 + #[test] 787 + fn scan_repos_info_fields_preserved() { 788 + let db = open_temporary().unwrap(); 789 + let d = did("did:web:broken.test"); 790 + mk_state(&db, &d, RepoState::Error, AccountStatus::Deactivated); 791 + // Write error message via put_info 792 + put_info( 793 + &db, 794 + &d, 795 + &RepoInfo { 796 + state: RepoState::Error, 797 + status: AccountStatus::Deactivated, 798 + error: Some("something broke".to_owned()), 799 + }, 800 + ) 801 + .unwrap(); 802 + 803 + let (entries, _) = scan_repos(&db, None, 10).unwrap(); 804 + assert_eq!(entries.len(), 1); 805 + assert_eq!(entries[0].info.state, RepoState::Error); 806 + assert_eq!(entries[0].info.status, AccountStatus::Deactivated); 807 + assert_eq!(entries[0].info.error.as_deref(), Some("something broke")); 808 + } 809 + 661 810 #[test] 662 811 fn put_and_get_prev() { 663 812 let db = open_temporary().unwrap();