Skip to content

Commit af513f4

Browse files
authored
(MINOR) Merge pull request #47 from jamiefdhurst/dataview-support
Dataview support
2 parents 8a73ea2 + 1f03f29 commit af513f4

21 files changed

+556
-160
lines changed

src/__tests__/kanban/board-manager.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { FrontMatterCache, MetadataCache, TFile } from 'obsidian';
22
import { KANBAN_PROPERTY_NAME, KANBAN_PROPERTY_VALUE } from '../../kanban/board';
33
import { KanbanBoardManager, KanbanBoardOpenError } from '../../kanban/board-manager';
4+
import { TaskFactory } from '../../tasks/factory';
45
import { ObsidianVault } from '../../types';
56

67
describe('kanban board-manager', () => {
@@ -13,14 +14,16 @@ describe('kanban board-manager', () => {
1314
let sut: KanbanBoardManager;
1415

1516
beforeEach(() => {
17+
const taskFactory = jest.fn as unknown as TaskFactory;
18+
1619
vault = jest.fn() as unknown as ObsidianVault;
1720
metadataCache = jest.fn() as unknown as MetadataCache;
1821

1922
dummyFile = new TFile();
2023
dummyFile.basename = 'example';
2124
dummyFile.name = 'example.md';
2225

23-
sut = new KanbanBoardManager(vault, metadataCache);
26+
sut = new KanbanBoardManager(vault, metadataCache, taskFactory);
2427
});
2528

2629
it('returns nothing when it can\'t find any boards', () => {

src/__tests__/kanban/board.test.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
import AutoTasks from '../..';
22
import { KanbanBoard } from '../../kanban/board';
33
import { DEFAULT_SETTINGS } from '../../settings';
4+
import { EmojiTaskCollection } from '../../tasks/emoji-collection';
5+
import { TaskFactory } from '../../tasks/factory';
46

57
describe('kanban board', () => {
68

9+
let taskFactory: TaskFactory;
10+
711
let sut: KanbanBoard;
812

9-
beforeAll(() => {
10-
jest.spyOn(AutoTasks, 'getSettings').mockReturnValue(Object.assign({}, DEFAULT_SETTINGS));
11-
});
12-
13+
beforeEach(() => {
14+
taskFactory = jest.fn() as unknown as TaskFactory;
15+
taskFactory.newCollection = jest.fn().mockImplementation((a, b) => new EmojiTaskCollection(a, b));
16+
17+
jest.spyOn(AutoTasks, 'getSettings').mockReturnValue(Object.assign({}, DEFAULT_SETTINGS));
18+
});
1319

1420
it('initialises without contents using defaults', () => {
15-
sut = new KanbanBoard('example.md');
21+
sut = new KanbanBoard(taskFactory, 'example.md');
1622

1723
const markdown = sut.toString();
1824
expect(markdown).toContain('## Upcoming');
@@ -22,7 +28,7 @@ describe('kanban board', () => {
2228
});
2329

2430
it('initialises with contents, adds in default headers', () => {
25-
sut = new KanbanBoard('example.md', '## Example Header\n\n- [ ] Example task');
31+
sut = new KanbanBoard(taskFactory, 'example.md', '## Example Header\n\n- [ ] Example task');
2632

2733
const markdown = sut.toString();
2834
expect(markdown).toContain('## Upcoming');
@@ -31,17 +37,20 @@ describe('kanban board', () => {
3137
});
3238

3339
it('gets filename correctly', () => {
34-
sut = new KanbanBoard('example.md');
40+
sut = new KanbanBoard(taskFactory, 'example.md');
3541

3642
expect(sut.getFileName()).toEqual('example.md');
3743
});
3844

3945
it('gets a task collection and uses the cached object', () => {
40-
sut = new KanbanBoard('example.md', '## Example Header\n\n- [ ] Example task');
46+
const newCollection = jest.spyOn(taskFactory, 'newCollection');
47+
48+
sut = new KanbanBoard(taskFactory, 'example.md', '## Example Header\n\n- [ ] Example task');
4149

4250
const tasks1 = sut.getTaskCollection();
4351
const tasks2 = sut.getTaskCollection();
4452

53+
expect(newCollection).toHaveBeenCalledTimes(1);
4554
expect(tasks1).toEqual(tasks2);
4655
expect(tasks1.getAllTasks().length).toEqual(1);
4756
});

src/__tests__/kanban/provider.test.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import { KanbanProvider } from '../../kanban/provider';
66
import { KanbanSynchroniser } from '../../kanban/synchroniser';
77
import { Watcher } from '../../kanban/watcher';
88
import { DEFAULT_SETTINGS, ISettings } from '../../settings';
9+
import { TaskFactory } from '../../tasks/factory';
910
import { ObsidianVault } from '../../types';
1011

1112
describe('kanban provider', () => {
1213

1314
let plugin: AutoTasks;
1415

16+
let taskFactory: TaskFactory;
1517
let boardManager: KanbanBoardManager;
1618
let synchroniser: KanbanSynchroniser;
1719
let watcher: Watcher;
@@ -24,6 +26,7 @@ describe('kanban provider', () => {
2426
const vault = jest.fn() as unknown as ObsidianVault;
2527
const metadataCache = jest.fn() as unknown as MetadataCache;
2628
plugin = jest.fn() as unknown as AutoTasks;
29+
taskFactory = jest.fn() as unknown as TaskFactory;
2730
boardManager = jest.fn() as unknown as KanbanBoardManager;
2831
synchroniser = jest.fn() as unknown as KanbanSynchroniser;
2932
watcher = jest.fn() as unknown as Watcher;
@@ -34,13 +37,13 @@ describe('kanban provider', () => {
3437
kanbanFile: 'example.md',
3538
});
3639

37-
sut = new KanbanProvider(plugin, vault, metadataCache, boardManager, synchroniser, watcher);
40+
sut = new KanbanProvider(plugin, vault, metadataCache, taskFactory, boardManager, synchroniser, watcher);
3841
});
3942

4043
it('loads with default dependencies', () => {
4144
const vault = jest.fn() as unknown as ObsidianVault;
4245
const metadataCache = jest.fn() as unknown as MetadataCache;
43-
sut = new KanbanProvider(plugin, vault, metadataCache);
46+
sut = new KanbanProvider(plugin, vault, metadataCache, taskFactory);
4447

4548
expect(sut).toBeInstanceOf(KanbanProvider);
4649
});
@@ -72,7 +75,7 @@ describe('kanban provider', () => {
7275
settings.kanbanSync = true;
7376
settings.kanbanFile = 'example.md';
7477
boardManager.get = jest.fn();
75-
jest.spyOn(boardManager, 'get').mockImplementationOnce(async () => new KanbanBoard('example.md'));
78+
jest.spyOn(boardManager, 'get').mockImplementationOnce(async () => new KanbanBoard(taskFactory, 'example.md'));
7679
synchroniser.process = jest.fn();
7780
const synchroniserProcess = jest.spyOn(synchroniser, 'process');
7881

@@ -107,7 +110,7 @@ describe('kanban provider', () => {
107110
settings.kanbanSync = true;
108111
settings.kanbanFile = 'example.md';
109112
boardManager.get = jest.fn();
110-
const board = new KanbanBoard('example.md');
113+
const board = new KanbanBoard(taskFactory, 'example.md');
111114
jest.spyOn(boardManager, 'get').mockImplementation(async () => board);
112115

113116
const result = await sut.getBoard();

src/__tests__/kanban/synchroniser.test.ts

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import AutoTasks from '../..';
33
import { DONE, DUE, KanbanBoard, PROGRESS, UPCOMING } from '../../kanban/board';
44
import { KanbanSynchroniser } from '../../kanban/synchroniser';
55
import { DEFAULT_SETTINGS, ISettings } from '../../settings';
6+
import { EmojiTaskCollection } from '../../tasks/emoji-collection';
7+
import { TaskFactory } from '../../tasks/factory';
68
import { DUE_DATE_FORMAT } from '../../tasks/task';
79
import { ObsidianVault } from '../../types';
810

@@ -15,6 +17,7 @@ describe('kanban synchroniser', () => {
1517
let plugin: AutoTasks;
1618
let settings: ISettings;
1719
let vault: ObsidianVault;
20+
let taskFactory: TaskFactory;
1821
let board: KanbanBoard;
1922

2023
beforeEach(() => {
@@ -27,15 +30,21 @@ describe('kanban synchroniser', () => {
2730
vault.getFiles = jest.fn();
2831
vault.modify = jest.fn();
2932
vault.read = jest.fn();
33+
taskFactory = jest.fn() as unknown as TaskFactory;
34+
taskFactory.newCollection = jest.fn().mockImplementation((a, b) => new EmojiTaskCollection(a, b));
3035
jest.spyOn(AutoTasks, 'getSettings').mockReturnValue(settings);
3136

32-
sut = new KanbanSynchroniser(plugin, vault);
37+
sut = new KanbanSynchroniser(plugin, vault, taskFactory);
38+
});
39+
40+
afterEach(() => {
41+
jest.resetAllMocks();
3342
});
3443

3544
it('retrieves files with empty list and performs with empty list', async () => {
3645
jest.spyOn(vault, 'getFiles').mockReturnValue([]);
3746
const vaultModify = jest.spyOn(vault, 'modify');
38-
board = new KanbanBoard(BOARD_FILENAME);
47+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
3948
const boardGetTaskCollection = jest.spyOn(board, 'getTaskCollection');
4049

4150
await sut.process(board);
@@ -54,7 +63,7 @@ describe('kanban synchroniser', () => {
5463
const file3 = new TFile();
5564
file3.path = 'elsewhere/file3.md';
5665
const vaultModify = jest.spyOn(vault, 'modify');
57-
board = new KanbanBoard(BOARD_FILENAME);
66+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
5867
const boardGetTaskCollection = jest.spyOn(board, 'getTaskCollection');
5968
const vaultRead = jest.spyOn(vault, 'read').mockResolvedValue('');
6069

@@ -69,7 +78,7 @@ describe('kanban synchroniser', () => {
6978
const file = new TFile();
7079
file.name = BOARD_FILENAME;
7180
const vaultModify = jest.spyOn(vault, 'modify');
72-
board = new KanbanBoard(BOARD_FILENAME);
81+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
7382
const boardGetTaskCollection = jest.spyOn(board, 'getTaskCollection');
7483

7584
await sut.process(board, [file]);
@@ -84,7 +93,7 @@ describe('kanban synchroniser', () => {
8493
const file2 = new TFile();
8594
file2.name = 'file2.md';
8695
jest.spyOn(vault, 'getFiles').mockImplementation(() => [file1, file2]);
87-
board = new KanbanBoard(BOARD_FILENAME);
96+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
8897
const boardGetTaskCollection = jest.spyOn(board, 'getTaskCollection');
8998
const vaultRead = jest.spyOn(vault, 'read').mockResolvedValue('');
9099

@@ -100,7 +109,7 @@ describe('kanban synchroniser', () => {
100109

101110
const file1 = new TFile();
102111
file1.name = 'file1.md';
103-
board = new KanbanBoard(BOARD_FILENAME);
112+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
104113
jest.spyOn(vault, 'read').mockResolvedValue('## TODOs\n\n- [ ] A new task\n- [ ] Meeting: Something or other\n- [ ] Meeting: Jamie 1-2-1\n- [ ] Another new task\n');
105114

106115
await sut.process(board, [file1]);
@@ -114,7 +123,7 @@ describe('kanban synchroniser', () => {
114123
it('adds new tasks', async () => {
115124
const file1 = new TFile();
116125
file1.name = 'file1.md';
117-
board = new KanbanBoard(BOARD_FILENAME);
126+
board = new KanbanBoard(taskFactory, BOARD_FILENAME);
118127
jest.spyOn(vault, 'read').mockResolvedValue('## TODOs\n\n- [ ] A new task\n- [ ] Another new task\n');
119128

120129
await sut.process(board, [file1]);
@@ -127,7 +136,7 @@ describe('kanban synchroniser', () => {
127136
const file1 = new TFile();
128137
file1.name = 'file1.md';
129138
const dueDate = moment().format(DUE_DATE_FORMAT);
130-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n\n\n\n\n${DUE}\n\n- [ ] Due task 📅 ${dueDate}\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
139+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n\n\n\n\n${DUE}\n\n- [ ] Due task 📅 ${dueDate}\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
131140
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Due task 📅 ${dueDate}\n`);
132141

133142
await sut.process(board, [file1]);
@@ -139,7 +148,7 @@ describe('kanban synchroniser', () => {
139148
const file1 = new TFile();
140149
file1.name = 'file1.md';
141150
const dueDate = moment().format(DUE_DATE_FORMAT);
142-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Due task 📅 ${dueDate}\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
151+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Due task 📅 ${dueDate}\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
143152
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Due task 📅 ${dueDate}\n`);
144153

145154
await sut.process(board, [file1]);
@@ -150,7 +159,7 @@ describe('kanban synchroniser', () => {
150159
it('moves incomplete tasks back to UPCOMING', async () => {
151160
const file1 = new TFile();
152161
file1.name = 'file1.md';
153-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n- [x] Incomplete task\n\n\n\n\n`);
162+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n- [x] Incomplete task\n\n\n\n\n`);
154163
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Existing task\n- [ ] Incomplete task\n`);
155164

156165
await sut.process(board, [file1]);
@@ -162,7 +171,7 @@ describe('kanban synchroniser', () => {
162171
const file1 = new TFile();
163172
file1.name = 'file1.md';
164173
const dueDate = moment().format(DUE_DATE_FORMAT);
165-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n- [x] Incomplete task\n\n\n\n\n`);
174+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n- [x] Incomplete task\n\n\n\n\n`);
166175
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Existing task\n- [ ] Incomplete task 📅 ${dueDate}\n`);
167176

168177
await sut.process(board, [file1]);
@@ -173,7 +182,7 @@ describe('kanban synchroniser', () => {
173182
it('moves complete tasks to DONE', async () => {
174183
const file1 = new TFile();
175184
file1.name = 'file1.md';
176-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Complete task\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
185+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Complete task\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
177186
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Existing task\n- [x] Complete task\n`);
178187

179188
await sut.process(board, [file1]);
@@ -185,7 +194,7 @@ describe('kanban synchroniser', () => {
185194
const file1 = new TFile();
186195
file1.name = 'file1.md';
187196
const dueDate = moment().add(5, 'days').format(DUE_DATE_FORMAT);
188-
board = new KanbanBoard(BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
197+
board = new KanbanBoard(taskFactory, BOARD_FILENAME, `${UPCOMING}\n\n- [ ] Existing task\n\n\n\n\n${DUE}\n\n\n\n\n\n${PROGRESS}\n\n\n\n\n\n${DONE}\n\n\n\n\n\n`);
189198
jest.spyOn(vault, 'read').mockResolvedValue(`## TODOs\n\n- [ ] Existing task 📅 ${dueDate} ⏫ 🆔 random-id\n`);
190199

191200
await sut.process(board, [file1]);

0 commit comments

Comments
 (0)