Merge pull request #7792 from nextcloud/stable12-7783-fix-empty-details-view-after-renaming-a-file

[stable12] Fix empty details view after renaming a file
This commit is contained in:
Morris Jobke 2018-01-11 15:07:21 +01:00 committed by GitHub
commit 2fa5466b6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 14 deletions

View File

@ -2071,7 +2071,7 @@
function updateInList(fileInfo) { function updateInList(fileInfo) {
self.updateRow(tr, fileInfo); self.updateRow(tr, fileInfo);
self._updateDetailsView(fileInfo, false); self._updateDetailsView(fileInfo.name, false);
} }
// TODO: too many nested blocks, move parts into functions // TODO: too many nested blocks, move parts into functions

View File

@ -589,6 +589,12 @@ describe('OCA.Files.FileList tests', function() {
beforeEach(function() { beforeEach(function() {
deferredRename = $.Deferred(); deferredRename = $.Deferred();
renameStub = sinon.stub(filesClient, 'move').returns(deferredRename.promise()); renameStub = sinon.stub(filesClient, 'move').returns(deferredRename.promise());
for (var i = 0; i < testFiles.length; i++) {
var file = testFiles[i];
file.path = '/some/subdir';
fileList.add(file, {silent: true});
}
}); });
afterEach(function() { afterEach(function() {
renameStub.restore(); renameStub.restore();
@ -596,9 +602,6 @@ describe('OCA.Files.FileList tests', function() {
function doCancelRename() { function doCancelRename() {
var $input; var $input;
for (var i = 0; i < testFiles.length; i++) {
fileList.add(testFiles[i]);
}
// trigger rename prompt // trigger rename prompt
fileList.rename('One.txt'); fileList.rename('One.txt');
@ -613,12 +616,6 @@ describe('OCA.Files.FileList tests', function() {
function doRename() { function doRename() {
var $input; var $input;
for (var i = 0; i < testFiles.length; i++) {
var file = testFiles[i];
file.path = '/some/subdir';
fileList.add(file, {silent: true});
}
// trigger rename prompt // trigger rename prompt
fileList.rename('One.txt'); fileList.rename('One.txt');
$input = fileList.$fileList.find('input.filename'); $input = fileList.$fileList.find('input.filename');
@ -654,6 +651,36 @@ describe('OCA.Files.FileList tests', function() {
expect(notificationStub.calledOnce).toEqual(true); expect(notificationStub.calledOnce).toEqual(true);
}); });
it('Shows renamed file details if rename ajax call suceeded', function() {
fileList.showDetailsView('One.txt');
expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
expect(fileList._detailsView.getFileInfo().get('id')).toEqual(1);
expect(fileList._detailsView.getFileInfo().get('name')).toEqual('One.txt');
doRename();
deferredRename.resolve(201);
expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
expect(fileList._detailsView.getFileInfo().get('id')).toEqual(1);
expect(fileList._detailsView.getFileInfo().get('name')).toEqual('Tu_after_three.txt');
});
it('Shows again file details if rename ajax call failed', function() {
fileList.showDetailsView('One.txt');
expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
expect(fileList._detailsView.getFileInfo().get('id')).toEqual(1);
expect(fileList._detailsView.getFileInfo().get('name')).toEqual('One.txt');
doRename();
deferredRename.reject(403);
expect($('#app-sidebar').hasClass('disappear')).toEqual(false);
expect(fileList._detailsView.getFileInfo().get('id')).toEqual(1);
expect(fileList._detailsView.getFileInfo().get('name')).toEqual('One.txt');
});
it('Correctly updates file link after rename', function() { it('Correctly updates file link after rename', function() {
var $tr; var $tr;
doRename(); doRename();
@ -708,10 +735,6 @@ describe('OCA.Files.FileList tests', function() {
it('Validates the file name', function() { it('Validates the file name', function() {
var $input, $tr; var $input, $tr;
for (var i = 0; i < testFiles.length; i++) {
fileList.add(testFiles[i], {silent: true});
}
// trigger rename prompt // trigger rename prompt
fileList.rename('One.txt'); fileList.rename('One.txt');
$input = fileList.$fileList.find('input.filename'); $input = fileList.$fileList.find('input.filename');

View File

@ -23,6 +23,13 @@ Feature: app-files
When I open the details view for "welcome.txt" When I open the details view for "welcome.txt"
Then I see that the details view for "All files" section is open Then I see that the details view for "All files" section is open
Scenario: rename a file with the details view open
Given I am logged in
And I open the details view for "welcome.txt"
When I rename "welcome.txt" to "farewell.txt"
Then I see that the file list contains a file named "farewell.txt"
And I see that the file name shown in the details view is "farewell.txt"
Scenario: set a password to a shared link Scenario: set a password to a shared link
Given I am logged in Given I am logged in
And I share the link for "welcome.txt" And I share the link for "welcome.txt"

View File

@ -77,6 +77,15 @@ class FilesAppContext implements Context, ActorAwareInterface {
describedAs("Current section details view in Files app"); describedAs("Current section details view in Files app");
} }
/**
* @return Locator
*/
public static function fileNameInCurrentSectionDetailsView() {
return Locator::forThe()->css(".fileName")->
descendantOf(self::currentSectionDetailsView())->
describedAs("File name in current section details view in Files app");
}
/** /**
* @return Locator * @return Locator
*/ */
@ -256,6 +265,14 @@ class FilesAppContext implements Context, ActorAwareInterface {
describedAs("Main link for file $fileName in Files app"); describedAs("Main link for file $fileName in Files app");
} }
/**
* @return Locator
*/
public static function renameInputForFile($fileName) {
return Locator::forThe()->css("input.filename")->descendantOf(self::rowForFile($fileName))->
describedAs("Rename input for file $fileName in Files app");
}
/** /**
* @return Locator * @return Locator
*/ */
@ -287,6 +304,13 @@ class FilesAppContext implements Context, ActorAwareInterface {
return self::fileActionsMenuItemFor("Details"); return self::fileActionsMenuItemFor("Details");
} }
/**
* @return Locator
*/
public static function renameMenuItem() {
return self::fileActionsMenuItemFor("Rename");
}
/** /**
* @return Locator * @return Locator
*/ */
@ -326,6 +350,17 @@ class FilesAppContext implements Context, ActorAwareInterface {
$this->actor->find(self::tabHeaderInCurrentSectionDetailsViewNamed($tabName), 10)->click(); $this->actor->find(self::tabHeaderInCurrentSectionDetailsViewNamed($tabName), 10)->click();
} }
/**
* @Given I rename :fileName1 to :fileName2
*/
public function iRenameTo($fileName1, $fileName2) {
$this->actor->find(self::fileActionsMenuButtonForFile($fileName1), 10)->click();
$this->actor->find(self::renameMenuItem(), 2)->click();
$this->actor->find(self::renameInputForFile($fileName1), 10)->setValue($fileName2 . "\r");
}
/** /**
* @Given I mark :fileName as favorite * @Given I mark :fileName as favorite
*/ */
@ -436,6 +471,13 @@ class FilesAppContext implements Context, ActorAwareInterface {
} }
} }
/**
* @Then I see that the file list contains a file named :fileName
*/
public function iSeeThatTheFileListContainsAFileNamed($fileName) {
PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::rowForFile($fileName), 10));
}
/** /**
* @Then I see that :fileName is marked as favorite * @Then I see that :fileName is marked as favorite
*/ */
@ -443,6 +485,14 @@ class FilesAppContext implements Context, ActorAwareInterface {
PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::favoritedStateIconForFile($fileName), 10)); PHPUnit_Framework_Assert::assertNotNull($this->actor->find(self::favoritedStateIconForFile($fileName), 10));
} }
/**
* @Then I see that the file name shown in the details view is :fileName
*/
public function iSeeThatTheFileNameShownInTheDetailsViewIs($fileName) {
PHPUnit_Framework_Assert::assertEquals(
$this->actor->find(self::fileNameInCurrentSectionDetailsView(), 10)->getText(), $fileName);
}
/** /**
* @Then I see that the input field for tags in the details view is shown * @Then I see that the input field for tags in the details view is shown
*/ */