Add cypress tests
This commit is contained in:
parent
e6fbf0d276
commit
dbd6b31895
|
|
@ -25,6 +25,7 @@ const getIconName = () => {
|
|||
<div
|
||||
class="flex flex-col gap-4 py-8 lg:flex-row lg:items-center lg:gap-0"
|
||||
:class="{ 'border-b': props.addBorderBottom }"
|
||||
:data-cy="`assignment-${assignment.slug}`"
|
||||
>
|
||||
<component :is="getIconName()" class="mr-4 hidden h-9 w-9 lg:block"></component>
|
||||
<div class="flex w-[420px] flex-col">
|
||||
|
|
|
|||
|
|
@ -44,7 +44,10 @@ const progressStatusCount = computed(() => {
|
|||
|
||||
<template>
|
||||
<div>
|
||||
<div class="mb-4 bg-white p-8">
|
||||
<div
|
||||
class="mb-4 bg-white p-8"
|
||||
:data-cy="`certificate-${competenceCertificate.slug}`"
|
||||
>
|
||||
<div class="flex flex-col lg:flex-row lg:items-center">
|
||||
<div
|
||||
v-if="numAssignmentsEvaluated < numAssignmentsTotal"
|
||||
|
|
@ -89,6 +92,7 @@ const progressStatusCount = computed(() => {
|
|||
<router-link
|
||||
:to="competenceCertificate.frontend_url"
|
||||
class="btn-text mt-4 inline-flex items-center py-2 pl-0"
|
||||
:data-cy="`certificate-${competenceCertificate.slug}-detail-link`"
|
||||
>
|
||||
<span>{{ $t("a.Details anzeigen") }}</span>
|
||||
<it-icon-arrow-right></it-icon-arrow-right>
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ onMounted(async () => {
|
|||
<div class="container-large">
|
||||
<h2 class="mb-4 lg:py-4">{{ $t("a.Kompetenznachweise") }}</h2>
|
||||
|
||||
<div class="mb-4 bg-white p-8">
|
||||
<div class="mb-4 bg-white p-8" data-cy="certificate-total-points-text">
|
||||
<div class="flex flex-col lg:flex-row lg:items-center">
|
||||
<div
|
||||
v-if="numAssignmentsEvaluated < assignments.length"
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
<div class="flex items-center">
|
||||
<h3>{{ $t("a.Kompetenznachweise") }}</h3>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<div class="mt-4" data-cy="certificate-total-points-text">
|
||||
<div v-if="userPointsEvaluatedAssignments > 0">
|
||||
{{ $t("a.Zwischenstand") }} {{ $t("a.Gesamtpunktzahl") }}:
|
||||
<span class="font-bold">
|
||||
|
|
@ -82,6 +82,7 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
v-for="certificate in competenceCertificates"
|
||||
:key="certificate.id"
|
||||
class="flex flex-col justify-between border-b py-4 first:border-t lg:flex-row lg:items-center"
|
||||
:data-cy="`certificate-${certificate.slug}`"
|
||||
>
|
||||
<div class="text-bold text-xl">
|
||||
{{ certificate.title }}
|
||||
|
|
@ -120,6 +121,7 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
<router-link
|
||||
:to="`/course/${props.courseSlug}/competence/certificates`"
|
||||
class="btn-text mt-4 inline-flex items-center py-2 pl-0"
|
||||
data-cy="certificates-show-all-button"
|
||||
>
|
||||
<span>{{ $t("a.Details anzeigen") }}</span>
|
||||
<it-icon-arrow-right></it-icon-arrow-right>
|
||||
|
|
@ -142,7 +144,10 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
<h5 class="mb-4 text-gray-700">«{{ $t("selfEvaluation.no") }}»</h5>
|
||||
<div class="flex flex-row items-center">
|
||||
<it-icon-smiley-thinking class="h-16 w-16"></it-icon-smiley-thinking>
|
||||
<p class="ml-4 inline-block text-7xl font-bold">
|
||||
<p
|
||||
class="ml-4 inline-block text-7xl font-bold"
|
||||
data-cy="self-evaluation-fail"
|
||||
>
|
||||
{{ performanceCriteriaStatusCount.FAIL }}
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -153,7 +158,10 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
<h5 class="mb-4 text-gray-700">«{{ $t("selfEvaluation.yes") }}»</h5>
|
||||
<div class="flex flex-row items-center">
|
||||
<it-icon-smiley-happy class="h-16 w-16"></it-icon-smiley-happy>
|
||||
<p class="ml-4 inline-block text-7xl font-bold">
|
||||
<p
|
||||
class="ml-4 inline-block text-7xl font-bold"
|
||||
data-cy="self-evaluation-success"
|
||||
>
|
||||
{{ performanceCriteriaStatusCount.SUCCESS }}
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -162,7 +170,10 @@ const performanceCriteriaStatusCount = computed(() => {
|
|||
<h5 class="mb-4 text-gray-700">{{ $t("competences.notAssessed") }}</h5>
|
||||
<div class="flex flex-row items-center">
|
||||
<it-icon-smiley-neutral class="h-16 w-16"></it-icon-smiley-neutral>
|
||||
<p class="ml-4 inline-block text-7xl font-bold">
|
||||
<p
|
||||
class="ml-4 inline-block text-7xl font-bold"
|
||||
data-cy="self-evaluation-unknown"
|
||||
>
|
||||
{{ performanceCriteriaStatusCount.UNKNOWN }}
|
||||
</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ const uniqueLearningUnits = computed(() => {
|
|||
return {
|
||||
luId: pc.learning_unit.id,
|
||||
luTitle: pc.learning_unit.title,
|
||||
luSlug: pc.learning_unit.slug,
|
||||
circleId: pc.circle.id,
|
||||
circleTitle: pc.circle.title,
|
||||
url: pc.learning_unit.evaluate_url,
|
||||
|
|
@ -73,7 +74,7 @@ const criteriaByLearningUnit = computed(() => {
|
|||
<it-icon-smiley-thinking
|
||||
class="mr-2 inline-block h-8 w-8"
|
||||
></it-icon-smiley-thinking>
|
||||
<div class="w-6">
|
||||
<div class="w-6" :data-cy="`${selfEvaluation.luSlug}-fail`">
|
||||
{{ selfEvaluation.countFail }}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -81,7 +82,7 @@ const criteriaByLearningUnit = computed(() => {
|
|||
<it-icon-smiley-happy
|
||||
class="mr-2 inline-block h-8 w-8"
|
||||
></it-icon-smiley-happy>
|
||||
<div class="w-6">
|
||||
<div class="w-6" :data-cy="`${selfEvaluation.luSlug}-success`">
|
||||
{{ selfEvaluation.countSuccess }}
|
||||
</div>
|
||||
</li>
|
||||
|
|
@ -89,14 +90,18 @@ const criteriaByLearningUnit = computed(() => {
|
|||
<it-icon-smiley-neutral
|
||||
class="mr-2 inline-block h-8 w-8"
|
||||
></it-icon-smiley-neutral>
|
||||
<div class="w-6">
|
||||
<div class="w-6" :data-cy="`${selfEvaluation.luSlug}-unknown`">
|
||||
{{ selfEvaluation.countUnknown }}
|
||||
</div>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<router-link :to="selfEvaluation.url" class="link">
|
||||
<router-link
|
||||
:to="selfEvaluation.url"
|
||||
class="link"
|
||||
:data-cy="`${selfEvaluation.luSlug}-open`"
|
||||
>
|
||||
{{ $t("a.Selbsteinschätzung anschauen") }}
|
||||
</router-link>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,43 +0,0 @@
|
|||
import { login } from "./helpers";
|
||||
|
||||
describe("competence.cy.js", () => {
|
||||
beforeEach(() => {
|
||||
cy.manageCommand("cypress_reset");
|
||||
|
||||
login("test-student1@example.com", "test");
|
||||
|
||||
// test-lehrgang-lp-circle-reisen-lu-reisen ist eine Selbstevaluation
|
||||
// mit mehreren Schritten
|
||||
cy.visit("/course/test-lehrgang/learn/reisen");
|
||||
});
|
||||
|
||||
it("self evaluation should be neutral", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="unknown"]')
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("should be able to make a happy self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([true, true]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="success"]')
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("should be able to make a fail self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([false, false]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="fail"]')
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("should be able to make a mixed self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([false, true]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="fail"]')
|
||||
.should("exist");
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
import { login } from "../helpers";
|
||||
|
||||
describe("competenceCertificate.cy.js", () => {
|
||||
beforeEach(() => {});
|
||||
|
||||
it("check without points", () => {
|
||||
cy.manageCommand("cypress_reset");
|
||||
login("test-student1@example.com", "test");
|
||||
cy.visit("/course/test-lehrgang/competence");
|
||||
|
||||
cy.get('[data-cy="certificate-total-points-text"]').contains(
|
||||
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet."
|
||||
);
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should("contain", "0 von 0 Punkten")
|
||||
.and("contain", "0 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check on certificates page
|
||||
cy.get('[data-cy="certificates-show-all-button"]').click();
|
||||
cy.get('[data-cy="certificate-total-points-text"]').contains(
|
||||
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet."
|
||||
);
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should(
|
||||
"contain",
|
||||
"Der Punktestand wird zu einem späteren Zeitpunkt berechnet."
|
||||
)
|
||||
.and("contain", "0 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check certificate detail page
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
|
||||
).click();
|
||||
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]'
|
||||
).should("contain", "Höchstpunktzahl");
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]'
|
||||
).should("contain", "Höchstpunktzahl");
|
||||
});
|
||||
|
||||
it("check with finished edoniq test", () => {
|
||||
cy.manageCommand(
|
||||
"cypress_reset --create-assignment-completion --create-edoniq-test-results"
|
||||
);
|
||||
login("test-student1@example.com", "test");
|
||||
cy.visit("/course/test-lehrgang/competence");
|
||||
|
||||
cy.get('[data-cy="certificate-total-points-text"]').contains(
|
||||
"Zwischenstand Gesamtpunktzahl: 19 von 24 Punkten"
|
||||
);
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should("contain", "19 von 24 Punkten")
|
||||
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check on certificates page
|
||||
cy.get('[data-cy="certificates-show-all-button"]').click();
|
||||
cy.get('[data-cy="certificate-total-points-text"]')
|
||||
.should("contain", "19")
|
||||
.and("contain", "Zwischenstand");
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should("contain", "19")
|
||||
.and("contain", "Zwischenstand")
|
||||
.and("contain", "1 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check certificate detail page
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
|
||||
).click();
|
||||
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]'
|
||||
)
|
||||
.should("contain", "Höchstpunktzahl")
|
||||
.and("contain", "Ergebnisse abgegeben");
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]'
|
||||
)
|
||||
.should("contain", "19")
|
||||
.and("contain", "Bewertung freigegeben");
|
||||
});
|
||||
|
||||
it("check with finished edoniq test and finished casework", () => {
|
||||
cy.manageCommand(
|
||||
"cypress_reset --create-assignment-evaluation --create-edoniq-test-results"
|
||||
);
|
||||
login("test-student1@example.com", "test");
|
||||
cy.visit("/course/test-lehrgang/competence");
|
||||
|
||||
cy.get('[data-cy="certificate-total-points-text"]').contains(
|
||||
"Zwischenstand Gesamtpunktzahl: 43 von 48 Punkten"
|
||||
);
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should("contain", "43 von 48 Punkten")
|
||||
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check on certificates page
|
||||
cy.get('[data-cy="certificates-show-all-button"]').click();
|
||||
cy.get('[data-cy="certificate-total-points-text"]')
|
||||
.should("contain", "43")
|
||||
.and("not.contain", "Zwischenstand");
|
||||
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1"]'
|
||||
)
|
||||
.should("contain", "43")
|
||||
.and("not.contain", "Zwischenstand")
|
||||
.and("contain", "2 von 2 Kompetenznachweis-Elementen");
|
||||
|
||||
// check certificate detail page
|
||||
cy.get(
|
||||
'[data-cy="certificate-test-lehrgang-competencenavi-certificates-kompetenznachweis-1-detail-link"]'
|
||||
).click();
|
||||
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-überprüfen-einer-motorfahrzeugs-versicherungspolice"]'
|
||||
)
|
||||
.should("contain", "24")
|
||||
.and("contain", "von 24 Punkten")
|
||||
.and("contain", "Bewertung freigegeben");
|
||||
cy.get(
|
||||
'[data-cy="assignment-test-lehrgang-assignment-edoniq-wissens-und-verständisfragen-circle-fahrzeug-demo"]'
|
||||
)
|
||||
.should("contain", "19")
|
||||
.and("contain", "von 24 Punkten")
|
||||
.and("contain", "Bewertung freigegeben");
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
import { login } from "../helpers";
|
||||
|
||||
describe("selfEvaluation.cy.js", () => {
|
||||
beforeEach(() => {
|
||||
cy.manageCommand("cypress_reset");
|
||||
|
||||
login("test-student1@example.com", "test");
|
||||
|
||||
// test-lehrgang-lp-circle-reisen-lu-reisen ist eine Selbstevaluation
|
||||
// mit mehreren Schritten
|
||||
cy.visit("/course/test-lehrgang/learn/reisen");
|
||||
});
|
||||
|
||||
it("self evaluation should be neutral", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="unknown"]')
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("self evaluation from KompetenzNavi", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="unknown"]')
|
||||
.should("exist");
|
||||
|
||||
// data in KompetenzNavi/Übersicht is correct
|
||||
cy.visit("/course/test-lehrgang/competence");
|
||||
cy.get('[data-cy="self-evaluation-fail"]').should("have.text", "0");
|
||||
cy.get('[data-cy="self-evaluation-success"]').should("have.text", "0");
|
||||
cy.get('[data-cy="self-evaluation-unknown"]').should("have.text", "4");
|
||||
|
||||
// data in KompetenzNavi/Selbsteinschätzungen is correct
|
||||
cy.visit("/course/test-lehrgang/competence/criteria");
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-fail"]').should(
|
||||
"have.text",
|
||||
"0"
|
||||
);
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-success"]'
|
||||
).should("have.text", "0");
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-unknown"]'
|
||||
).should("have.text", "2");
|
||||
|
||||
// it can open self evaluation from within KompetenzNavi
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-open"]').click();
|
||||
|
||||
// starting the self evaluation will return to KompetenzNavi
|
||||
cy.makeSelfEvaluation([true, false]);
|
||||
cy.url().should("include", "/course/test-lehrgang/competence/criteria");
|
||||
|
||||
// check data again on KompetenzNavi
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-fail"]').should(
|
||||
"have.text",
|
||||
"1"
|
||||
);
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-success"]'
|
||||
).should("have.text", "1");
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-unknown"]'
|
||||
).should("have.text", "0");
|
||||
|
||||
// data in KompetenzNavi/Übersicht is correct
|
||||
cy.visit("/course/test-lehrgang/competence");
|
||||
cy.get('[data-cy="self-evaluation-fail"]').should("have.text", "1");
|
||||
cy.get('[data-cy="self-evaluation-success"]').should("have.text", "1");
|
||||
cy.get('[data-cy="self-evaluation-unknown"]').should("have.text", "2");
|
||||
});
|
||||
|
||||
it("should be able to make a happy self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([true, true]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="success"]')
|
||||
.should("exist");
|
||||
|
||||
// starting the self evaluation from circle should return to circle
|
||||
cy.url().should("include", "/course/test-lehrgang/learn/reisen");
|
||||
|
||||
// data in KompetenzNavi / Selbsteinschätzungen is correct
|
||||
cy.visit("/course/test-lehrgang/competence/criteria");
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-fail"]').should(
|
||||
"have.text",
|
||||
"0"
|
||||
);
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-success"]'
|
||||
).should("have.text", "2");
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-unknown"]'
|
||||
).should("have.text", "0");
|
||||
});
|
||||
|
||||
it("should be able to make a fail self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([false, false]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="fail"]')
|
||||
.should("exist");
|
||||
|
||||
// data in KompetenzNavi / Selbsteinschätzungen is correct
|
||||
cy.visit("/course/test-lehrgang/competence/criteria");
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-fail"]').should(
|
||||
"have.text",
|
||||
"2"
|
||||
);
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-success"]'
|
||||
).should("have.text", "0");
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-unknown"]'
|
||||
).should("have.text", "0");
|
||||
});
|
||||
|
||||
it("should be able to make a mixed self evaluation", () => {
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]').click();
|
||||
cy.makeSelfEvaluation([false, true]);
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen"]')
|
||||
.find('[data-cy="fail"]')
|
||||
.should("exist");
|
||||
|
||||
// data in KompetenzNavi / Selbsteinschätzungen is correct
|
||||
cy.visit("/course/test-lehrgang/competence/criteria");
|
||||
cy.get('[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-fail"]').should(
|
||||
"have.text",
|
||||
"1"
|
||||
);
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-success"]'
|
||||
).should("have.text", "1");
|
||||
cy.get(
|
||||
'[data-cy="test-lehrgang-lp-circle-reisen-lu-reisen-unknown"]'
|
||||
).should("have.text", "0");
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue