sn-controls-aurelia
Version:
Aurelia controls for sensenet ECM
385 lines (336 loc) • 16.2 kB
text/typescript
import { expect } from 'chai';
import { suite, test } from 'mocha-typescript';
import { ComponentTestBase } from '../component-test.base';
import { ContentList } from '../../src/collectioncontrols';
import { MockDragEvent } from '../index';
export class ContentListTests extends ComponentTestBase<ContentList> {
constructor() {
super();
}
private item1 = this.mockRepo.HandleLoadedContent({
Id: 10001,
Path: 'Root/Item1',
Name: 'Item1'
})
private item2 = this.mockRepo.HandleLoadedContent({
Id: 10002,
Path: 'Root/Item2',
Name: 'Item2'
})
private item3 = this.mockRepo.HandleLoadedContent({
Id: 10003,
Path: 'Root/Item3',
Name: 'Item3'
})
private item4 = this.mockRepo.HandleLoadedContent({
Id: 10004,
Path: 'Root/Item4',
Name: 'Item4'
})
public async 'Can be constructed'() {
const viewModel = await this.createAndGetViewModel('<content-list></content-list>', 'content-list');
expect(viewModel).to.be.instanceof(ContentList);
}
public async 'HasScope() should be false if there is no Scope bound'() {
const viewModel = await this.createAndGetViewModel('<content-list></content-list>', 'content-list');
expect(viewModel.hasScope).to.be.equals(false);
}
public async 'HasScope() should be true if there is a valid Scope bound'() {
const viewModel = await this.createAndGetViewModel('<content-list></content-list>', 'content-list');
const scopeContent = this.mockRepo.HandleLoadedContent({
Id: 123321,
Path: 'Root/Example',
Name: 'scope'
});
viewModel.Scope = scopeContent;
expect(viewModel.hasScope).to.be.equals(true);
}
public async 'Repository() should return the Repository from a Scope content'() {
const viewModel = await this.createAndGetViewModel('<content-list></content-list>', 'content-list');
const scopeContent = this.mockRepo.HandleLoadedContent({
Id: 123321,
Path: 'Root/Example',
Name: 'scope'
});
viewModel.Scope = scopeContent;
expect(viewModel.Repository).to.be.equals(scopeContent.GetRepository());
}
public 'activateItem() should trigger the OnActivate() callback'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const content = this.mockRepo.HandleLoadedContent({
Id: 123321,
Path: 'Root/Example',
Name: 'scope'
});
viewModel.OnActivate = (arg) => {
expect(arg.content).to.be.eq(content);
done();
}
viewModel.activateItem(content)
});
}
public 'clearSubscriptions() should unsubscribe from all Observables'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Reinitialize();
viewModel.clearSubscriptions();
expect(viewModel['Subscriptions']).to.be.empty;
done();
})
}
public 'triggerAction() should trigger the selected action'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.triggerAction(ev as any, (item) => {
expect(ev.propagationStopped).to.be.true;
expect(item.Id).to.be.eq(123);
done();
}, this.mockRepo.HandleLoadedContent({
Id: 123,
Path: 'root',
Name: 'C1'
}));
})
}
public 'selectItem() should return if selection is disabled'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.EnableSelection = false;
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.Selection).to.be.empty;
done();
})
}
public 'selectItem() should select an item if there is no Multiselect enabled, even with ctrl / shift'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.MultiSelect = false;
viewModel.Items = [this.item1, this.item2, this.item3];
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
ev.shiftKey = true;
viewModel.selectItem(ev as any, this.item2);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.true;
expect(viewModel.isSelected(this.item3)).to.be.false;
ev.ctrlKey = true;
viewModel.selectItem(ev as any, this.item3);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.true;
done();
})
}
public 'selectItem() should select an item if Multiselect is enabled without ctrl / shift'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.MultiSelect = true;
viewModel.Items = [this.item1, this.item2, this.item3];
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.selectItem(ev as any, this.item2);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.true;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.selectItem(ev as any, this.item3);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.true;
done();
})
}
public 'selectItem() with CTRL should toggle the item selection'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
ev.ctrlKey = true;
viewModel.MultiSelect = true;
viewModel.Items = [this.item1, this.item2, this.item3];
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.selectItem(ev as any, this.item1);
viewModel.selectItem(ev as any, this.item3);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.true;
done();
})
}
public 'selectItem() with SHIFT should select an item range'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.MultiSelect = true;
viewModel.Items = [this.item1, this.item2, this.item3, this.item4];
viewModel.selectItem(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
expect(viewModel.isSelected(this.item4)).to.be.false;
ev.shiftKey = true;
viewModel.selectItem(ev as any, this.item3);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.true;
expect(viewModel.isSelected(this.item3)).to.be.true;
expect(viewModel.isSelected(this.item4)).to.be.false;
ev.shiftKey = false;
viewModel.selectItem(ev as any, this.item4);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
expect(viewModel.isSelected(this.item4)).to.be.true;
ev.shiftKey = true;
viewModel.selectItem(ev as any, this.item2);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.true;
expect(viewModel.isSelected(this.item3)).to.be.true;
expect(viewModel.isSelected(this.item4)).to.be.true;
done();
})
}
public 'toggleSelection() should select simple items if multiselect is disabled'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const ev = new MockDragEvent();
viewModel.MultiSelect = false;
viewModel.Items = [this.item1, this.item2, this.item3];
viewModel.toggleSelection(ev as any, this.item1);
expect(viewModel.isSelected(this.item1)).to.be.true;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.toggleSelection(ev as any, this.item2);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.true;
expect(viewModel.isSelected(this.item3)).to.be.false;
viewModel.toggleSelection(ev as any, this.item3);
expect(viewModel.isSelected(this.item1)).to.be.false;
expect(viewModel.isSelected(this.item2)).to.be.false;
expect(viewModel.isSelected(this.item3)).to.be.true;
done();
})
}
'Reinitialize() should return, if triggered twice while loading'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Query = this.mockRepo.CreateQuery(q => q.Equals('DisplayName', 'Example'));
viewModel.GetItems = () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(), 10);
})
}
viewModel.Reinitialize();
viewModel.Reinitialize();
done();
});
}
'ReloadOnContentChange() should return true'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
expect(viewModel.ReloadOnContentChange(null as any)).to.be.true;
done();
});
}
'handleContentChanges() should trigger a reinitialize'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.GetItems = () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(), 10);
})
}
viewModel.handleContentChanges({ Id: 123 });
expect(viewModel.IsLoading).to.be.true;
done();
});
}
'dropContent() should trigger OnDropContent if the Content is in the scope'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Scope = this.item4;
viewModel.OnDropContent = (ev) => {
expect(ev.content).to.be.eq(this.item1);
done();
}
viewModel.dropContent(null as any, this.item1.Stringify());
});
}
'dropContent() should trigger OnDropContentList for multiple content if the Content is in the scope'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Scope = this.item4;
viewModel.OnDropContentList = (ev) => {
expect(ev.contentList[0]).to.be.eq(this.item1);
expect(ev.contentList[1]).to.be.eq(this.item2);
done();
}
viewModel.dropContent(null as any, null as any, [this.item1.Stringify(), this.item2.Stringify()]);
});
}
'dropContent() should trigger OnDropFiles for files'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const fileList = {};
viewModel.Scope = this.item4;
viewModel.OnDropFiles = (ev) => {
expect(ev.files).to.be.eq(fileList);
done()
};
viewModel.dropContent(null as any, null as any, null as any, fileList as any);
});
}
'dropContentOnItem() should trigger OnDropContent if the Content is in the scope'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Scope = this.item4;
viewModel.OnDropContentOnItem = (ev) => {
expect(ev.content).to.be.eq(this.item1);
done();
}
viewModel.dropContentOnItem(null as any, this.item3, this.item1.Stringify());
});
}
'dropContentOnItem() should trigger OnDropContentList for multiple content if the Content is in the scope'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
viewModel.Scope = this.item4;
viewModel.OnDropContentListOnItem = (ev) => {
expect(ev.contentList[0]).to.be.eq(this.item1);
expect(ev.contentList[1]).to.be.eq(this.item2);
done();
}
viewModel.dropContentOnItem(null as any, this.item3, null as any, [this.item1.Stringify(), this.item2.Stringify()]);
});
}
'dropContentOnItem() should trigger OnDropFiles for files'(done: MochaDone) {
this.createAndGetViewModel('<content-list></content-list>', 'content-list').then((viewModel) => {
const fileList = {};
viewModel.Scope = this.item4;
viewModel.OnDropFilesOnItem = (ev) => {
expect(ev.files).to.be.eq(fileList);
done()
};
viewModel.dropContentOnItem(null as any, this.item3, null as any, null as any, fileList as any);
});
}
}