feat(app-backend): build tauri desktop app backend, clipboard listener, and system tray
This commit is contained in:
@@ -0,0 +1,369 @@
|
||||
# CleanCopy E2E Manual Testing Sandbox
|
||||
|
||||
Use this document to manually verify that all clipboard sanitization rules work correctly end-to-end.
|
||||
|
||||
## How to Use
|
||||
|
||||
1. Make sure CleanCopy is running in the system tray.
|
||||
2. Copy the **"Copy this"** block to your clipboard (`Ctrl+C`).
|
||||
3. Press the CleanCopy hotkey (`Alt + Shift + C` or your configured shortcut).
|
||||
4. Paste the result into a text editor and compare with the **Expected Output**.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- CleanCopy is running in the system tray (lavender clipboard icon).
|
||||
- All cleaning rules are **enabled** in Settings -> Rules (unless a scenario says otherwise).
|
||||
- You have a text editor open to paste and inspect results.
|
||||
|
||||
## [URL] Scenario 1: Tracking Parameter Scrubber
|
||||
|
||||
Tests the removal of marketing and analytic trackers while preserving legitimate query variables.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
https://example.com/shop/item-102?utm_source=newsletter&utm_medium=email&utm_campaign=summer_sale&gclid=CL_12345&fbclid=FB_67890&si=SI_abcde&q=running+shoes&category=activewear
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
https://example.com/shop/item-102?q=running+shoes&category=activewear
|
||||
```
|
||||
|
||||
_(Tracks `utm_source`, `utm_medium`, `utm_campaign`, `gclid`, `fbclid`, and `si` are stripped; `q` and `category` are kept.)_
|
||||
|
||||
## [URL] Scenario 2: Custom URL Parameters
|
||||
|
||||
Tests that user-defined custom tracking params (added in Settings -> Rules) are also stripped.
|
||||
|
||||
### Setup
|
||||
|
||||
In Settings -> Rules, type `foo,bar` in the custom tracking parameters input and wait for the save indicator.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
https://example.com/page?foo=abc&bar=123&keep=this&utm_source=x
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
https://example.com/page?keep=this
|
||||
```
|
||||
|
||||
_(Custom params `foo` and `bar` are stripped alongside built-in `utm_source`.)_
|
||||
|
||||
## [URL] Scenario 3: URL with Only Tracked Parameters
|
||||
|
||||
Tests that a URL with no legitimate params is cleaned of the entire query string.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
https://example.com/article?utm_source=newsletter&utm_medium=email&gclid=abc123&fbclid=xyz789
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
https://example.com/article
|
||||
```
|
||||
|
||||
_(All params were trackers — the `?` is removed entirely.)_
|
||||
|
||||
## [URL] Scenario 4: Multiple URLs in One Clipboard
|
||||
|
||||
Tests that all URLs in a single clipboard block get their trackers stripped independently.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
Check these links:
|
||||
https://store.com/deal?utm_source=ad&product=shoes
|
||||
https://blog.com/post?gclid=123&id=456
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
Check these links:
|
||||
https://store.com/deal?product=shoes
|
||||
https://blog.com/post?id=456
|
||||
```
|
||||
|
||||
_(Both URLs have their trackers stripped independently.)_
|
||||
|
||||
## [URL] Scenario 5: Already-Clean URL Passes Through
|
||||
|
||||
Tests that a URL with no tracking parameters is left completely untouched.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
https://example.com/docs/getting-started?section=install&version=2
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
https://example.com/docs/getting-started?section=install&version=2
|
||||
```
|
||||
|
||||
_(No trackers present — URL is unchanged.)_
|
||||
|
||||
## [TYPOGRAPHY] Scenario 6: Smart Quotes & Dash Typography
|
||||
|
||||
Tests the transformation of curly quotes, smart apostrophes, en-dashes, and em-dashes.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
"The developer's code," she said — "should compile without warnings." The cost was $5–$10.
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
"The developer's code," she said -- "should compile without warnings." The cost was $5-$10.
|
||||
```
|
||||
|
||||
_(Curly double quotes → `"`, smart apostrophe → `'`, em-dash → `--`, en-dash → `-`.)_
|
||||
|
||||
## [TYPOGRAPHY] Scenario 7: Invisible Character Cleanup
|
||||
|
||||
Tests removal of zero-width spaces, null bytes, and other invisible Unicode characters.
|
||||
|
||||
### Copy this (these contain invisible characters)
|
||||
|
||||
```text
|
||||
Hello World
|
||||
```
|
||||
|
||||
_(Each letter above is separated by zero-width spaces U+200B.)_
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
Hello World
|
||||
```
|
||||
|
||||
_(All zero-width spaces are removed, letters join together.)_
|
||||
|
||||
## [NEWLINES] Scenario 8: Messenger Line-Break Collapse
|
||||
|
||||
Tests that single line wraps from chat apps are joined, while paragraph breaks are preserved.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
This is a long sentence that got split
|
||||
across multiple lines by a chat app's
|
||||
auto-wrap feature.
|
||||
|
||||
This second paragraph should remain on
|
||||
its own separate line.
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
This is a long sentence that got split across multiple lines by a chat app's auto-wrap feature.
|
||||
|
||||
This second paragraph should remain on its own separate line.
|
||||
```
|
||||
|
||||
_(Single line breaks → space; double-newline paragraph break preserved.)_
|
||||
|
||||
## [NEWLINES] Scenario 9: Hyphenated Line Break
|
||||
|
||||
Tests that words split with a hyphen at end-of-line are rejoined correctly.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
This is an example of inno-
|
||||
vation that was split across lines.
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
This is an example of innovation that was split across lines.
|
||||
```
|
||||
|
||||
_(The hyphen at end of line is removed and the word is joined.)_
|
||||
|
||||
## [NEWLINES] Scenario 10: Markdown List & Header Preservation
|
||||
|
||||
Tests that Markdown structure (headers, lists) is not collapsed.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
# Main Header
|
||||
* Item 1 in list
|
||||
* Item 2 in list
|
||||
|
||||
Here is some body text.
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
# Main Header
|
||||
* Item 1 in list
|
||||
* Item 2 in list
|
||||
|
||||
Here is some body text.
|
||||
```
|
||||
|
||||
_(Markdown lists and headers are preserved — the line-joining cleanser skips them.)_
|
||||
|
||||
## [COMBINED] Scenario 11: Multiple Cleansers Combined
|
||||
|
||||
Tests all rules running simultaneously on a single dirty clipboard block.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
"Check this link—it's amazing!"
|
||||
https://store.com/deal?utm_source=ad&fbclid=999
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
"Check this link--it's amazing!"
|
||||
https://store.com/deal
|
||||
```
|
||||
|
||||
_(Whitespace trimmed, quotes/dashes fixed, trackers stripped.)_
|
||||
|
||||
## [COMBINED] Scenario 12: Mixed Content Stress Test
|
||||
|
||||
Tests all three cleansers on different lines within a single clipboard block.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
Here's a message from WhatsApp:
|
||||
Hey check out this link https://shop.com/sale?utm_source=sms&cid=abc123
|
||||
The price was $20–$50 for the "Premium" plan — totally worth it according
|
||||
to the review I read yesterday.
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
Here's a message from WhatsApp:
|
||||
Hey check out this link https://shop.com/sale?cid=abc123
|
||||
The price was $20-$50 for the "Premium" plan -- totally worth it according to the review I read yesterday.
|
||||
```
|
||||
|
||||
_(Line break joined, trackers stripped, en-dash → `-`, em-dash → `--`, smart quotes → straight quotes.)_
|
||||
|
||||
## [EDGE] Scenario 13: Empty / Whitespace-Only Clipboard
|
||||
|
||||
Tests that an empty or whitespace-only clipboard does not cause errors.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
|
||||
```
|
||||
|
||||
_(Just whitespace — spaces or tabs.)_
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
|
||||
```
|
||||
|
||||
_(Empty string — no crash, no garbage output.)_
|
||||
|
||||
## [EDGE] Scenario 14: Non-URL Text Unchanged
|
||||
|
||||
Tests that plain text without URLs passes through all cleansers without modification.
|
||||
|
||||
### Copy this
|
||||
|
||||
```text
|
||||
The quick brown fox jumps over the lazy dog. Nothing to clean here!
|
||||
```
|
||||
|
||||
### Expected Output
|
||||
|
||||
```text
|
||||
The quick brown fox jumps over the lazy dog. Nothing to clean here!
|
||||
```
|
||||
|
||||
_(No trackers, no smart quotes, no line breaks — text is unchanged.)_
|
||||
|
||||
## [UI] Scenario 15: Settings Toggle Each Rule Off
|
||||
|
||||
Tests that each cleaning rule can be individually disabled and verified.
|
||||
|
||||
### Steps
|
||||
|
||||
1. Open Settings -> Rules.
|
||||
2. Toggle OFF **"Strip tracking parameters"**.
|
||||
3. Copy a URL with trackers (from Scenario 1).
|
||||
4. Trigger CleanCopy, paste, and verify trackers are **still present**.
|
||||
5. Re-enable the toggle and repeat — trackers should now be stripped.
|
||||
6. Repeat for each rule: Smart Quotes, Line-Break Normalizer.
|
||||
|
||||
### Expected
|
||||
|
||||
Each rule's toggle independently controls that specific cleaning behavior.
|
||||
|
||||
## [UI] Scenario 16: Custom Params Debounce & Save Indicator
|
||||
|
||||
Tests that the custom params input debounces correctly and shows save feedback.
|
||||
|
||||
### Steps
|
||||
|
||||
1. Open Settings -> Rules.
|
||||
2. Click the custom tracking parameters input.
|
||||
3. Type `test1`.
|
||||
4. Observe: a `...` indicator appears while debouncing.
|
||||
5. Wait ~500ms: a `✓` checkmark appears indicating save.
|
||||
6. Wait ~1.5s: the `✓` fades out.
|
||||
7. Type `,test2` (appending to existing text).
|
||||
8. Repeat the debounce observation.
|
||||
|
||||
### Expected
|
||||
|
||||
- `...` appears immediately on input change.
|
||||
- `✓` appears after ~500ms debounce completes.
|
||||
- `✓` fades out after ~1.5s.
|
||||
- Input field does not shrink when indicators appear.
|
||||
|
||||
## [EDGE] Scenario 17: Ctrl+C Hotkey Uses Clipboard Monitor
|
||||
|
||||
Tests that setting the hotkey to `Ctrl+C` switches to the clipboard monitor approach and cleans clipboard changes from any source.
|
||||
|
||||
### Steps
|
||||
|
||||
1. Open Settings -> General.
|
||||
2. Start recording a new hotkey.
|
||||
3. Press `Ctrl+C` to set it as the hotkey.
|
||||
4. Check the logs for `"Clipboard monitor started."`.
|
||||
5. Open a text editor and type some text with smart quotes (e.g. `\u201cHello \u2014 World\u201d`).
|
||||
6. Select the text and press `Ctrl+C`.
|
||||
7. Paste the clipboard content.
|
||||
8. Now right-click paste some other text with trackers (e.g. `https://example.com?utm_source=x&id=1`).
|
||||
9. Paste again and verify trackers are stripped.
|
||||
10. Change the hotkey back to `Alt+Shift+C`.
|
||||
11. Check the logs for `"Clipboard monitor shutting down."`.
|
||||
12. Verify `Alt+Shift+C` works as before.
|
||||
|
||||
### Expected
|
||||
|
||||
- Log shows `"Clipboard monitor started."` after setting Ctrl+C.
|
||||
- Ctrl+C copy cleans smart quotes → straight quotes, em-dash → `--`.
|
||||
- Right-click copy also triggers cleaning (clipboard monitor catches all sources).
|
||||
- Log shows `"Clipboard monitor shutting down."` after changing away from Ctrl+C.
|
||||
- Alt+Shift+C works via the global shortcut path as before.
|
||||
Reference in New Issue
Block a user