Spaces:
Running
Running
| use super::*; | |
| use markdownfs::auth::session::Session; | |
| use markdownfs::vcs::Vcs; | |
| 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.")); | |
| } | |
| 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")); | |
| } | |