markdownfs / tests /integration /workflows.rs
Subramanya97's picture
Deploy from markdownfs@ee79781
6d57fe0
Raw
History Blame Contribute Delete
3.31 kB
use super::*;
use markdownfs::auth::session::Session;
use markdownfs::vcs::Vcs;
#[test]
fn test_full_project_workflow() {
let mut fs = VirtualFs::new();
let mut vcs = Vcs::new();
// Setup project
exec("mkdir -p src/lib", &mut fs);
exec("mkdir -p docs/api", &mut fs);
exec("mkdir tests", &mut fs);
exec("cd src", &mut fs);
exec("touch main.md", &mut fs);
exec("write main.md # Main entry point", &mut fs);
exec("cd lib", &mut fs);
exec("touch utils.md", &mut fs);
exec("write utils.md # Utility functions\n\n## Helpers\n\n- parse()\n- format()", &mut fs);
exec("cd /docs/api", &mut fs);
exec("touch endpoints.md", &mut fs);
exec("write endpoints.md # API Endpoints\n\n## GET /users\n## POST /users", &mut fs);
exec("cd /tests", &mut fs);
exec("touch test_api.md", &mut fs);
exec("write test_api.md # API Tests\n\n- [ ] Test GET\n- [ ] Test POST", &mut fs);
exec("cd /", &mut fs);
exec("touch readme.md", &mut fs);
exec("write readme.md # My Project\n\nA cool project.", &mut fs);
let id1 = vcs.commit(&fs, "initial project setup", "root").unwrap();
// Verify tree
let tree = exec("tree", &mut fs);
assert!(tree.contains("src/"));
assert!(tree.contains("docs/"));
assert!(tree.contains("tests/"));
// Verify find
let found = exec("find . -name *.md", &mut fs);
assert_eq!(found.lines().count(), 5); // main, utils, endpoints, test_api, readme
// Verify grep
let grep = exec("grep -r API .", &mut fs);
assert!(grep.contains("endpoints.md"));
assert!(grep.contains("test_api.md"));
// Make changes
exec("write readme.md # My Project v2\n\nImproved.", &mut fs);
vcs.commit(&fs, "update readme", "root").unwrap();
// Revert
vcs.revert(&mut fs, &id1.short_hex()).unwrap();
assert!(exec("cat readme.md", &mut fs).contains("A cool project."));
}
#[test]
fn test_multiuser_workflow() {
let mut fs = VirtualFs::new();
let mut session = Session::root();
// Admin creates users
exec_s("adduser alice", &mut fs, &mut session);
exec_s("adduser bob", &mut fs, &mut session);
exec_s("addgroup engineering", &mut fs, &mut session);
exec_s("usermod -aG engineering alice", &mut fs, &mut session);
exec_s("usermod -aG engineering bob", &mut fs, &mut session);
// Setup shared space
exec_s("mkdir shared", &mut fs, &mut session);
exec_s("chown root:engineering shared", &mut fs, &mut session);
exec_s("chmod 2775 shared", &mut fs, &mut session);
// Switch to alice
exec_s("su alice", &mut fs, &mut session);
assert_eq!(session.username, "alice");
exec_s("touch shared/alice-work.md", &mut fs, &mut session);
exec_s("write shared/alice-work.md Alice design notes", &mut fs, &mut session);
exec_s("chmod 664 shared/alice-work.md", &mut fs, &mut session);
// Switch back to root, then to bob
session = Session::root();
exec_s("su bob", &mut fs, &mut session);
assert_eq!(session.username, "bob");
exec_s("touch shared/bob-work.md", &mut fs, &mut session);
// Bob can read alice's work (group permission via setgid inheritance)
let content = exec_s("cat shared/alice-work.md", &mut fs, &mut session);
assert!(content.contains("Alice design notes"));
}