test: unit tests for pinned manager#1090
test: unit tests for pinned manager#1090lazysegtree merged 13 commits intoyorukot:mainyorukot/superfile:mainfrom Manaswa-S:tests/pinned-managerManaswa-S/superfile:tests/pinned-managerCopy head branch name to clipboard
Conversation
|
@Manaswa-S is attempting to deploy a commit to the yorukot's project Team on Vercel. A member of the Team first needs to authorize it. |
|
Extremely sorry for the PR chaos everyone. Got some last minute OS specific errors due to oversight. Should be fixed now. |
|
That is totally fine |
|
@CodeRabbit Full Review |
✅ Actions performedFull review triggered. |
WalkthroughAdds a new test file for PinnedManager covering Load, Save, Toggle, and Clean behaviors, including success paths, empty inputs, invalid data, non-existent paths, and simulated I/O failures using temporary directories and JSON persistence. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
src/internal/ui/sidebar/pinned_test.go (2)
176-209: Avoid shared state across subtests in Toggle; make each subtest independent.Reusing the same manager/file couples test order. If someone parallelizes subtests later, this will flake. Prefer a fresh file per case or reinit state inside each t.Run.
Example approach (sketch):
- Move mgr creation into each subtest with a unique file: filepath.Join(pinnedDir, name+".json").
- Seed state (Save) as needed before calling Toggle.
102-151: Small ergonomics: prefer helper(s) for repetitive directory/JSON setup.Extract tiny helpers like makeDir(t, path), writeJSON(t, path, v), and asDirWriteTarget(t, path). This will reduce boilerplate and improve readability.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/internal/ui/sidebar/pinned_test.go(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-20T01:40:50.053Z
Learnt from: lazysegtree
PR: yorukot/superfile#1081
File: src/internal/ui/sidebar/directory_utils.go:103-112
Timestamp: 2025-09-20T01:40:50.053Z
Learning: lazysegtree identified code duplication between removeNotExistingDirectories and TogglePinnedDirectory functions in src/internal/ui/sidebar/directory_utils.go, specifically 6 lines of JSON marshaling and file writing logic. He prefers to track such duplication fixes in separate GitHub issues and suggests either extracting common util functions or creating a PinnedDir manager for centralized Read/Write operations to PinnedFile.
Applied to files:
src/internal/ui/sidebar/pinned_test.go
🔇 Additional comments (3)
src/internal/ui/sidebar/pinned_test.go (3)
73-93: Good coverage and realistic FS setup for Load scenarios.The table‑driven tests are clear and exercise empty, valid, and mixed data conditions. Nice use of TempDir/Join for isolation.
225-288: Good matrix for Clean, including save failures and empty input.The success/partial/failure/empty coverage aligns with the earlier ask to centralize pin file R/W in a manager (see retrieved learnings). After fixing the ModTime path/logic, this will validate stability nicely.
164-223: Approve — Toggle behavior confirmed.Toggle appends non-existent dirs but Load/Clean removes them on read, so the test's expectation (non-existent -> no pinned) is correct.
| rOnlyPath := filepath.Join(pinnedDir, "pinnedRonly.json") | ||
| file, err := os.OpenFile(rOnlyPath, os.O_CREATE|os.O_RDONLY, 0400) | ||
| require.NoError(t, err) | ||
| file.Close() | ||
|
|
There was a problem hiding this comment.
Make the “Write Failure” path deterministic across OSes (use a directory as the target).
Creating a read‑only file can behave differently across platforms (Windows ACLs). Targeting a directory guarantees EISDIR/permission errors on all OSes.
Apply this diff:
- rOnlyPath := filepath.Join(pinnedDir, "pinnedRonly.json")
- file, err := os.OpenFile(rOnlyPath, os.O_CREATE|os.O_RDONLY, 0400)
- require.NoError(t, err)
- file.Close()
+ // Use a directory as the "file" path to force a cross‑platform write failure.
+ dirAsFilePath := filepath.Join(pinnedDir, "as_dir_write_target")
+ err = os.Mkdir(dirAsFilePath, 0755)
+ require.NoError(t, err)
@@
- name: "Write Failure",
- pinnedMgr: PinnedManager{filePath: rOnlyPath},
+ name: "Write Failure",
+ pinnedMgr: PinnedManager{filePath: dirAsFilePath},
noError: false,
toSave: dirs,
expected: nil,Also applies to: 145-150
| for _, tt := range testCases { | ||
| t.Run(tt.name, func(t *testing.T) { | ||
| err := tt.pinnedMgr.Save(tt.toSave) | ||
| if tt.noError { | ||
| require.NoError(t, err) | ||
| assert.Equal(t, tt.expected, tt.pinnedMgr.Load()) | ||
| } | ||
| }) | ||
| } |
There was a problem hiding this comment.
Assert the negative path: Save should return an error on failure.
Currently the failure branch isn’t asserted, so a silent success would go unnoticed.
Apply this diff:
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
err := tt.pinnedMgr.Save(tt.toSave)
if tt.noError {
require.NoError(t, err)
assert.Equal(t, tt.expected, tt.pinnedMgr.Load())
- }
+ } else {
+ require.Error(t, err)
+ }
})
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| for _, tt := range testCases { | |
| t.Run(tt.name, func(t *testing.T) { | |
| err := tt.pinnedMgr.Save(tt.toSave) | |
| if tt.noError { | |
| require.NoError(t, err) | |
| assert.Equal(t, tt.expected, tt.pinnedMgr.Load()) | |
| } | |
| }) | |
| } | |
| for _, tt := range testCases { | |
| t.Run(tt.name, func(t *testing.T) { | |
| err := tt.pinnedMgr.Save(tt.toSave) | |
| if tt.noError { | |
| require.NoError(t, err) | |
| assert.Equal(t, tt.expected, tt.pinnedMgr.Load()) | |
| } else { | |
| require.Error(t, err) | |
| } | |
| }) | |
| } |
🤖 Prompt for AI Agents
In src/internal/ui/sidebar/pinned_test.go around lines 153 to 161, the test loop
only asserts the success path and does not verify the failure path; when
tt.noError is false the test should assert that Save returned an error. Update
the test to add an else branch that calls require.Error(t, err) (and optionally
assert that the pinned manager state remains unchanged if desired) so failures
are not silently ignored.
There was a problem hiding this comment.
Hmm. This is valid. Lets do this
There was a problem hiding this comment.
@lazysegtree Thanks for confirming! Here's the implementation to properly assert the error path:
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
err := tt.pinnedMgr.Save(tt.toSave)
if tt.noError {
require.NoError(t, err)
assert.Equal(t, tt.expected, tt.pinnedMgr.Load())
} else {
require.Error(t, err)
}
})
}This ensures that when tt.noError is false, the test will fail if Save() doesn't return an error, making the test more robust and preventing silent failures from going unnoticed.
🧠 Learnings used
Learnt from: lazysegtree
PR: yorukot/superfile#1081
File: src/internal/ui/sidebar/directory_utils.go:103-112
Timestamp: 2025-09-20T01:40:50.053Z
Learning: lazysegtree identified code duplication between removeNotExistingDirectories and TogglePinnedDirectory functions in src/internal/ui/sidebar/directory_utils.go, specifically 6 lines of JSON marshaling and file writing logic. He prefers to track such duplication fixes in separate GitHub issues and suggests either extracting common util functions or creating a PinnedDir manager for centralized Read/Write operations to PinnedFile.
Learnt from: lazysegtree
PR: yorukot/superfile#963
File: src/internal/default_config.go:16-16
Timestamp: 2025-07-27T07:40:51.938Z
Learning: lazysegtree prefers simpler implementation approaches when the alternatives are significantly more complex, even if the alternatives might be architecturally cleaner, prioritizing maintainability and avoiding over-engineering.
Learnt from: lazysegtree
PR: yorukot/superfile#963
File: src/internal/default_config.go:16-16
Timestamp: 2025-07-27T07:40:51.938Z
Learning: lazysegtree prefers simpler implementation approaches when the alternatives are significantly more complex, even if the alternatives might be architecturally cleaner, prioritizing maintainability and avoiding over-engineering.
Learnt from: lazysegtree
PR: yorukot/superfile#969
File: src/internal/key_function.go:40-40
Timestamp: 2025-08-03T09:34:55.721Z
Learning: lazysegtree emphasizes proper dependency direction in software architecture, preferring that low-level components (like modal handlers) should not depend on high-level components (like the main model object). He also prioritizes performance considerations, noting that creating objects on every keypress in hot code paths like key handling is inefficient and should be avoided.
Learnt from: lazysegtree
PR: yorukot/superfile#1013
File: src/internal/model_render.go:329-341
Timestamp: 2025-08-29T14:11:21.380Z
Learning: lazysegtree prefers to defer help menu rendering optimizations and other technical debt improvements to separate GitHub issues when the current PR scope has grown too large, maintaining focus on the primary refactoring objectives while tracking performance improvements for future work.
Learnt from: lazysegtree
PR: yorukot/superfile#985
File: src/internal/model.go:0-0
Timestamp: 2025-08-11T01:49:30.040Z
Learning: lazysegtree prefers maintaining code correctness through proper design and invariants rather than adding defensive bounds checks at every slice access point, viewing such defensive programming as "duct taping" that can mask actual bugs instead of fixing them at their source.
Learnt from: lazysegtree
PR: yorukot/superfile#973
File: src/internal/ui/processbar/model_update.go:7-27
Timestamp: 2025-08-03T14:49:31.221Z
Learning: lazysegtree prefers to keep test-only code simple without adding production-level concerns like goroutine synchronization, cancellation contexts, or complex lifecycle management, even when such patterns might prevent potential issues, since the complexity isn't justified for test utilities.
Learnt from: lazysegtree
PR: yorukot/superfile#1044
File: src/internal/utils/file_utils.go:149-149
Timestamp: 2025-09-09T13:29:11.771Z
Learning: lazysegtree prefers to keep PR scope focused on the primary objectives and considers pre-existing technical debt issues as out of scope for migration/refactoring PRs, preferring to defer such issues to separate GitHub issues rather than expanding the current PR scope.
Learnt from: lazysegtree
PR: yorukot/superfile#950
File: src/internal/ui/metadata/README.md:7-7
Timestamp: 2025-07-24T03:46:29.516Z
Learning: lazysegtree prefers to defer comprehensive unit testing to separate PRs when the current PR has grown too large, maintaining focus on the primary refactoring objectives while tracking testing requirements in dedicated GitHub issues.
Learnt from: lazysegtree
PR: yorukot/superfile#967
File: src/internal/key_function.go:45-47
Timestamp: 2025-08-02T11:47:07.713Z
Learning: lazysegtree prefers to track technical debt and architectural improvements in dedicated GitHub issues when they are identified during PR reviews but are beyond the scope of the current PR, particularly for complex refactoring needs like input handling architecture that would require significant changes.
Learnt from: lazysegtree
PR: yorukot/superfile#963
File: src/internal/handle_file_operations.go:567-570
Timestamp: 2025-07-27T08:49:09.687Z
Learning: lazysegtree prefers to defer technical debt issues like model mutation concerns to later PRs when the current PR has already grown too large, maintaining focus on the primary objectives while acknowledging the need to track such issues for future work.
| t.Run(tt.name, func(t *testing.T) { | ||
| before, err := os.Stat(pinnedFile) | ||
| if !errors.Is(err, fs.ErrNotExist) { | ||
| require.NoError(t, err) | ||
| } | ||
|
|
||
| cleaned := tt.pinnedMgr.Clean(tt.argDirs) | ||
|
|
||
| after, err := os.Stat(pinnedFile) | ||
| if !errors.Is(err, fs.ErrNotExist) { | ||
| require.NoError(t, err) | ||
| } else if before != nil && !tt.modified { | ||
| require.Equal(t, before.ModTime(), after.ModTime()) | ||
| } | ||
|
|
||
| assert.Equal(t, tt.expected, cleaned) | ||
| }) |
There was a problem hiding this comment.
Clean test checks the wrong path and has brittle ModTime logic.
- It stats pinnedFile regardless of which path the manager actually writes to (e.g., rOnlyPath).
- It compares ModTime only when after Stat fails, and risks nil deref if reused elsewhere.
Apply this diff to check the correct file and only compare ModTime when both files exist:
- before, err := os.Stat(pinnedFile)
- if !errors.Is(err, fs.ErrNotExist) {
- require.NoError(t, err)
- }
-
- cleaned := tt.pinnedMgr.Clean(tt.argDirs)
-
- after, err := os.Stat(pinnedFile)
- if !errors.Is(err, fs.ErrNotExist) {
- require.NoError(t, err)
- } else if before != nil && !tt.modified {
- require.Equal(t, before.ModTime(), after.ModTime())
- }
+ subjectPath := tt.pinnedMgr.filePath
+ // Seed file when we control it, so ModTime checks are meaningful on "no modification" cases.
+ if subjectPath == pinnedFile {
+ _ = tt.pinnedMgr.Save(tt.argDirs)
+ }
+
+ beforeInfo, beforeErr := os.Stat(subjectPath)
+
+ cleaned := tt.pinnedMgr.Clean(tt.argDirs)
+
+ afterInfo, afterErr := os.Stat(subjectPath)
+ if beforeErr == nil && afterErr == nil && !tt.modified {
+ require.Equal(t, beforeInfo.ModTime(), afterInfo.ModTime())
+ }
assert.Equal(t, tt.expected, cleaned)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| t.Run(tt.name, func(t *testing.T) { | |
| before, err := os.Stat(pinnedFile) | |
| if !errors.Is(err, fs.ErrNotExist) { | |
| require.NoError(t, err) | |
| } | |
| cleaned := tt.pinnedMgr.Clean(tt.argDirs) | |
| after, err := os.Stat(pinnedFile) | |
| if !errors.Is(err, fs.ErrNotExist) { | |
| require.NoError(t, err) | |
| } else if before != nil && !tt.modified { | |
| require.Equal(t, before.ModTime(), after.ModTime()) | |
| } | |
| assert.Equal(t, tt.expected, cleaned) | |
| }) | |
| t.Run(tt.name, func(t *testing.T) { | |
| subjectPath := tt.pinnedMgr.filePath | |
| // Seed file when we control it, so ModTime checks are meaningful on "no modification" cases. | |
| if subjectPath == pinnedFile { | |
| _ = tt.pinnedMgr.Save(tt.argDirs) | |
| } | |
| beforeInfo, beforeErr := os.Stat(subjectPath) | |
| cleaned := tt.pinnedMgr.Clean(tt.argDirs) | |
| afterInfo, afterErr := os.Stat(subjectPath) | |
| if beforeErr == nil && afterErr == nil && !tt.modified { | |
| require.Equal(t, beforeInfo.ModTime(), afterInfo.ModTime()) | |
| } | |
| assert.Equal(t, tt.expected, cleaned) | |
| }) |
🤖 Prompt for AI Agents
In src/internal/ui/sidebar/pinned_test.go around lines 291-307, the test
currently stats the hardcoded pinnedFile and uses brittle ModTime logic; change
it to stat the manager's actual pinned-file path (use tt.pinnedMgr.Path() or the
manager method that returns the file path instead of pinnedFile) so you check
the file the manager actually writes, and only compare modification times when
both before and after os.Stat succeed (i.e., neither is nil and neither returned
fs.ErrNotExist); adjust error checks to handle fs.ErrNotExist properly and avoid
dereferencing nil before/after values.
| err := os.Mkdir(pinnedDir, 0755) | ||
| require.NoError(t, err) |
There was a problem hiding this comment.
(1) Lets not use this.
Use utils functions to keep it consistent with all tests.
| err := os.Mkdir(pinnedDir, 0755) | |
| require.NoError(t, err) | |
| utils.SetupDirectories(t, pinnedDir) |
| err = os.WriteFile(emptyPath, emptyBytes, 0644) | ||
| require.NoError(t, err) |
There was a problem hiding this comment.
Same as (1)
Use utils.SetupFilesWithData
| err = os.WriteFile(invalidPath, []byte("{ invalid json }"), 0644) | ||
| require.NoError(t, err) |
There was a problem hiding this comment.
Same as (1)
Check all other occurences too
| }, | ||
| { | ||
| name: "Invalid Format File", | ||
| pinnedMgr: PinnedManager{filePath: emptyPath}, |
There was a problem hiding this comment.
I think this was supposed to be invalidPath
This test is same as the above test.
| { | ||
| name: "Valid With One Non-Existent Directory", | ||
| pinnedMgr: PinnedManager{filePath: newNonexistentPath}, | ||
| expected: cleanDirs, | ||
| }, | ||
| } |
There was a problem hiding this comment.
Also add a test with a path of file that is invalid
something like
{
name: "Invalid filePath",
pinnedMgr: PinnedManager{filePath: filepath.Join(pinnedDir, "non_existing_file_path.json")},
expected: []directory{},
},
}
|
|
||
| for _, tt := range testCases { | ||
| t.Run(tt.name, func(t *testing.T) { | ||
| before, err := os.Stat(pinnedFile) |
There was a problem hiding this comment.
This should be tt.pinnedMgr. filePath, I think, not pinnedFile
lazysegtree
left a comment
There was a problem hiding this comment.
Rest looks good to me
|
Applied all changes as per your suggestions. @yorukot @lazysegtree Thx for catching these issues guys. Much appreciated. |
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [yorukot/superfile](https://github.com/yorukot/superfile) | minor | `v1.3.3` -> `v1.4.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>yorukot/superfile (yorukot/superfile)</summary> ### [`v1.4.0`](https://github.com/yorukot/superfile/releases/tag/v1.4.0) [Compare Source](yorukot/superfile@v1.3.3...v1.4.0) Hey folks. Releasing v1.4.0 with many new features, improvements, and bug fixes. We have an async file preview now, a zoxide panel, and various new features improving UX. #### Install: [**Click me to know how to install**](https://github.com/yorukot/superfile?tab=readme-ov-file#installation) #### Highlights - We have the Zoxide Panel now. Ensure zoxide is installed on your system, set `zoxide_support` to `true` in the config, and press `z` to use zoxide. <img width="645" height="295" alt="Image" src="https://github.com/user-attachments/assets/238f6549-5318-49d1-a3a0-14cf8a686955" /> - File previewing is now async, meaning reduced lag while scrolling through images, or on slow systems. - Many bug fixes. See 'Detailed Change Summary' ##### Internal Updates - Most file operations are now truly async with the usage of the recommended `tea.Cmd` pattern. - Enabled many new linters to improve code quality. - Moved golangci-lint to v2. Now developers don't need to keep the old v1 in their systems. - Refactored file preview in its own package for better maintainability and readability. - Fixed flaky unit tests. #### Detailed Change Summary <details><summary>Details</summary> <p> ##### Update - feat: File operation via tea cmd [#​963](yorukot/superfile#963) by @​lazysegtree - feat: processbar improvements, package separation, better channel management [#​973](yorukot/superfile#973) by @​lazysegtree - feat: enable lll and recvcheck linter, fix tests, more refactors [#​977](yorukot/superfile#977) by @​lazysegtree - feat: Remove channel for notification models [#​979](yorukot/superfile#979) by @​lazysegtree - feat: enable cyclop, funlen, gocognit, gocyclo linters, and refactor large functions [#​984](yorukot/superfile#984) by @​lazysegtree - feat: Add a new hotkey to handle cd-on-quit whenever needed [#​924](yorukot/superfile#924) by @​ahmed-habbachi - feat: added option to permanently delete files [#​987](yorukot/superfile#987) by @​hupender - feat: Preview panel separation [#​1021](yorukot/superfile#1021) by @​lazysegtree - feat: Add search functionality to help menu [#​1011](yorukot/superfile#1011) by @​iZarrios - feat: Use zoxide lib [#​1036](yorukot/superfile#1036) by @​lazysegtree - feat: Add zoxide directory tracking on navigation [#​1041](yorukot/superfile#1041) by @​lazysegtree - feat: Zoxide integration [#​1039](yorukot/superfile#1039) by @​lazysegtree - feat: Select mode with better feedback [#​1074](yorukot/superfile#1074) by @​lazysegtree - feat: owner/group in the metadata [#​1093](yorukot/superfile#1093) by @​xelavopelk - feat: Async zoxide [#​1104](yorukot/superfile#1104) by @​lazysegtree ##### Bug Fix - fix: sorting in searchbar [#​985](yorukot/superfile#985) by @​hupender - fix: Async rendering, Include clipboard check in paste items, and update linter configs [#​997](yorukot/superfile#997) by @​lazysegtree - fix: Move utility functions to utils package [#​1012](yorukot/superfile#1012) by @​lazysegtree - fix: Refactoring and separation of preview panel and searchbar in help menu [#​1013](yorukot/superfile#1013) by @​lazysegtree - fix(filePanel): allow focusType to be set correctly [#​1033](yorukot/superfile#1033) by @​faisal-990 - fix(ci): Update gomod2nix.toml, allow pre release in version output, release 1.4.0-rc1, bug fixes, and improvements [#​1054](yorukot/superfile#1054) by @​lazysegtree - fix(nix): resolve build failures in the nix flake [#​1068](yorukot/superfile#1068) by @​Frost-Phoenix - fix: Retry the file deletion to prevent flakies (#​938) [#​1076](yorukot/superfile#1076) by @​lazysegtree - fix(issue-1066): Fixed issue where enter was not searchable [#​1078](yorukot/superfile#1078) by @​Simpaqt - fix(#​1073): Tech debt fix [#​1077](yorukot/superfile#1077) by @​Simpaqt - fix: fix deleted directory not able to remove from pins (#​1067) [#​1081](yorukot/superfile#1081) by @​yorukot - fix: fix child process spawning attached [#​1084](yorukot/superfile#1084) by @​guemidiborhane - fix: always clear images when showing a FullScreenStyle [#​1094](yorukot/superfile#1094) by @​snikoletopoulos - fix: Allow j and k keys in zoxide [#​1102](yorukot/superfile#1102) by @​lazysegtree - fix: Zoxide improvements and 1.4.0-rc2 [#​1105](yorukot/superfile#1105) by @​lazysegtree - fix: rename cursor beginning on wrong character because of multiple dots in name (#​813) [#​1112](yorukot/superfile#1112) by @​SyedAsadK - fix: check and fix file panel scroll position on height changes [#​1095](yorukot/superfile#1095) by @​snikoletopoulos ##### Optimization - perf(website): optimize font loading and asset organization [#​1089](yorukot/superfile#1089) by @​yorukot ##### Documentation - docs: fix incorrect zoxide plugin config name [#​1049](yorukot/superfile#1049) by @​shree-xvi - docs(hotkeys): Fix typo in vimHotkeys.toml comments [#​1080](yorukot/superfile#1080) by @​wleoncio - docs: add section for core maintainers in README.md [#​1088](yorukot/superfile#1088) by @​yorukot - chore: add winget install instruction to readme and website [#​943](yorukot/superfile#943) by @​claykom ##### Dependencies - chore(deps): update dependency go to v1.25.0, golangci-lint to v2, golangci-lint actions to v8 [#​750](yorukot/superfile#750) by @​renovate[bot] - chore(deps): update amannn/action-semantic-pull-request action to v6 [#​1006](yorukot/superfile#1006) by @​renovate[bot] - chore(deps): update actions/first-interaction action to v3 [#​1005](yorukot/superfile#1005) by @​renovate[bot] - chore(deps): update actions/checkout action to v5 [#​1004](yorukot/superfile#1004) by @​renovate[bot] - chore(deps): bump astro from 5.10.1 to 5.12.8 [#​982](yorukot/superfile#982) by @​dependabot[bot] - fix(deps): update module golang.org/x/mod to v0.27.0 [#​989](yorukot/superfile#989) by @​renovate[bot] - fix(deps): update dependency @​expressive-code/plugin-collapsible-sections to v0.41.3 [#​990](yorukot/superfile#990) by @​renovate[bot] - fix(deps): update dependency sharp to v0.34.3 [#​992](yorukot/superfile#992) by @​renovate[bot] - fix(deps): update dependency @​expressive-code/plugin-line-numbers to v0.41.3 [#​991](yorukot/superfile#991) by @​renovate[bot] - chore(deps): update dependency go to v1.25.0 [#​994](yorukot/superfile#994) by @​renovate[bot] - fix(deps): update astro monorepo [#​995](yorukot/superfile#995) by @​renovate[bot] - fix(deps): update dependency @​astrojs/starlight to ^0.35.0 [#​1000](yorukot/superfile#1000) by @​renovate[bot] - fix(deps): update module github.com/urfave/cli/v3 to v3.4.1 [#​1001](yorukot/superfile#1001) by @​renovate[bot] - fix(deps): update module golang.org/x/text to v0.28.0 [#​1003](yorukot/superfile#1003) by @​renovate[bot] ##### Misc - chore: migrate from superfile.netlify.app to superfile.dev [#​1087](yorukot/superfile#1087) by @​yorukot - refactor(filepanel): replace filePanelFocusType with isFocused boolean [#​1040](yorukot/superfile#1040) by @​faisal-990 - refactor(ansi): Migrate from github.com/charmbracelet/x/exp/term/ansi to github.com/charmbracelet/x/ansi [#​1044](yorukot/superfile#1044) by @​faisal-990 - refactor: common operation on pinned directory file using PinnedManager [#​1085](yorukot/superfile#1085) by @​Manaswa-S - test: unit tests for pinned manager [#​1090](yorukot/superfile#1090) by @​Manaswa-S </p> </details> #### New Contributors * @​hupender made their first contribution in yorukot/superfile#985 * @​ahmed-habbachi made their first contribution in yorukot/superfile#924 * @​iZarrios made their first contribution in yorukot/superfile#1011 * @​faisal-990 made their first contribution in yorukot/superfile#1033 * @​shree-xvi made their first contribution in yorukot/superfile#1049 * @​Simpaqt made their first contribution in yorukot/superfile#1078 * @​wleoncio made their first contribution in yorukot/superfile#1080 * @​guemidiborhane made their first contribution in yorukot/superfile#1084 * @​Manaswa-S made their first contribution in yorukot/superfile#1085 * @​xelavopelk made their first contribution in yorukot/superfile#1093 * @​snikoletopoulos made their first contribution in yorukot/superfile#1094 * @​SyedAsadK made their first contribution in yorukot/superfile#1112 **Full Changelog**: <yorukot/superfile@v1.3.3...v1.4.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDYuMCIsInVwZGF0ZWRJblZlciI6IjQxLjE0Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Extents #1082
Adds unit tests for
PinnedManager.Tests for:
Summary by CodeRabbit