Merged in feature/npm-upgrade-2 (pull request #146)

Feature/npm upgrade 2

Approved-by: Elia Bieri
This commit is contained in:
Daniel Egger 2023-06-21 14:42:15 +00:00
commit 42686a500e
14 changed files with 5969 additions and 5277 deletions

10749
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
"name": "client", "name": "client",
"version": "0.0.0", "version": "0.0.0",
"scripts": { "scripts": {
"build": "npm run codegen && vue-tsc --noEmit && vite build && node versionize && cp ./dist/index.html ../server/vbv_lernwelt/templates/vue/index.html && rm -rf ../server/vbv_lernwelt/static/vue/* && cp -r ./dist/static/vue ../server/vbv_lernwelt/static/ && npm run build-storybook", "build": "npm run typecheck && vite build && node versionize && cp ./dist/index.html ../server/vbv_lernwelt/templates/vue/index.html && rm -rf ../server/vbv_lernwelt/static/vue/* && cp -r ./dist/static/vue ../server/vbv_lernwelt/static/ && npm run build-storybook",
"build-storybook": "rm -rf ../server/vbv_lernwelt/static/storybook/* && storybook build -o ../server/vbv_lernwelt/static/storybook", "build-storybook": "rm -rf ../server/vbv_lernwelt/static/storybook/* && storybook build -o ../server/vbv_lernwelt/static/storybook",
"build:tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --minify", "build:tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --minify",
"codegen": "graphql-codegen && node minimizeGraphqlSchema.mjs", "codegen": "graphql-codegen && node minimizeGraphqlSchema.mjs",
@ -20,88 +20,87 @@
"vue-i18n-extract": "vue-i18n-extract report" "vue-i18n-extract": "vue-i18n-extract report"
}, },
"dependencies": { "dependencies": {
"@headlessui/tailwindcss": "^0.1.2", "@headlessui/tailwindcss": "^0.1.3",
"@headlessui/vue": "1.7.7", "@headlessui/vue": "1.7.7",
"@sentry/tracing": "^7.20.0", "@sentry/tracing": "^7.56.0",
"@sentry/vue": "^7.20.0", "@sentry/vue": "^7.56.0",
"@urql/devtools": "^2.0.3", "@urql/devtools": "^2.0.3",
"@urql/exchange-graphcache": "^6.0.4", "@urql/exchange-graphcache": "^6.1.4",
"@urql/introspection": "^1.0.2", "@urql/introspection": "^1.0.2",
"@urql/vue": "^1.1.1", "@urql/vue": "^1.1.2",
"@vueuse/core": "^9.13.0", "@vueuse/core": "10.1.0",
"@vueuse/router": "^10.1.2", "@vueuse/router": "10.1.0",
"cypress": "^12.9.0", "cypress": "^12.14.0",
"d3": "^7.6.1", "d3": "^7.8.5",
"dayjs": "^1.11.7", "dayjs": "^1.11.8",
"graphql": "^16.6.0", "graphql": "^16.6.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"loglevel": "^1.8.0", "loglevel": "^1.8.0",
"mitt": "^3.0.0", "mitt": "^3.0.0",
"pinia": "^2.0.21", "pinia": "^2.1.4",
"vue": "^3.2.38", "vue": "^3.3.4",
"vue-i18n": "^9.2.2", "vue-i18n": "^9.2.2",
"vue-i18n-extract": "^2.0.7", "vue-i18n-extract": "^2.0.7",
"vue-router": "^4.1.6" "vue-router": "^4.2.2"
}, },
"devDependencies": { "devDependencies": {
"@graphql-codegen/cli": "^2.13.12", "@graphql-codegen/cli": "^4.0.1",
"@graphql-codegen/client-preset": "^1.1.4", "@graphql-codegen/client-preset": "^4.0.1",
"@rollup/plugin-alias": "^4.0.3", "@rollup/plugin-alias": "^4.0.3",
"@rushstack/eslint-patch": "^1.1.4", "@rushstack/eslint-patch": "^1.1.4",
"@savvywombat/tailwindcss-grid-areas": "^3.0.0", "@savvywombat/tailwindcss-grid-areas": "^3.0.0",
"@storybook/addon-a11y": "^7.0.0-rc.5", "@storybook/addon-a11y": "^7.0.22",
"@storybook/addon-essentials": "^7.0.0-rc.5", "@storybook/addon-essentials": "^7.0.22",
"@storybook/addon-interactions": "^7.0.0-rc.5", "@storybook/addon-interactions": "^7.0.22",
"@storybook/addon-links": "^7.0.0-rc.5", "@storybook/addon-links": "^7.0.22",
"@storybook/addons": "^7.0.0-rc.5", "@storybook/addons": "^7.0.22",
"@storybook/blocks": "^7.0.0-rc.5", "@storybook/blocks": "^7.0.22",
"@storybook/manager-api": "^7.0.0-rc.5", "@storybook/manager-api": "^7.0.22",
"@storybook/testing-library": "^0.0.14-next.1", "@storybook/testing-library": "^0.1.0",
"@storybook/theming": "^7.0.0-rc.5", "@storybook/theming": "^7.0.22",
"@storybook/vue3": "^7.0.0-rc.5", "@storybook/vue3": "^7.0.22",
"@storybook/vue3-vite": "^7.0.0-rc.5", "@storybook/vue3-vite": "^7.0.22",
"@tailwindcss/forms": "^0.5.2", "@tailwindcss/forms": "^0.5.2",
"@tailwindcss/typography": "^0.5.4", "@tailwindcss/typography": "^0.5.4",
"@testing-library/vue": "^7.0.0", "@testing-library/vue": "^7.0.0",
"@types/d3": "^7.4.0", "@types/d3": "^7.4.0",
"@types/jsdom": "^21.1.1", "@types/jsdom": "^21.1.1",
"@types/lodash": "^4.14.184", "@types/lodash": "^4.14.195",
"@types/node": "^18.7.14", "@types/node": "^18.16.18",
"@vitejs/plugin-vue": "4.1", "@vitejs/plugin-vue": "^4.2.3",
"@volar/vue-typescript": "^1.0.9",
"@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-prettier": "^7.0.0",
"@vue/eslint-config-typescript": "^11.0.0", "@vue/eslint-config-typescript": "^11.0.0",
"@vue/test-utils": "^2.0.2", "@vue/test-utils": "^2.0.2",
"@vue/tsconfig": "^0.1.3", "@vue/tsconfig": "^0.1.3",
"autoprefixer": "^10.4.8", "autoprefixer": "^10.4.8",
"concurrently": "^8.0.1", "concurrently": "^8.0.1",
"eslint": "8.37", "eslint": "^8.43.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.5.0",
"eslint-plugin-cypress": "^2.13.3", "eslint-plugin-cypress": "^2.13.3",
"eslint-plugin-storybook": "^0.6.11", "eslint-plugin-storybook": "^0.6.12",
"eslint-plugin-vue": "^9.4.0", "eslint-plugin-vue": "^9.15.0",
"jsdom": "^21.1.1", "jsdom": "^22.1.0",
"postcss": "^8.4.14", "postcss": "^8.4.14",
"postcss-import": "^15.1.0", "postcss-import": "^15.1.0",
"prettier": "^2.7.1", "prettier": "^2.8.8",
"prettier-plugin-organize-imports": "^3.1.1", "prettier-plugin-organize-imports": "^3.1.1",
"prettier-plugin-sort-json": "^1.0.0", "prettier-plugin-sort-json": "^1.0.0",
"prettier-plugin-tailwindcss": "^0.2.1", "prettier-plugin-tailwindcss": "^0.3.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"replace-in-file": "^6.3.5", "replace-in-file": "^6.3.5",
"sass": "^1.54.6", "sass": "^1.63.4",
"sass-loader": "^13.2.2", "sass-loader": "^13.3.2",
"start-server-and-test": "^2.0.0", "start-server-and-test": "^2.0.0",
"storybook": "^7.0.0-rc.5", "storybook": "^7.0.22",
"storybook-addon-designs": "^v7.0.0-beta.2", "storybook-addon-designs": "^v7.0.0-beta.2",
"storybook-tailwind-foundations": "^1.1.2", "storybook-tailwind-foundations": "^1.1.2",
"storybook-vue3-router": "^3.0.0-next.1", "storybook-vue3-router": "^3.0.0-next.1",
"tailwindcss": "^3.1.8", "tailwindcss": "^3.3.2",
"typescript": "^5.0.4", "typescript": "^5.1.3",
"vite": "^4.2.1", "vite": "^4.3.9",
"vitest": "^0.29.8", "vitest": "^0.32.2",
"vue-eslint-parser": "^9.2.1", "vue-eslint-parser": "^9.2.1",
"vue-tsc": "^1.0.9" "vue-tsc": "^1.8.1"
} }
} }

View File

@ -31,6 +31,7 @@ const items: Item[] = [
export const CourseSessionsMenuStory: Story = { export const CourseSessionsMenuStory: Story = {
args: { args: {
// @ts-ignore
items, items,
}, },
}; };

View File

@ -31,12 +31,14 @@ const input = (e: Event) => {
:class="{ :class="{
'opacity-50': disabled, 'opacity-50': disabled,
'cursor-not-allowed': disabled, 'cursor-not-allowed': disabled,
'cy-checked': checkboxItem.checked,
'cy-unchecked': !checkboxItem.checked,
}" }"
:data-cy="`it-checkbox-${checkboxItem.value}`"
class="inline-flex cursor-pointer" class="inline-flex cursor-pointer"
:data-cy="`it-checkbox-clicktarget-${checkboxItem.value}`"
> >
<label <label
class="cy-checkbox cy-checkbox-checked block flex h-8 items-center bg-contain bg-no-repeat pl-8 disabled:opacity-50" class="flex h-8 items-center bg-contain bg-no-repeat pl-8 disabled:opacity-50"
:class=" :class="
checkboxItem.checked checkboxItem.checked
? 'bg-[url(/static/icons/icon-checkbox-checked.svg)] hover:bg-[url(/static/icons/icon-checkbox-checked-hover.svg)]' ? 'bg-[url(/static/icons/icon-checkbox-checked.svg)] hover:bg-[url(/static/icons/icon-checkbox-checked-hover.svg)]'
@ -50,9 +52,9 @@ const input = (e: Event) => {
:checked="checkboxItem.checked" :checked="checkboxItem.checked"
:value="checkboxItem.value" :value="checkboxItem.value"
:disabled="disabled" :disabled="disabled"
:data-cy="`it-checkbox-${checkboxItem.value}-checkbox`"
class="sr-only" class="sr-only"
type="checkbox" type="checkbox"
:data-cy="`it-checkbox-${checkboxItem.value}`"
@keydown="keydown" @keydown="keydown"
@input="input" @input="input"
/> />

View File

@ -1,11 +1,13 @@
import type { ResultOf, TypedDocumentNode as DocumentNode, } from '@graphql-typed-document-node/core'; import type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';
import type { FragmentDefinitionNode } from 'graphql';
import type { Incremental } from './graphql';
export type FragmentType<TDocumentType extends DocumentNode<any, any>> = TDocumentType extends DocumentNode< export type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> = TDocumentType extends DocumentTypeDecoration<
infer TType, infer TType,
any any
> >
? TType extends { ' $fragmentName'?: infer TKey } ? [TType] extends [{ ' $fragmentName'?: infer TKey }]
? TKey extends string ? TKey extends string
? { ' $fragmentRefs'?: { [key in TKey]: TType } } ? { ' $fragmentRefs'?: { [key in TKey]: TType } }
: never : never
@ -14,35 +16,51 @@ export type FragmentType<TDocumentType extends DocumentNode<any, any>> = TDocume
// return non-nullable if `fragmentType` is non-nullable // return non-nullable if `fragmentType` is non-nullable
export function useFragment<TType>( export function useFragment<TType>(
_documentNode: DocumentNode<TType, any>, _documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentNode<TType, any>> fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
): TType; ): TType;
// return nullable if `fragmentType` is nullable // return nullable if `fragmentType` is nullable
export function useFragment<TType>( export function useFragment<TType>(
_documentNode: DocumentNode<TType, any>, _documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentNode<TType, any>> | null | undefined fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined
): TType | null | undefined; ): TType | null | undefined;
// return array of non-nullable if `fragmentType` is array of non-nullable // return array of non-nullable if `fragmentType` is array of non-nullable
export function useFragment<TType>( export function useFragment<TType>(
_documentNode: DocumentNode<TType, any>, _documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentNode<TType, any>>> fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
): ReadonlyArray<TType>; ): ReadonlyArray<TType>;
// return array of nullable if `fragmentType` is array of nullable // return array of nullable if `fragmentType` is array of nullable
export function useFragment<TType>( export function useFragment<TType>(
_documentNode: DocumentNode<TType, any>, _documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentNode<TType, any>>> | null | undefined fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
): ReadonlyArray<TType> | null | undefined; ): ReadonlyArray<TType> | null | undefined;
export function useFragment<TType>( export function useFragment<TType>(
_documentNode: DocumentNode<TType, any>, _documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentNode<TType, any>> | ReadonlyArray<FragmentType<DocumentNode<TType, any>>> | null | undefined fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
): TType | ReadonlyArray<TType> | null | undefined { ): TType | ReadonlyArray<TType> | null | undefined {
return fragmentType as any; return fragmentType as any;
} }
export function makeFragmentData< export function makeFragmentData<
F extends DocumentNode, F extends DocumentTypeDecoration<any, any>,
FT extends ResultOf<F> FT extends ResultOf<F>
>(data: FT, _fragment: F): FragmentType<F> { >(data: FT, _fragment: F): FragmentType<F> {
return data as FragmentType<F>; return data as FragmentType<F>;
} }
export function isFragmentReady<TQuery, TFrag>(
queryNode: DocumentTypeDecoration<TQuery, any>,
fragmentNode: TypedDocumentNode<TFrag>,
data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined
): data is FragmentType<typeof fragmentNode> {
const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__
?.deferredFields;
if (!deferredFields) return true;
const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;
const fragName = fragDef?.name?.value;
const fields = (fragName && deferredFields[fragName]) || [];
return fields.length > 0 && fields.every(field => data && field in data);
}

View File

@ -10,7 +10,7 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
* 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
* 3. It does not support dead code elimination, so it will add unused operations. * 3. It does not support dead code elimination, so it will add unused operations.
* *
* Therefore it is highly recommended to use the babel-plugin for production. * Therefore it is highly recommended to use the babel or swc plugin for production.
*/ */
const documents = { const documents = {
"\n mutation SendFeedbackMutation($input: SendFeedbackInput!) {\n send_feedback(input: $input) {\n feedback_response {\n id\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument, "\n mutation SendFeedbackMutation($input: SendFeedbackInput!) {\n send_feedback(input: $input) {\n feedback_response {\n id\n }\n errors {\n field\n messages\n }\n }\n }\n": types.SendFeedbackMutationDocument,
@ -25,7 +25,7 @@ const documents = {
* *
* @example * @example
* ```ts * ```ts
* const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
* ``` * ```
* *
* The query argument is unknown! * The query argument is unknown!

View File

@ -5,33 +5,35 @@ export type InputMaybe<T> = Maybe<T>;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }; export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }; export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }; export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
/** All built-in and custom scalars, mapped to their actual values */ /** All built-in and custom scalars, mapped to their actual values */
export type Scalars = { export type Scalars = {
ID: string; ID: { input: string; output: string; }
String: string; String: { input: string; output: string; }
Boolean: boolean; Boolean: { input: boolean; output: boolean; }
Int: number; Int: { input: number; output: number; }
Float: number; Float: { input: number; output: number; }
/** /**
* The `DateTime` scalar type represents a DateTime * The `DateTime` scalar type represents a DateTime
* value as specified by * value as specified by
* [iso8601](https://en.wikipedia.org/wiki/ISO_8601). * [iso8601](https://en.wikipedia.org/wiki/ISO_8601).
*/ */
DateTime: any; DateTime: { input: any; output: any; }
/** /**
* The `GenericScalar` scalar type represents a generic * The `GenericScalar` scalar type represents a generic
* GraphQL scalar value that could be: * GraphQL scalar value that could be:
* String, Boolean, Int, Float, List or Object. * String, Boolean, Int, Float, List or Object.
*/ */
GenericScalar: any; GenericScalar: { input: any; output: any; }
JSONStreamField: any; JSONStreamField: { input: any; output: any; }
/** /**
* Allows use of a JSON String for input / output from the GraphQL schema. * Allows use of a JSON String for input / output from the GraphQL schema.
* *
* Use of this type is *not recommended* as you lose the benefits of having a defined, static * Use of this type is *not recommended* as you lose the benefits of having a defined, static
* schema (one of the key benefits of GraphQL). * schema (one of the key benefits of GraphQL).
*/ */
JSONString: any; JSONString: { input: any; output: any; }
}; };
/** An enumeration. */ /** An enumeration. */
@ -63,42 +65,42 @@ export type AssignmentCompletionMutation = {
export type AssignmentCompletionType = { export type AssignmentCompletionType = {
__typename?: 'AssignmentCompletionType'; __typename?: 'AssignmentCompletionType';
additional_json_data: Scalars['JSONString']; additional_json_data: Scalars['JSONString']['output'];
assignment: AssignmentType; assignment: AssignmentType;
assignment_user: UserType; assignment_user: UserType;
completion_data?: Maybe<Scalars['GenericScalar']>; completion_data?: Maybe<Scalars['GenericScalar']['output']>;
completion_status: AssignmentAssignmentCompletionCompletionStatusChoices; completion_status: AssignmentAssignmentCompletionCompletionStatusChoices;
created_at: Scalars['DateTime']; created_at: Scalars['DateTime']['output'];
evaluation_grade?: Maybe<Scalars['Float']>; evaluation_grade?: Maybe<Scalars['Float']['output']>;
evaluation_points?: Maybe<Scalars['Float']>; evaluation_points?: Maybe<Scalars['Float']['output']>;
evaluation_submitted_at?: Maybe<Scalars['DateTime']>; evaluation_submitted_at?: Maybe<Scalars['DateTime']['output']>;
evaluation_user?: Maybe<UserType>; evaluation_user?: Maybe<UserType>;
id: Scalars['ID']; id: Scalars['ID']['output'];
submitted_at?: Maybe<Scalars['DateTime']>; submitted_at?: Maybe<Scalars['DateTime']['output']>;
updated_at: Scalars['DateTime']; updated_at: Scalars['DateTime']['output'];
}; };
export type AssignmentType = CoursePageInterface & { export type AssignmentType = CoursePageInterface & {
__typename?: 'AssignmentType'; __typename?: 'AssignmentType';
assignment_type: AssignmentAssignmentAssignmentTypeChoices; assignment_type: AssignmentAssignmentAssignmentTypeChoices;
content_type?: Maybe<Scalars['String']>; content_type?: Maybe<Scalars['String']['output']>;
/** Zeitaufwand als Text */ /** Zeitaufwand als Text */
effort_required: Scalars['String']; effort_required: Scalars['String']['output'];
/** Beschreibung der Bewertung */ /** Beschreibung der Bewertung */
evaluation_description: Scalars['String']; evaluation_description: Scalars['String']['output'];
/** URL zum Beurteilungsinstrument */ /** URL zum Beurteilungsinstrument */
evaluation_document_url: Scalars['String']; evaluation_document_url: Scalars['String']['output'];
evaluation_tasks?: Maybe<Scalars['JSONStreamField']>; evaluation_tasks?: Maybe<Scalars['JSONStreamField']['output']>;
frontend_url?: Maybe<Scalars['String']>; frontend_url?: Maybe<Scalars['String']['output']>;
id?: Maybe<Scalars['ID']>; id?: Maybe<Scalars['ID']['output']>;
/** Erläuterung der Ausgangslage */ /** Erläuterung der Ausgangslage */
intro_text: Scalars['String']; intro_text: Scalars['String']['output'];
live?: Maybe<Scalars['Boolean']>; live?: Maybe<Scalars['Boolean']['output']>;
performance_objectives?: Maybe<Scalars['JSONStreamField']>; performance_objectives?: Maybe<Scalars['JSONStreamField']['output']>;
slug?: Maybe<Scalars['String']>; slug?: Maybe<Scalars['String']['output']>;
tasks?: Maybe<Scalars['JSONStreamField']>; tasks?: Maybe<Scalars['JSONStreamField']['output']>;
title?: Maybe<Scalars['String']>; title?: Maybe<Scalars['String']['output']>;
translation_key?: Maybe<Scalars['String']>; translation_key?: Maybe<Scalars['String']['output']>;
}; };
/** An enumeration. */ /** An enumeration. */
@ -112,69 +114,69 @@ export enum CoreUserLanguageChoices {
} }
export type CoursePageInterface = { export type CoursePageInterface = {
content_type?: Maybe<Scalars['String']>; content_type?: Maybe<Scalars['String']['output']>;
frontend_url?: Maybe<Scalars['String']>; frontend_url?: Maybe<Scalars['String']['output']>;
id?: Maybe<Scalars['ID']>; id?: Maybe<Scalars['ID']['output']>;
live?: Maybe<Scalars['Boolean']>; live?: Maybe<Scalars['Boolean']['output']>;
slug?: Maybe<Scalars['String']>; slug?: Maybe<Scalars['String']['output']>;
title?: Maybe<Scalars['String']>; title?: Maybe<Scalars['String']['output']>;
translation_key?: Maybe<Scalars['String']>; translation_key?: Maybe<Scalars['String']['output']>;
}; };
export type CourseType = { export type CourseType = {
__typename?: 'CourseType'; __typename?: 'CourseType';
category_name: Scalars['String']; category_name: Scalars['String']['output'];
id: Scalars['ID']; id: Scalars['ID']['output'];
learning_path?: Maybe<LearningPathType>; learning_path?: Maybe<LearningPathType>;
slug: Scalars['String']; slug: Scalars['String']['output'];
title: Scalars['String']; title: Scalars['String']['output'];
}; };
export type ErrorType = { export type ErrorType = {
__typename?: 'ErrorType'; __typename?: 'ErrorType';
field: Scalars['String']; field: Scalars['String']['output'];
messages: Array<Scalars['String']>; messages: Array<Scalars['String']['output']>;
}; };
export type FeedbackResponse = Node & { export type FeedbackResponse = Node & {
__typename?: 'FeedbackResponse'; __typename?: 'FeedbackResponse';
created_at: Scalars['DateTime']; created_at: Scalars['DateTime']['output'];
data?: Maybe<Scalars['GenericScalar']>; data?: Maybe<Scalars['GenericScalar']['output']>;
/** The ID of the object */ /** The ID of the object */
id: Scalars['ID']; id: Scalars['ID']['output'];
}; };
export type LearningPathType = CoursePageInterface & { export type LearningPathType = CoursePageInterface & {
__typename?: 'LearningPathType'; __typename?: 'LearningPathType';
content_type?: Maybe<Scalars['String']>; content_type?: Maybe<Scalars['String']['output']>;
depth: Scalars['Int']; depth: Scalars['Int']['output'];
draft_title: Scalars['String']; draft_title: Scalars['String']['output'];
expire_at?: Maybe<Scalars['DateTime']>; expire_at?: Maybe<Scalars['DateTime']['output']>;
expired: Scalars['Boolean']; expired: Scalars['Boolean']['output'];
first_published_at?: Maybe<Scalars['DateTime']>; first_published_at?: Maybe<Scalars['DateTime']['output']>;
frontend_url?: Maybe<Scalars['String']>; frontend_url?: Maybe<Scalars['String']['output']>;
go_live_at?: Maybe<Scalars['DateTime']>; go_live_at?: Maybe<Scalars['DateTime']['output']>;
has_unpublished_changes: Scalars['Boolean']; has_unpublished_changes: Scalars['Boolean']['output'];
id?: Maybe<Scalars['ID']>; id?: Maybe<Scalars['ID']['output']>;
last_published_at?: Maybe<Scalars['DateTime']>; last_published_at?: Maybe<Scalars['DateTime']['output']>;
latest_revision_created_at?: Maybe<Scalars['DateTime']>; latest_revision_created_at?: Maybe<Scalars['DateTime']['output']>;
live?: Maybe<Scalars['Boolean']>; live?: Maybe<Scalars['Boolean']['output']>;
locked: Scalars['Boolean']; locked: Scalars['Boolean']['output'];
locked_at?: Maybe<Scalars['DateTime']>; locked_at?: Maybe<Scalars['DateTime']['output']>;
locked_by?: Maybe<UserType>; locked_by?: Maybe<UserType>;
numchild: Scalars['Int']; numchild: Scalars['Int']['output'];
owner?: Maybe<UserType>; owner?: Maybe<UserType>;
path: Scalars['String']; path: Scalars['String']['output'];
/** Die informative Beschreibung, dargestellt in Suchmaschinen-Ergebnissen unter der Überschrift. */ /** Die informative Beschreibung, dargestellt in Suchmaschinen-Ergebnissen unter der Überschrift. */
search_description: Scalars['String']; search_description: Scalars['String']['output'];
/** Der Titel der Seite, dargestellt in Suchmaschinen-Ergebnissen als die verlinkte Überschrift. */ /** Der Titel der Seite, dargestellt in Suchmaschinen-Ergebnissen als die verlinkte Überschrift. */
seo_title: Scalars['String']; seo_title: Scalars['String']['output'];
/** Ob ein Link zu dieser Seite in automatisch generierten Menüs auftaucht. */ /** Ob ein Link zu dieser Seite in automatisch generierten Menüs auftaucht. */
show_in_menus: Scalars['Boolean']; show_in_menus: Scalars['Boolean']['output'];
slug?: Maybe<Scalars['String']>; slug?: Maybe<Scalars['String']['output']>;
title?: Maybe<Scalars['String']>; title?: Maybe<Scalars['String']['output']>;
translation_key?: Maybe<Scalars['String']>; translation_key?: Maybe<Scalars['String']['output']>;
url_path: Scalars['String']; url_path: Scalars['String']['output'];
}; };
export type Mutation = { export type Mutation = {
@ -190,19 +192,19 @@ export type MutationSend_FeedbackArgs = {
export type MutationUpsert_Assignment_CompletionArgs = { export type MutationUpsert_Assignment_CompletionArgs = {
assignment_id: Scalars['ID']; assignment_id: Scalars['ID']['input'];
assignment_user_id?: InputMaybe<Scalars['ID']>; assignment_user_id?: InputMaybe<Scalars['ID']['input']>;
completion_data_string?: InputMaybe<Scalars['String']>; completion_data_string?: InputMaybe<Scalars['String']['input']>;
completion_status?: InputMaybe<Scalars['String']>; completion_status?: InputMaybe<Scalars['String']['input']>;
course_session_id: Scalars['ID']; course_session_id: Scalars['ID']['input'];
evaluation_grade?: InputMaybe<Scalars['Float']>; evaluation_grade?: InputMaybe<Scalars['Float']['input']>;
evaluation_points?: InputMaybe<Scalars['Float']>; evaluation_points?: InputMaybe<Scalars['Float']['input']>;
}; };
/** An object with an ID */ /** An object with an ID */
export type Node = { export type Node = {
/** The ID of the object */ /** The ID of the object */
id: Scalars['ID']; id: Scalars['ID']['output'];
}; };
export type Query = { export type Query = {
@ -214,32 +216,32 @@ export type Query = {
export type QueryAssignmentArgs = { export type QueryAssignmentArgs = {
id?: InputMaybe<Scalars['ID']>; id?: InputMaybe<Scalars['ID']['input']>;
slug?: InputMaybe<Scalars['String']>; slug?: InputMaybe<Scalars['String']['input']>;
}; };
export type QueryAssignment_CompletionArgs = { export type QueryAssignment_CompletionArgs = {
assignment_id: Scalars['ID']; assignment_id: Scalars['ID']['input'];
assignment_user_id?: InputMaybe<Scalars['ID']>; assignment_user_id?: InputMaybe<Scalars['ID']['input']>;
course_session_id: Scalars['ID']; course_session_id: Scalars['ID']['input'];
}; };
export type QueryCourseArgs = { export type QueryCourseArgs = {
id?: InputMaybe<Scalars['Int']>; id?: InputMaybe<Scalars['Int']['input']>;
}; };
export type SendFeedbackInput = { export type SendFeedbackInput = {
clientMutationId?: InputMaybe<Scalars['String']>; clientMutationId?: InputMaybe<Scalars['String']['input']>;
course_session: Scalars['Int']; course_session: Scalars['Int']['input'];
data?: InputMaybe<Scalars['GenericScalar']>; data?: InputMaybe<Scalars['GenericScalar']['input']>;
page: Scalars['String']; page: Scalars['String']['input'];
}; };
export type SendFeedbackPayload = { export type SendFeedbackPayload = {
__typename?: 'SendFeedbackPayload'; __typename?: 'SendFeedbackPayload';
clientMutationId?: Maybe<Scalars['String']>; clientMutationId?: Maybe<Scalars['String']['output']>;
/** May contain more than one error for same field. */ /** May contain more than one error for same field. */
errors?: Maybe<Array<Maybe<ErrorType>>>; errors?: Maybe<Array<Maybe<ErrorType>>>;
feedback_response?: Maybe<FeedbackResponse>; feedback_response?: Maybe<FeedbackResponse>;
@ -247,14 +249,14 @@ export type SendFeedbackPayload = {
export type UserType = { export type UserType = {
__typename?: 'UserType'; __typename?: 'UserType';
avatar_url: Scalars['String']; avatar_url: Scalars['String']['output'];
email: Scalars['String']; email: Scalars['String']['output'];
first_name: Scalars['String']; first_name: Scalars['String']['output'];
id: Scalars['ID']; id: Scalars['ID']['output'];
language: CoreUserLanguageChoices; language: CoreUserLanguageChoices;
last_name: Scalars['String']; last_name: Scalars['String']['output'];
/** Erforderlich. 150 Zeichen oder weniger. Nur Buchstaben, Ziffern und @/./+/-/_. */ /** Erforderlich. 150 Zeichen oder weniger. Nur Buchstaben, Ziffern und @/./+/-/_. */
username: Scalars['String']; username: Scalars['String']['output'];
}; };
export type SendFeedbackMutationMutationVariables = Exact<{ export type SendFeedbackMutationMutationVariables = Exact<{
@ -265,29 +267,29 @@ export type SendFeedbackMutationMutationVariables = Exact<{
export type SendFeedbackMutationMutation = { __typename?: 'Mutation', send_feedback?: { __typename?: 'SendFeedbackPayload', feedback_response?: { __typename?: 'FeedbackResponse', id: string } | null, errors?: Array<{ __typename?: 'ErrorType', field: string, messages: Array<string> } | null> | null } | null }; export type SendFeedbackMutationMutation = { __typename?: 'Mutation', send_feedback?: { __typename?: 'SendFeedbackPayload', feedback_response?: { __typename?: 'FeedbackResponse', id: string } | null, errors?: Array<{ __typename?: 'ErrorType', field: string, messages: Array<string> } | null> | null } | null };
export type UpsertAssignmentCompletionMutationVariables = Exact<{ export type UpsertAssignmentCompletionMutationVariables = Exact<{
assignmentId: Scalars['ID']; assignmentId: Scalars['ID']['input'];
courseSessionId: Scalars['ID']; courseSessionId: Scalars['ID']['input'];
assignmentUserId?: InputMaybe<Scalars['ID']>; assignmentUserId?: InputMaybe<Scalars['ID']['input']>;
completionStatus: Scalars['String']; completionStatus: Scalars['String']['input'];
completionDataString: Scalars['String']; completionDataString: Scalars['String']['input'];
evaluationGrade?: InputMaybe<Scalars['Float']>; evaluationGrade?: InputMaybe<Scalars['Float']['input']>;
evaluationPoints?: InputMaybe<Scalars['Float']>; evaluationPoints?: InputMaybe<Scalars['Float']['input']>;
}>; }>;
export type UpsertAssignmentCompletionMutation = { __typename?: 'Mutation', upsert_assignment_completion?: { __typename?: 'AssignmentCompletionMutation', assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null } | null } | null }; export type UpsertAssignmentCompletionMutation = { __typename?: 'Mutation', upsert_assignment_completion?: { __typename?: 'AssignmentCompletionMutation', assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null } | null } | null };
export type AssignmentCompletionQueryQueryVariables = Exact<{ export type AssignmentCompletionQueryQueryVariables = Exact<{
assignmentId: Scalars['ID']; assignmentId: Scalars['ID']['input'];
courseSessionId: Scalars['ID']; courseSessionId: Scalars['ID']['input'];
assignmentUserId?: InputMaybe<Scalars['ID']>; assignmentUserId?: InputMaybe<Scalars['ID']['input']>;
}>; }>;
export type AssignmentCompletionQueryQuery = { __typename?: 'Query', assignment?: { __typename?: 'AssignmentType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, content_type?: string | null, effort_required: string, evaluation_description: string, evaluation_document_url: string, evaluation_tasks?: any | null, id?: string | null, intro_text: string, performance_objectives?: any | null, slug?: string | null, tasks?: any | null, title?: string | null, translation_key?: string | null } | null, assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null, evaluation_user?: { __typename?: 'UserType', id: string } | null, assignment_user: { __typename?: 'UserType', id: string } } | null }; export type AssignmentCompletionQueryQuery = { __typename?: 'Query', assignment?: { __typename?: 'AssignmentType', assignment_type: AssignmentAssignmentAssignmentTypeChoices, content_type?: string | null, effort_required: string, evaluation_description: string, evaluation_document_url: string, evaluation_tasks?: any | null, id?: string | null, intro_text: string, performance_objectives?: any | null, slug?: string | null, tasks?: any | null, title?: string | null, translation_key?: string | null } | null, assignment_completion?: { __typename?: 'AssignmentCompletionType', id: string, completion_status: AssignmentAssignmentCompletionCompletionStatusChoices, submitted_at?: any | null, evaluation_submitted_at?: any | null, evaluation_grade?: number | null, evaluation_points?: number | null, completion_data?: any | null, evaluation_user?: { __typename?: 'UserType', id: string } | null, assignment_user: { __typename?: 'UserType', id: string } } | null };
export type CourseQueryQueryVariables = Exact<{ export type CourseQueryQueryVariables = Exact<{
courseId: Scalars['Int']; courseId: Scalars['Int']['input'];
}>; }>;

View File

@ -54,6 +54,10 @@ const upsertAssignmentCompletionMutation = useMutation(
UPSERT_ASSIGNMENT_COMPLETION_MUTATION UPSERT_ASSIGNMENT_COMPLETION_MUTATION
); );
// FIXME daniel: `useRouteQuery` from usevue is currently the reason that we have to
// fix the version of @vueuse/router and @vueuse/core to 10.1.0
// it fails with version 10.2.0. I have a reminder to check out the situation
// at the end of July 2023
// 0 = introduction, 1 - n = tasks, n+1 = submission // 0 = introduction, 1 - n = tasks, n+1 = submission
const stepIndex = useRouteQuery("step", "0", { transform: Number, mode: "push" }); const stepIndex = useRouteQuery("step", "0", { transform: Number, mode: "push" });

View File

@ -1,6 +1,6 @@
import { login } from "../helpers"; import { login } from "../helpers";
describe("student test", () => { describe("assignmentStudent.cy.js", () => {
beforeEach(() => { beforeEach(() => {
cy.manageCommand("cypress_reset"); cy.manageCommand("cypress_reset");
login("test-student1@example.com", "test"); login("test-student1@example.com", "test");
@ -24,6 +24,10 @@ describe("student test", () => {
); );
cy.learningContentMultiLayoutNextStep(); cy.learningContentMultiLayoutNextStep();
cy.testLearningContentTitle(
"Teilaufgabe 2: Kundensituation und Ausgangslage"
);
cy.learningContentMultiLayoutNextStep(); cy.learningContentMultiLayoutNextStep();
cy.testLearningContentTitle("Teilaufgabe 3: Aktuelle Versicherung"); cy.testLearningContentTitle("Teilaufgabe 3: Aktuelle Versicherung");
@ -41,9 +45,13 @@ describe("student test", () => {
"Teilaufgabe 1: Beispiel einer Versicherungspolice finden" "Teilaufgabe 1: Beispiel einer Versicherungspolice finden"
); );
// Click confirmation // Click confirmation
cy.get('[data-cy="it-checkbox-clicktarget-confirmation-1"]').click(); cy.get('[data-cy="it-checkbox-confirmation-1"]').click();
cy.reload(); cy.reload();
cy.get('[data-cy="it-checkbox-confirmation-1"]').should("be.checked"); cy.get('[data-cy="it-checkbox-confirmation-1"]').should(
"have.class",
"cy-checked"
);
}); });
it("can save text", () => { it("can save text", () => {

View File

@ -1,7 +1,7 @@
import { TEST_STUDENT1_USER_ID } from "../../consts"; import { TEST_STUDENT1_USER_ID } from "../../consts";
import { login } from "../helpers"; import { login } from "../helpers";
describe("trainer test", () => { describe("assignmentTrainer.cy.js", () => {
beforeEach(() => { beforeEach(() => {
cy.manageCommand("cypress_reset --create-completion"); cy.manageCommand("cypress_reset --create-completion");
login("test-trainer1@example.com", "test"); login("test-trainer1@example.com", "test");

View File

@ -16,18 +16,22 @@ describe("circle.cy.js", () => {
cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug"); cy.get('[data-cy="circle-title"]').should("contain", "Fahrzeug");
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox' '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"]'
).should("have.class", "cy-unchecked");
cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"]'
).click(); ).click();
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked' '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"]'
).should("have.class", "cy-checkbox-checked"); ).should("have.class", "cy-checked");
// completion data should still be there after reload // completion data should still be there after reload
cy.reload(); cy.reload();
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked' '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"]'
).should("have.class", "cy-checkbox-checked"); ).should("have.class", "cy-checked");
}); });
it("can open learning contents and complete them by continuing", () => { it("can open learning contents and complete them by continuing", () => {
@ -48,11 +52,11 @@ describe("circle.cy.js", () => {
cy.get('[data-cy="complete-and-continue"]').click({ force: true }); cy.get('[data-cy="complete-and-continue"]').click({ force: true });
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick-checkbox"] > .cy-checkbox-checked' '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-verschaffe-dir-einen-überblick-checkbox"]'
).should("have.class", "cy-checkbox-checked"); ).should("have.class", "cy-checked");
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"] > .cy-checkbox-checked' '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-handlungsfeld-fahrzeug-checkbox"]'
).should("have.class", "cy-checkbox-checked"); ).should("have.class", "cy-checked");
}); });
it("continue button works", () => { it("continue button works", () => {

View File

@ -41,7 +41,7 @@ describe("learningPath.cy.js", () => {
// mark a learning content in second circle // mark a learning content in second circle
cy.get('[data-cy="circle-Reisen"]').click({ force: true }); cy.get('[data-cy="circle-Reisen"]').click({ force: true });
cy.get( cy.get(
'[data-cy="test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen-checkbox"] > .cy-checkbox' '[data-cy="test-lehrgang-lp-circle-reisen-lc-fachcheck-reisen-checkbox"]'
).click(); ).click();
cy.get('[data-cy="back-to-learning-path-button"]').click(); cy.get('[data-cy="back-to-learning-path-button"]').click();

View File

@ -9,7 +9,6 @@ describe("notification list page", () => {
it("can paginate notifications", () => { it("can paginate notifications", () => {
login("admin", "test"); login("admin", "test");
cy.visit("/notifications"); cy.visit("/notifications");
cy.wait(2000);
cy.get('[data-cy="no-notifications"]').should("not.exist"); cy.get('[data-cy="no-notifications"]').should("not.exist");
cy.get("[data-cy^=notification-idx-]").should("have.length", 7); cy.get("[data-cy^=notification-idx-]").should("have.length", 7);
@ -22,7 +21,7 @@ describe("notification list page", () => {
// We load additional 7 notifications // We load additional 7 notifications
cy.get('[data-cy="load-more-notifications"]').click(); cy.get('[data-cy="load-more-notifications"]').click();
cy.get("[data-cy^=notification-idx-]").should("have.length", 14); cy.get("[data-cy^=notification-idx-]").should("have.length", 13);
for (let i = 0; i < 7; i++) { for (let i = 0; i < 7; i++) {
cy.get(`[data-cy=notification-idx-${i}]`).within(() => { cy.get(`[data-cy=notification-idx-${i}]`).within(() => {
@ -65,7 +64,6 @@ describe("notification popover", () => {
it("displays four notifications", () => { it("displays four notifications", () => {
login("admin", "test"); login("admin", "test");
cy.visit("/"); cy.visit("/");
cy.wait(1000);
toggleNotificationPopover(); toggleNotificationPopover();
cy.get("[data-cy^=notification-idx-]").should("have.length", 4); cy.get("[data-cy^=notification-idx-]").should("have.length", 4);
@ -74,7 +72,6 @@ describe("notification popover", () => {
it("can show all notifications", () => { it("can show all notifications", () => {
login("admin", "test"); login("admin", "test");
cy.visit("/"); cy.visit("/");
cy.wait(1000);
toggleNotificationPopover(); toggleNotificationPopover();
cy.get('[data-cy="show-all-notifications"]').click({ force: true }); cy.get('[data-cy="show-all-notifications"]').click({ force: true });
@ -93,31 +90,55 @@ describe("email notification settings", () => {
it("can update email notification settings", () => { it("can update email notification settings", () => {
login("admin", "test"); login("admin", "test");
cy.visit("/settings"); cy.visit("/settings");
cy.wait(2000);
// Checking prerequisites // Checking prerequisites
cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should("not.be.checked"); cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should(
cy.get('[data-cy="it-checkbox-INFORMATION"]').should("not.be.checked"); "have.class",
cy.get('[data-cy="it-checkbox-PROGRESS"]').should("not.be.checked"); "cy-unchecked"
);
cy.get('[data-cy="it-checkbox-INFORMATION"]').should(
"have.class",
"cy-unchecked"
);
cy.get('[data-cy="it-checkbox-PROGRESS"]').should(
"have.class",
"cy-unchecked"
);
cy.get('[data-cy="it-checkbox-clicktarget-INFORMATION"]').click(); // there is maybe a timing problem with the api endpoint
cy.get('[data-cy="it-checkbox-INFORMATION"]').should("be.checked"); // so for the test we will only click once at time...
cy.wait(400); cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').click();
cy.visit("/settings"); cy.wait(500);
cy.wait(1000); cy.reload();
cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should("not.be.checked"); cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should(
cy.get('[data-cy="it-checkbox-INFORMATION"]').should("be.checked"); "have.class",
cy.get('[data-cy="it-checkbox-PROGRESS"]').should("not.be.checked"); "cy-checked"
);
cy.get('[data-cy="it-checkbox-INFORMATION"]').should(
"have.class",
"cy-unchecked"
);
cy.get('[data-cy="it-checkbox-PROGRESS"]').should(
"have.class",
"cy-unchecked"
);
cy.get('[data-cy="it-checkbox-clicktarget-INFORMATION"]').click(); cy.get('[data-cy="it-checkbox-INFORMATION"]').click();
cy.get('[data-cy="it-checkbox-INFORMATION"]').should("not.be.checked");
cy.wait(400);
cy.visit("/settings"); cy.wait(500);
cy.wait(1000); cy.reload();
cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should("not.be.checked"); cy.get('[data-cy="it-checkbox-USER_INTERACTION"]').should(
cy.get('[data-cy="it-checkbox-INFORMATION"]').should("not.be.checked"); "have.class",
cy.get('[data-cy="it-checkbox-PROGRESS"]').should("not.be.checked"); "cy-checked"
);
cy.get('[data-cy="it-checkbox-INFORMATION"]').should(
"have.class",
"cy-checked"
);
cy.get('[data-cy="it-checkbox-PROGRESS"]').should(
"have.class",
"cy-unchecked"
);
}); });
}); });

View File

@ -22,7 +22,7 @@ from vbv_lernwelt.notify.models import Notification
def command(create_completion): def command(create_completion):
print("cypress reset data") print("cypress reset data")
CourseCompletion.objects.all().delete() CourseCompletion.objects.all().delete()
Notification.objects.all().mark_all_as_deleted() Notification.objects.all().delete()
AssignmentCompletion.objects.all().delete() AssignmentCompletion.objects.all().delete()
User.objects.all().update(language="de") User.objects.all().update(language="de")
User.objects.all().update(additional_json_data={}) User.objects.all().update(additional_json_data={})