From 4c2369ced43150a5e114f47f163c3b64295cdd6e Mon Sep 17 00:00:00 2001 From: Felix Pojtinger Date: Thu, 13 Jan 2022 18:57:05 +0100 Subject: [PATCH] feat: Add tests for renaming directories to files and vice versa --- pkg/fs/filesystem.go | 11 ++-- pkg/fs/filesystem_test.go | 102 ++++++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 8863436..57f6cba 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -593,7 +593,7 @@ func (f *STFS) Rename(oldname, newname string) error { return os.ErrInvalid } - _, err := inventory.Stat( + source, err := inventory.Stat( f.metadata, oldname, @@ -624,14 +624,19 @@ func (f *STFS) Rename(oldname, newname string) error { return err } - if _, err := inventory.Stat( + target, err := inventory.Stat( f.metadata, newname, false, f.onHeader, - ); err == nil { + ) + if err == nil { + if target.Typeflag != source.Typeflag { + return os.ErrExist + } + if err := f.removeWithoutLocking(newname); err != nil { return err } diff --git a/pkg/fs/filesystem_test.go b/pkg/fs/filesystem_test.go index e519cfc..eb2e437 100644 --- a/pkg/fs/filesystem_test.go +++ b/pkg/fs/filesystem_test.go @@ -1718,7 +1718,7 @@ var renameTests = []struct { checkAfterError bool }{ { - "Can not move / to /mydir", + "Can not rename / to /mydir", renameArgs{"/", "/mydri"}, true, func(f afero.Fs) error { return nil }, @@ -1726,7 +1726,31 @@ var renameTests = []struct { false, }, { - "Can move /test.txt to /new.txt if does exist", + "Can not rename / to /", + renameArgs{"/", "/"}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can not rename '' to ''", + renameArgs{"", ""}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can not rename remove ' ' to ' '", + renameArgs{" ", " "}, + true, + func(f afero.Fs) error { return nil }, + func(f afero.Fs) error { return nil }, + false, + }, + { + "Can rename /test.txt to /new.txt if does exist", renameArgs{"/test.txt", "/new.txt"}, false, func(f afero.Fs) error { @@ -1755,7 +1779,7 @@ var renameTests = []struct { false, }, { - "Can not move /test.txt to /new.txt if does exist", + "Can not rename /test.txt to /new.txt if does exist", renameArgs{"/test.txt", "/new.txt"}, true, func(f afero.Fs) error { @@ -1817,11 +1841,11 @@ var renameTests = []struct { // false, // }, { - "Can not move /test.txt to /mydir/new.txt if new parent drectory does not exist", + "Can not rename /test.txt to /mydir/new.txt if new parent drectory does not exist", renameArgs{"/test.txt", "/mydir/new.txt"}, true, func(f afero.Fs) error { - if _, err := f.Create("test.txt"); err != nil { + if _, err := f.Create("/test.txt"); err != nil { return err } @@ -1837,11 +1861,11 @@ var renameTests = []struct { false, }, { - "Can move /test.txt to /mydir/new.txt if new parent drectory does exist", + "Can rename /test.txt to /mydir/new.txt if new parent drectory does exist", renameArgs{"/test.txt", "/mydir/new.txt"}, false, func(f afero.Fs) error { - if _, err := f.Create("test.txt"); err != nil { + if _, err := f.Create("/test.txt"); err != nil { return err } @@ -1870,11 +1894,11 @@ var renameTests = []struct { false, }, { - "Can move /test.txt to /test.txt if does exist", + "Can rename /test.txt to /test.txt if does exist", renameArgs{"/test.txt", "/test.txt"}, false, func(f afero.Fs) error { - if _, err := f.Create("test.txt"); err != nil { + if _, err := f.Create("/test.txt"); err != nil { return err } @@ -1890,7 +1914,7 @@ var renameTests = []struct { false, }, { - "Can not move /test.txt to /test.txt if does not exist", + "Can not rename move /test.txt to /test.txt if does not exist", renameArgs{"/test.txt", "/test.txt"}, true, func(f afero.Fs) error { @@ -1906,7 +1930,7 @@ var renameTests = []struct { false, }, { - "Can move /test.txt to /existing.txt if source and target both exist", + "Can rename /test.txt to /existing.txt if source and target both exist", renameArgs{"/test.txt", "/existing.txt"}, false, func(f afero.Fs) error { @@ -1933,6 +1957,62 @@ var renameTests = []struct { }, false, }, + { + "Can not rename /test.txt to /mydir if source is file and target is directory", + renameArgs{"/test.txt", "/mydir"}, + true, + func(f afero.Fs) error { + if _, err := f.Create("/test.txt"); err != nil { + return err + } + + if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + return nil + }, + false, + }, + { + "Can not rename /mydir to /test.txt if source is directory and target is file", + renameArgs{"/mydir", "/test.txt"}, + true, + func(f afero.Fs) error { + if _, err := f.Create("/test.txt"); err != nil { + return err + } + + if err := f.Mkdir("/mydir", os.ModePerm); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + return nil + }, + false, + }, + { + "Can rename /test.txt to /test.txt/", + renameArgs{"/test.txt", "/test.txt/"}, + false, + func(f afero.Fs) error { + if _, err := f.Create("/test.txt"); err != nil { + return err + } + + return nil + }, + func(f afero.Fs) error { + return nil + }, + false, + }, } func TestSTFS_Rename(t *testing.T) {