mirror of
https://github.com/aljazceru/pubky-core.git
synced 2026-01-09 09:14:22 +01:00
fix(homeserver): /events/ iterator and write unit test in pubky
This commit is contained in:
@@ -91,10 +91,10 @@ impl DB {
|
||||
if path.starts_with("pub/") {
|
||||
let url = format!("pubky://{key}");
|
||||
|
||||
let event = Event::put(&url);
|
||||
let event = Event::delete(&url);
|
||||
let value = event.serialize();
|
||||
|
||||
let key = entry.timestamp.to_string();
|
||||
let key = Timestamp::now().to_string();
|
||||
|
||||
self.tables.events.put(&mut wtxn, &key, &value)?;
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@ impl Event {
|
||||
Self::Put(url.to_string())
|
||||
}
|
||||
|
||||
pub fn delete(url: &str) -> Self {
|
||||
Self::Delete(url.to_string())
|
||||
}
|
||||
|
||||
pub fn serialize(&self) -> Vec<u8> {
|
||||
to_allocvec(self).expect("Session::serialize")
|
||||
}
|
||||
|
||||
@@ -30,15 +30,21 @@ pub async fn feed(
|
||||
.map(|c| c.as_str())
|
||||
.unwrap_or("0000000000000");
|
||||
|
||||
// Guard against bad cursor
|
||||
if cursor.len() < 13 {
|
||||
cursor = "0000000000000"
|
||||
}
|
||||
|
||||
let mut result: Vec<String> = vec![];
|
||||
let mut next_cursor = "".to_string();
|
||||
let mut next_cursor = cursor.to_string();
|
||||
|
||||
for _ in 0..limit {
|
||||
match state.db.tables.events.get_greater_than(&txn, cursor)? {
|
||||
match state
|
||||
.db
|
||||
.tables
|
||||
.events
|
||||
.get_greater_than(&txn, &next_cursor)?
|
||||
{
|
||||
Some((timestamp, event_bytes)) => {
|
||||
let event = Event::deserialize(event_bytes)?;
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ mod tests {
|
||||
|
||||
use pkarr::{mainline::Testnet, Keypair};
|
||||
use pubky_homeserver::Homeserver;
|
||||
use reqwest::StatusCode;
|
||||
use reqwest::{Method, StatusCode};
|
||||
|
||||
#[tokio::test]
|
||||
async fn put_get_delete() {
|
||||
@@ -627,4 +627,108 @@ mod tests {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn list_events() {
|
||||
let testnet = Testnet::new(10);
|
||||
let server = Homeserver::start_test(&testnet).await.unwrap();
|
||||
|
||||
let client = PubkyClient::test(&testnet);
|
||||
|
||||
let keypair = Keypair::random();
|
||||
|
||||
client.signup(&keypair, &server.public_key()).await.unwrap();
|
||||
|
||||
let urls = vec![
|
||||
format!("pubky://{}/pub/a.com/a.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.com/a.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.com/b.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.com/c.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.com/d.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.con/d.txt", keypair.public_key()),
|
||||
format!("pubky://{}/pub/example.con", keypair.public_key()),
|
||||
format!("pubky://{}/pub/file", keypair.public_key()),
|
||||
format!("pubky://{}/pub/file2", keypair.public_key()),
|
||||
format!("pubky://{}/pub/z.com/a.txt", keypair.public_key()),
|
||||
];
|
||||
|
||||
for url in urls {
|
||||
client.put(url.as_str(), &[0]).await.unwrap();
|
||||
client.delete(url.as_str()).await.unwrap();
|
||||
}
|
||||
|
||||
let feed_url = format!("http://localhost:{}/events/", server.port());
|
||||
let feed_url = feed_url.as_str();
|
||||
|
||||
let client = PubkyClient::test(&testnet);
|
||||
|
||||
let cursor;
|
||||
|
||||
{
|
||||
let response = client
|
||||
.request(
|
||||
Method::GET,
|
||||
format!("{feed_url}?limit=10").as_str().try_into().unwrap(),
|
||||
)
|
||||
.send()
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let text = response.text().await.unwrap();
|
||||
let lines = text.split('\n').collect::<Vec<_>>();
|
||||
|
||||
cursor = lines.last().unwrap().split(" ").last().unwrap().to_string();
|
||||
|
||||
assert_eq!(
|
||||
lines,
|
||||
vec![
|
||||
format!("PUT pubky://{}/pub/a.com/a.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/a.com/a.txt", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/example.com/a.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.com/a.txt", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/example.com/b.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.com/b.txt", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/example.com/c.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.com/c.txt", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/example.com/d.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.com/d.txt", keypair.public_key()),
|
||||
format!("cursor: {cursor}",)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
let response = client
|
||||
.request(
|
||||
Method::GET,
|
||||
format!("{feed_url}?limit=10&cursor={cursor}")
|
||||
.as_str()
|
||||
.try_into()
|
||||
.unwrap(),
|
||||
)
|
||||
.send()
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let text = response.text().await.unwrap();
|
||||
let lines = text.split('\n').collect::<Vec<_>>();
|
||||
|
||||
assert_eq!(
|
||||
lines,
|
||||
vec![
|
||||
format!("PUT pubky://{}/pub/example.con/d.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.con/d.txt", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/example.con", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/example.con", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/file", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/file", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/file2", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/file2", keypair.public_key()),
|
||||
format!("PUT pubky://{}/pub/z.com/a.txt", keypair.public_key()),
|
||||
format!("DEL pubky://{}/pub/z.com/a.txt", keypair.public_key()),
|
||||
lines.last().unwrap().to_string()
|
||||
]
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user