Merge branch 'main' of github.com:jcalixte/loopycode into main

This commit is contained in:
Julien Calixte
2023-05-08 14:52:59 +02:00
15 changed files with 3160 additions and 1149 deletions

View File

@@ -43,11 +43,11 @@
"jsdom": "^21.1.1", "jsdom": "^21.1.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"prettier": "^2.8.8", "prettier": "^2.8.8",
"sass": "^1.62.0", "sass": "^1.62.1",
"typescript": "~4.8.4", "typescript": "~4.8.4",
"vite": "^4.3.1", "vite": "^4.3.1",
"vitest": "^0.30.1", "vitest": "^0.30.1",
"vue-tsc": "^1.4.4", "vue-tsc": "^1.4.4",
"webdriverio": "^8.8.6" "webdriverio": "^8.8.8"
} }
} }

4186
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +1,17 @@
import { createTaskFixture } from '@/modules/task/models/task.fixture' import { fixtureTask } from '@/modules/task/models/task.fixture'
import { router } from '@/router' import { router } from '@/router'
import { toISODate } from '@/shared/types/date' import { toISODate } from '@/shared/types/date'
import { withPlugins } from '@/tests/utils' import { withPlugins } from '@/tests/utils'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
import { mount } from '@vue/test-utils' import { mount } from '@vue/test-utils'
import { describe, expect, it, vi } from 'vitest' import { describe, expect, it, vi } from 'vitest'
import { createRecordableFixture } from '../interfaces/recordable.fixture' import { fixtureRecordable } from '../interfaces/recordable.fixture'
import TaskRecordPreview from './TaskRecordPreview.vue' import TaskRecordPreview from './TaskRecordPreview.vue'
const mountTaskRecordPreview = (withRecord = false) => { const mountTaskRecordPreview = (withRecord = false) => {
const task = createTaskFixture() const task = fixtureTask()
const end = toISODate(new Date('2023-04-17T20:00:00.000Z')) const end = toISODate(new Date('2023-04-17T20:00:00.000Z'))
const record = createRecordableFixture({ const record = fixtureRecordable({
taskId: task.id, taskId: task.id,
stepRecords: { stepRecords: {
[faker.datatype.uuid()]: { [faker.datatype.uuid()]: {

View File

@@ -2,7 +2,7 @@ import { toISODate } from '@/shared/types/date'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { ref } from 'vue' import { ref } from 'vue'
import { createRecordableFixture } from '../interfaces/recordable.fixture' import { fixtureRecordable } from '../interfaces/recordable.fixture'
import { TaskRecord } from '../models/task-record' import { TaskRecord } from '../models/task-record'
import { useTaskRecordMetadata } from './useTaskRecordMetadata' import { useTaskRecordMetadata } from './useTaskRecordMetadata'
@@ -15,7 +15,7 @@ describe('use task record metadata', () => {
it('returns the right duration', () => { it('returns the right duration', () => {
const end = toISODate(new Date('2023-04-17T20:00:00.000Z')) const end = toISODate(new Date('2023-04-17T20:00:00.000Z'))
const record = createRecordableFixture({ const record = fixtureRecordable({
stepRecords: { stepRecords: {
[faker.datatype.uuid()]: { [faker.datatype.uuid()]: {
start: toISODate(new Date('2023-04-17T19:00:00.000Z')), start: toISODate(new Date('2023-04-17T19:00:00.000Z')),

View File

@@ -2,7 +2,7 @@ import { toISODate } from '@/shared/types/date'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
import type { Recordable } from './recordable' import type { Recordable } from './recordable'
export const createRecordableFixture = ( export const fixtureRecordable = (
partialRecordable?: Partial<Recordable> partialRecordable?: Partial<Recordable>
): Recordable => ({ ): Recordable => ({
taskId: partialRecordable?.taskId ?? faker.datatype.uuid(), taskId: partialRecordable?.taskId ?? faker.datatype.uuid(),

View File

@@ -0,0 +1,18 @@
import { toISODate } from '@/shared/types/date'
import { faker } from '@faker-js/faker'
import type { TimeRange } from './time-range'
export const fixtureTimeRange = (
partialTimeRange?: Partial<TimeRange>
): TimeRange => {
const [start, end] = faker.date.betweens(
toISODate(faker.date.past(1)),
toISODate(new Date()),
2
)
return {
start: partialTimeRange?.start ?? toISODate(start),
end: partialTimeRange?.end ?? toISODate(end)
}
}

View File

@@ -0,0 +1,23 @@
import { toISODate } from '@/shared/types/date'
import { faker } from '@faker-js/faker'
import { describe, expect, it } from 'vitest'
import type { Recordable } from '../interfaces/recordable'
import { fixtureTimeRange } from '../interfaces/time-range.fixture'
import { TaskRecord } from './task-record'
describe('Task Record', () => {
it('creates a Record from a Recordable', () => {
const recordable: Recordable = {
taskId: faker.datatype.uuid(),
notes: faker.lorem.paragraphs(),
start: toISODate(faker.date.past(1)),
end: toISODate(faker.date.past()),
breakTime: fixtureTimeRange(),
stepRecords: {
[faker.datatype.uuid()]: fixtureTimeRange()
}
}
expect(TaskRecord.fromRecordable(recordable)).toEqual(recordable)
})
})

View File

@@ -22,6 +22,7 @@ export class TaskRecord implements Recordable {
taskRecord.start = recordable.start taskRecord.start = recordable.start
taskRecord.end = recordable.end taskRecord.end = recordable.end
taskRecord.breakTime = recordable.breakTime taskRecord.breakTime = recordable.breakTime
taskRecord.notes = recordable.notes
return taskRecord return taskRecord
} }

View File

@@ -1,11 +1,11 @@
import { toISODate } from '@/shared/types/date' import { toISODate } from '@/shared/types/date'
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { createRecordableFixture } from '../interfaces/recordable.fixture' import { fixtureRecordable } from '../interfaces/recordable.fixture'
import { addBreakTimeToStepRecords } from './breaktime-service' import { addBreakTimeToStepRecords } from './breaktime-service'
describe('Break Time Service', () => { describe('Break Time Service', () => {
it('adds no break time if there is no break time', () => { it('adds no break time if there is no break time', () => {
const record = createRecordableFixture({ const record = fixtureRecordable({
breakTime: undefined breakTime: undefined
}) })
@@ -13,7 +13,7 @@ describe('Break Time Service', () => {
}) })
it('adds no break time if the break is not over yet', () => { it('adds no break time if the break is not over yet', () => {
const record = createRecordableFixture({ const record = fixtureRecordable({
breakTime: { breakTime: {
start: toISODate(new Date('2023-04-17T19:00:00.000Z')) start: toISODate(new Date('2023-04-17T19:00:00.000Z'))
}, },
@@ -28,7 +28,7 @@ describe('Break Time Service', () => {
}) })
it('adds break time if break time is over', () => { it('adds break time if break time is over', () => {
const record = createRecordableFixture({ const record = fixtureRecordable({
breakTime: { breakTime: {
start: toISODate(new Date('2023-04-17T19:00:00.000Z')), start: toISODate(new Date('2023-04-17T19:00:00.000Z')),
end: toISODate(new Date('2023-04-17T20:00:00.000Z')) end: toISODate(new Date('2023-04-17T20:00:00.000Z'))
@@ -51,7 +51,7 @@ describe('Break Time Service', () => {
}) })
it('adds break time only for unfinished step records', () => { it('adds break time only for unfinished step records', () => {
const record = createRecordableFixture({ const record = fixtureRecordable({
breakTime: { breakTime: {
start: toISODate(new Date('2023-04-17T19:00:00.000Z')), start: toISODate(new Date('2023-04-17T19:00:00.000Z')),
end: toISODate(new Date('2023-04-17T20:00:00.000Z')) end: toISODate(new Date('2023-04-17T20:00:00.000Z'))

View File

@@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils' import { mount } from '@vue/test-utils'
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { createStepFixture } from '../models/step.fixture' import { fixtureStep } from '../models/step.fixture'
import StepInput from './StepInput.vue' import StepInput from './StepInput.vue'
describe('Step input textarea', () => { describe('Step input textarea', () => {
@@ -15,11 +15,7 @@ describe('Step input textarea', () => {
}) })
it('displays the steps in the textarea', () => { it('displays the steps in the textarea', () => {
const steps = [ const steps = [fixtureStep(), fixtureStep(), fixtureStep()]
createStepFixture(),
createStepFixture(),
createStepFixture()
]
const stepsInTextarea = steps const stepsInTextarea = steps
.map((s) => `- ${s.title} | ${s.estimation}`) .map((s) => `- ${s.title} | ${s.estimation}`)

View File

@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { createStepFixture } from '../models/step.fixture' import { fixtureStep } from '../models/step.fixture'
import { import {
adaptStepsToTextarea, adaptStepsToTextarea,
adaptTextareaToSteps adaptTextareaToSteps
@@ -7,12 +7,7 @@ import {
describe('adapt steps to textarea value', () => { describe('adapt steps to textarea value', () => {
it('returns a string with the listed steps', () => { it('returns a string with the listed steps', () => {
const steps = [ const steps = [fixtureStep(), fixtureStep(), fixtureStep(), fixtureStep()]
createStepFixture(),
createStepFixture(),
createStepFixture(),
createStepFixture()
]
const stepsInTextarea = steps const stepsInTextarea = steps
.map((step) => `- ${step.title} | ${step.estimation}`) .map((step) => `- ${step.title} | ${step.estimation}`)
@@ -27,17 +22,17 @@ describe('adapt steps to textarea value', () => {
- step 3 | 5` - step 3 | 5`
const expectedSteps = [ const expectedSteps = [
createStepFixture({ fixtureStep({
id: expect.any(String), id: expect.any(String),
title: 'step 1', title: 'step 1',
estimation: 3 estimation: 3
}), }),
createStepFixture({ fixtureStep({
id: expect.any(String), id: expect.any(String),
title: 'step 2', title: 'step 2',
estimation: 4 estimation: 4
}), }),
createStepFixture({ fixtureStep({
id: expect.any(String), id: expect.any(String),
title: 'step 3', title: 'step 3',
estimation: 5 estimation: 5
@@ -50,7 +45,7 @@ describe('adapt steps to textarea value', () => {
it('fallbacks to 0 for the estimation if there is no estimation', () => { it('fallbacks to 0 for the estimation if there is no estimation', () => {
const stepInTextarea = '- step 1' const stepInTextarea = '- step 1'
const expectedStep = createStepFixture({ const expectedStep = fixtureStep({
id: expect.any(String), id: expect.any(String),
title: 'step 1', title: 'step 1',
estimation: 0 estimation: 0
@@ -62,7 +57,7 @@ describe('adapt steps to textarea value', () => {
it('fallbacks to 0 for the estimation if it can not read the number', () => { it('fallbacks to 0 for the estimation if it can not read the number', () => {
const stepInTextarea = '- step 1 | not an estimation' const stepInTextarea = '- step 1 | not an estimation'
const expectedStep = createStepFixture({ const expectedStep = fixtureStep({
id: expect.any(String), id: expect.any(String),
title: 'step 1', title: 'step 1',
estimation: 0 estimation: 0

View File

@@ -1,7 +1,7 @@
import type { Stepable } from '@/modules/task/interfaces/stepable' import type { Stepable } from '@/modules/task/interfaces/stepable'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
export const createStepFixture = (partialStep?: Partial<Stepable>) => ({ export const fixtureStep = (partialStep?: Partial<Stepable>) => ({
id: partialStep?.id ?? faker.datatype.uuid(), id: partialStep?.id ?? faker.datatype.uuid(),
title: partialStep?.title ?? faker.animal.bird(), title: partialStep?.title ?? faker.animal.bird(),
estimation: estimation:

View File

@@ -1,14 +1,14 @@
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
import type { Stepable } from '../interfaces/stepable' import type { Stepable } from '../interfaces/stepable'
import type { Taskable } from '../interfaces/taskable' import type { Taskable } from '../interfaces/taskable'
import { createStepFixture } from './step.fixture' import { fixtureStep } from './step.fixture'
import { Task } from './task' import { Task } from './task'
export const createTaskFixture = ( export const fixtureTask = (
partialTask?: Partial<Taskable>, partialTask?: Partial<Taskable>,
...steps: Stepable[] ...steps: Stepable[]
) => ) =>
new Task( new Task(
partialTask?.id ?? faker.datatype.uuid(), partialTask?.id ?? faker.datatype.uuid(),
partialTask?.title ?? faker.animal.bird() partialTask?.title ?? faker.animal.bird()
).addSteps(...(steps ?? createStepFixture())) ).addSteps(...(steps ?? fixtureStep()))

View File

@@ -1,5 +1,5 @@
import type { Taskable } from '@/modules/task/interfaces/taskable' import type { Taskable } from '@/modules/task/interfaces/taskable'
import { createStepFixture } from '@/modules/task/models/step.fixture' import { fixtureStep } from '@/modules/task/models/step.fixture'
import { Task } from '@/modules/task/models/task' import { Task } from '@/modules/task/models/task'
import { toISODate } from '@/shared/types/date' import { toISODate } from '@/shared/types/date'
import { faker } from '@faker-js/faker' import { faker } from '@faker-js/faker'
@@ -20,7 +20,7 @@ describe('Task', () => {
date: toISODate(faker.date.recent()), date: toISODate(faker.date.recent()),
title: faker.animal.lion(), title: faker.animal.lion(),
link: faker.internet.url(), link: faker.internet.url(),
steps: [createStepFixture()] steps: [fixtureStep()]
} }
const task = Task.fromTaskable(taskable) const task = Task.fromTaskable(taskable)
@@ -30,7 +30,7 @@ describe('Task', () => {
it('adds steps and removes them', () => { it('adds steps and removes them', () => {
const task = new Task(faker.datatype.uuid(), faker.color.human()) const task = new Task(faker.datatype.uuid(), faker.color.human())
const [firstStep, secondStep] = [createStepFixture(), createStepFixture()] const [firstStep, secondStep] = [fixtureStep(), fixtureStep()]
task.addSteps(firstStep, secondStep) task.addSteps(firstStep, secondStep)
@@ -47,7 +47,7 @@ describe('Task', () => {
const task = new Task(faker.datatype.uuid(), faker.color.human()) const task = new Task(faker.datatype.uuid(), faker.color.human())
expect(Task.validate(task)).toEqual(false) expect(Task.validate(task)).toEqual(false)
task.addSteps(createStepFixture()) task.addSteps(fixtureStep())
expect(Task.validate(task)).toEqual(true) expect(Task.validate(task)).toEqual(true)
}) })
@@ -55,9 +55,9 @@ describe('Task', () => {
const task = new Task(faker.datatype.uuid(), faker.color.human()) const task = new Task(faker.datatype.uuid(), faker.color.human())
task.addSteps( task.addSteps(
createStepFixture({ estimation: 1 }), fixtureStep({ estimation: 1 }),
createStepFixture({ estimation: 2 }), fixtureStep({ estimation: 2 }),
createStepFixture({ estimation: 3 }) fixtureStep({ estimation: 3 })
) )
expect(task.totalEstimation).toEqual(6) expect(task.totalEstimation).toEqual(6)

View File

@@ -1,5 +1,5 @@
import type { TaskRecordStoreState } from '@/modules/record/stores/useTaskRecordStore' import type { TaskRecordStoreState } from '@/modules/record/stores/useTaskRecordStore'
import { createTaskFixture } from '@/modules/task/models/task.fixture' import { fixtureTask } from '@/modules/task/models/task.fixture'
import type { TaskStoreState } from '@/modules/task/stores/useTask.store' import type { TaskStoreState } from '@/modules/task/stores/useTask.store'
import { router } from '@/router' import { router } from '@/router'
import { toISODate } from '@/shared/types/date' import { toISODate } from '@/shared/types/date'
@@ -12,7 +12,7 @@ export interface InitialState {
'task-record-store': TaskRecordStoreState 'task-record-store': TaskRecordStoreState
} }
const tasks = [createTaskFixture(), createTaskFixture()] const tasks = [fixtureTask(), fixtureTask()]
const [firstTask, secondTask] = tasks const [firstTask, secondTask] = tasks
const initialState: InitialState = { const initialState: InitialState = {