diff --git a/.github/workflows/axe.yml b/.github/workflows/axe.yml index 771dd8a3edcd..8507df2a98a9 100644 --- a/.github/workflows/axe.yml +++ b/.github/workflows/axe.yml @@ -16,17 +16,17 @@ jobs: matrix: browser: [firefox] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches diff --git a/.github/workflows/comment-goodfirstissue.yml b/.github/workflows/comment-goodfirstissue.yml index 97c001be75fe..b5c788944131 100644 --- a/.github/workflows/comment-goodfirstissue.yml +++ b/.github/workflows/comment-goodfirstissue.yml @@ -12,7 +12,7 @@ jobs: steps: - name: Add comment - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/component.yml b/.github/workflows/component.yml index 11ecfb7357f0..77a246454d50 100644 --- a/.github/workflows/component.yml +++ b/.github/workflows/component.yml @@ -19,19 +19,19 @@ jobs: os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: '0' - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 18 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -40,7 +40,7 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - name: Cache eslint - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ./.eslintcache @@ -48,7 +48,7 @@ jobs: restore-keys: | ${{ runner.os }}-eslint- - name: Cache stylelint - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ./.stylelintcache @@ -68,17 +68,17 @@ jobs: os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches diff --git a/.github/workflows/dev-docs.yml b/.github/workflows/dev-docs.yml index 07d2416241a5..61e9954ea54d 100644 --- a/.github/workflows/dev-docs.yml +++ b/.github/workflows/dev-docs.yml @@ -17,14 +17,14 @@ jobs: shell: bash working-directory: docs steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: - java-version: '11' - distribution: 'temurin' + java-version: 11 + distribution: temurin - name: Install Graphviz run: sudo apt install graphviz - run: npm ci diff --git a/.github/workflows/e2e-sql.yml b/.github/workflows/e2e-sql.yml index 0a67cbac52d1..c1d70b8b1f57 100644 --- a/.github/workflows/e2e-sql.yml +++ b/.github/workflows/e2e-sql.yml @@ -20,17 +20,17 @@ jobs: browser: [firefox] tests: [stable, unstable] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -53,4 +53,4 @@ jobs: ./gradlew serverRun & ./wait-for-server.sh - name: Start Tests - run: xvfb-run --server-args="-screen 0 1024x768x24" ./gradlew -P${{ matrix.tests }} e2eTestsSql \ No newline at end of file + run: xvfb-run --server-args="-screen 0 1024x768x24" ./gradlew -P${{ matrix.tests }} e2eTestsSql diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 52ab76019ed2..565253ba2f46 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -20,17 +20,17 @@ jobs: browser: [firefox] tests: [stable, unstable] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 18 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches @@ -54,4 +54,3 @@ jobs: ./wait-for-server.sh - name: Start Tests run: xvfb-run --server-args="-screen 0 1024x768x24" ./gradlew -P${{ matrix.tests }} e2eTests - \ No newline at end of file diff --git a/.github/workflows/jdk17.yml b/.github/workflows/jdk17.yml index 29ab59bb5619..7b50447b7aae 100644 --- a/.github/workflows/jdk17.yml +++ b/.github/workflows/jdk17.yml @@ -9,9 +9,9 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: temurin java-version: 17 @@ -20,9 +20,9 @@ jobs: component-testing: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: temurin java-version: 17 diff --git a/.github/workflows/jdk21.yml b/.github/workflows/jdk21.yml new file mode 100644 index 000000000000..cb551fc44fa5 --- /dev/null +++ b/.github/workflows/jdk21.yml @@ -0,0 +1,34 @@ +name: Component Tests (JDK 21) + +on: + push: + branches: + - master + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + - name: Run Backend Linting + run: ./gradlew lint --continue + component-testing: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 21 + - name: Update Property File + run: mv src/test/resources/test.ci-ubuntu-latest.properties src/test/resources/test.properties + - name: Run Solr search service + run: docker-compose run -d -p 8983:8983 solr + - name: Run Backend Tests + run: ./gradlew createConfigs componentTests diff --git a/.github/workflows/lnp.yml b/.github/workflows/lnp.yml index 2ff33dda9206..595ad697efc1 100644 --- a/.github/workflows/lnp.yml +++ b/.github/workflows/lnp.yml @@ -11,14 +11,14 @@ jobs: LnP-testing: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: 'temurin' - java-version: '11' + distribution: temurin + java-version: 11 - name: Cache Gradle packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 03f11d9b6d38..7885aa57cd8c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,7 +13,7 @@ jobs: permissions: pull-requests: write steps: - - uses: actions/github-script@v6 + - uses: actions/github-script@v7 with: script: | const pr = await github.rest.pulls.get({ diff --git a/build.gradle b/build.gradle index 90abb909473c..c31de8ad72de 100644 --- a/build.gradle +++ b/build.gradle @@ -8,10 +8,10 @@ apply plugin: "jacoco" apply plugin: "cz.habarta.typescript-generator" apply plugin: "org.liquibase.gradle" -def checkstyleVersion = "10.3.2" -def pmdVersion = "6.48.0" -def spotbugsVersion = "4.7.1" -def jacocoVersion = "0.8.8" +def checkstyleVersion = "10.15.0" +def pmdVersion = "7.0.0" +def spotbugsVersion = "4.8.4" +def jacocoVersion = "0.8.12" buildscript { repositories { @@ -21,13 +21,13 @@ buildscript { } } dependencies { - classpath "com.google.cloud.tools:appengine-gradle-plugin:2.4.4" - classpath "com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.9" - classpath("cz.habarta.typescript-generator:typescript-generator-gradle-plugin:2.36.1070") { + classpath "com.google.cloud.tools:appengine-gradle-plugin:2.8.0" + classpath "com.github.spotbugs.snom:spotbugs-gradle-plugin:6.0.12" + classpath("cz.habarta.typescript-generator:typescript-generator-gradle-plugin:3.2.1263") { exclude group: "org.gradle" } - classpath "com.google.guava:guava:31.1-jre" - classpath "org.liquibase:liquibase-gradle-plugin:2.1.1" + classpath "com.google.guava:guava:33.1.0-jre" + classpath "org.liquibase:liquibase-gradle-plugin:2.2.1" } } @@ -37,12 +37,19 @@ configurations { liquibaseRuntime.extendsFrom testImplementation } +// See https://github.com/checkstyle/checkstyle/issues/14211#issuecomment-1884129948 +configurations.all { + resolutionStrategy.capabilitiesResolution.withCapability("com.google.collections:google-collections") { + select("com.google.guava:guava:0") + } +} + repositories { mavenCentral() } def objectify = "com.googlecode.objectify:objectify:6.0.7" -def testng = "org.testng:testng:7.6.1" +def testng = "org.testng:testng:7.10.1" dependencies { staticAnalysis("com.puppycrawl.tools:checkstyle:${checkstyleVersion}") @@ -52,56 +59,56 @@ dependencies { annotationProcessor(objectify) - implementation("com.google.auth:google-auth-library-oauth2-http:1.8.1") - implementation(platform("com.google.cloud:google-cloud-bom:0.176.0")) + implementation("com.google.auth:google-auth-library-oauth2-http:1.23.0") + implementation(platform("com.google.cloud:google-cloud-bom:0.218.0")) implementation("com.google.cloud:google-cloud-datastore") implementation("com.google.cloud:google-cloud-tasks") implementation("com.google.cloud:google-cloud-logging") - implementation("com.google.code.gson:gson:2.9.0") - implementation("com.google.firebase:firebase-admin:9.1.1") - implementation("com.google.guava:guava:31.1-jre") + implementation("com.google.code.gson:gson:2.10.1") + implementation("com.google.firebase:firebase-admin:9.2.0") + implementation("com.google.guava:guava:33.1.0-jre") implementation(objectify) - implementation("com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20220608.1") + implementation("com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20240325.1") implementation("com.helger:ph-commons:9.5.5") // necessary to add SpotBugs suppression - implementation("com.mailjet:mailjet-client:5.2.0") - implementation("com.sendgrid:sendgrid-java:4.9.3") + implementation("com.mailjet:mailjet-client:5.2.5") + implementation("com.sendgrid:sendgrid-java:4.10.2") implementation("com.sun.jersey:jersey-client:1.19.4") implementation("com.sun.jersey:jersey-core:1.19.4") implementation("com.sun.jersey.contribs:jersey-multipart:1.19.4") - implementation("org.apache.solr:solr-solrj:8.11.1") - implementation(platform("org.eclipse.jetty:jetty-bom:10.0.13")) + implementation("org.apache.solr:solr-solrj:8.11.3") + implementation(platform("org.eclipse.jetty:jetty-bom:11.0.20")) implementation("org.eclipse.jetty:jetty-slf4j-impl") implementation("org.eclipse.jetty:jetty-server") implementation("org.eclipse.jetty:jetty-webapp") implementation("org.eclipse.jetty:jetty-annotations") - implementation("org.jsoup:jsoup:1.15.2") - implementation("org.hibernate.orm:hibernate-core:6.1.6.Final") - implementation("org.postgresql:postgresql:42.7.2") - implementation("org.hibernate:hibernate-hikaricp:6.1.6.Final") + implementation("org.jsoup:jsoup:1.17.2") + implementation("org.hibernate.orm:hibernate-core:6.4.4.Final") + implementation("org.postgresql:postgresql:42.7.3") + implementation("org.hibernate:hibernate-hikaricp:6.4.4.Final") testAnnotationProcessor(testng) testImplementation("com.tngtech.archunit:archunit:0.11.0") - testImplementation("junit:junit:4.13.2") - testImplementation("org.seleniumhq.selenium:selenium-java:4.3.0") - testImplementation("com.deque.html.axe-core:selenium:4.6.0") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2") + testImplementation("org.seleniumhq.selenium:selenium-java:4.19.1") + testImplementation("com.deque.html.axe-core:selenium:4.9.0") testImplementation(testng) - testImplementation("org.testcontainers:postgresql:1.17.6") - testImplementation("org.liquibase:liquibase-core:4.19.0") - testImplementation("org.mockito:mockito-core:5.1.1") + testImplementation("org.testcontainers:postgresql:1.19.7") + testImplementation("org.liquibase:liquibase-core:4.27.0") + testImplementation("org.mockito:mockito-core:5.11.0") // For supporting authorization code flow locally - testImplementation("com.google.oauth-client:google-oauth-client-jetty:1.34.1") + testImplementation("com.google.oauth-client:google-oauth-client-jetty:1.35.0") // For using Gmail API - testImplementation("com.google.apis:google-api-services-gmail:v1-rev20220404-1.32.1") + testImplementation("com.google.apis:google-api-services-gmail:v1-rev20231218-2.0.0") // For using JMeter APIs - testImplementation("org.apache.jmeter:ApacheJMeter_core:5.5") { + testImplementation("org.apache.jmeter:ApacheJMeter_core:5.6.2") { exclude group: "org.apache.jmeter", module: "bom" } - testImplementation("org.apache.jmeter:ApacheJMeter_http:5.5") { + testImplementation("org.apache.jmeter:ApacheJMeter_http:5.6.2") { exclude group: "org.apache.jmeter", module: "bom" } - liquibaseRuntime("info.picocli:picocli:4.7.1") + liquibaseRuntime("info.picocli:picocli:4.7.5") liquibaseRuntime(sourceSets.main.output) } @@ -136,6 +143,10 @@ sourceSets { } } +if (!project.hasProperty("runList")) { + project.ext.set("runList", "main") +} + liquibase { activities { main { @@ -145,13 +156,29 @@ liquibase { username project.properties['liquibaseUsername'] password project.properties['liquibasePassword'] } + snapshot { + url project.properties['liquibaseDbUrl'] + username project.properties['liquibaseUsername'] + password project.properties['liquibasePassword'] + snapshotFormat "json" + outputFile "liquibase-snapshot.json" + } + diffMain { + searchPath "${projectDir}" + changeLogFile "src/main/resources/db/changelog/db.changelog-new.xml" + referenceUrl project.properties['liquibaseDbUrl'] + referenceUsername project.properties['liquibaseUsername'] + referencePassword project.properties['liquibasePassword'] + url "offline:postgresql?snapshot=liquibase-snapshot.json" + } } + runList = project.ext.runList } tasks.withType(cz.habarta.typescript.generator.gradle.GenerateTask) { jsonLibrary = "jackson2" optionalAnnotations = [ - "javax.annotation.Nullable" + "jakarta.annotation.Nullable" ] outputFileType = "implementationFile" outputKind = "module" @@ -392,16 +419,16 @@ pmd { } spotbugs { - reportLevel = "low" + reportLevel = com.github.spotbugs.snom.Confidence.valueOf("LOW") toolVersion = spotbugsVersion includeFilter = file("$rootProject.projectDir/static-analysis/teammates-spotbugs.xml") } tasks.withType(com.github.spotbugs.snom.SpotBugsTask) { reports { - xml.enabled = false - html.enabled = false - text.enabled = true + xml.required = false + html.required = false + text.required = true } } @@ -612,6 +639,8 @@ task e2eTests { afterTest afterTestClosure if (isFirstTry) { afterSuite checkTestNgFailureClosure + } else { + mustRunAfter "e2eTestTry${id - 1}" } onlyIf { isFirstTry || file("${buildDir}/reports/${outputFileName}${id - 1}/testng-failed.xml").exists() @@ -649,6 +678,8 @@ task e2eTestsSql { afterTest afterTestClosure if (isFirstTry) { afterSuite checkTestNgFailureClosure + } else { + mustRunAfter "e2eSqlTestTry${id - 1}" } onlyIf { isFirstTry || file("${buildDir}/reports/${outputFileName}${id - 1}/testng-failed.xml").exists() @@ -681,6 +712,8 @@ task axeTests { afterTest afterTestClosure if (isFirstTry) { afterSuite checkTestNgFailureClosure + } else { + mustRunAfter "axeTestTry${id - 1}" } onlyIf { isFirstTry || file("${buildDir}/reports/axe-test-try-${id - 1}/testng-failed.xml").exists() diff --git a/docs/_markbind/layouts/default.md b/docs/_markbind/layouts/default.md index f92791366a06..e57ee418a494 100644 --- a/docs/_markbind/layouts/default.md +++ b/docs/_markbind/layouts/default.md @@ -27,6 +27,7 @@ * [Captcha]({{ baseUrl }}/captcha.html) * [Documentation]({{ baseUrl }}/documentation.html) * [Emails]({{ baseUrl }}/emails.html) + * [Unit Testing]({{ baseUrl }}/unit-testing.html) * [End-to-End Testing]({{ baseUrl }}/e2e-testing.html) * [Performance Testing]({{ baseUrl }}/performance-testing.html) * [Accessibility Testing]({{ baseUrl }}/axe-testing.html) diff --git a/docs/development.md b/docs/development.md index 703a1ce57b08..aec8c3696caa 100644 --- a/docs/development.md +++ b/docs/development.md @@ -291,7 +291,9 @@ There are two big categories of testing in TEAMMATES: - **Component tests**: white-box unit and integration tests, i.e. they test the application components with full knowledge of the components' internal workings. This is configured in `src/test/resources/testng-component.xml` (back-end) and `src/web/jest.config.js` (front-end). - **E2E (end-to-end) tests**: black-box tests, i.e. they test the application as a whole without knowing any internal working. This is configured in `src/e2e/resources/testng-e2e.xml`. To learn more about E2E tests, refer to this [document](e2e-testing.md). -#### Running the tests +
Instructions for first session
", + "createdTime": "2012-04-01T23:59:00Z", + "startTime": "2012-04-01T22:00:00Z", + "endTime": "2026-04-30T22:00:00Z", + "sessionVisibleFromTime": "2012-04-01T22:00:00Z", + "resultsVisibleFromTime": "2026-05-01T22:00:00Z", + "timeZone": "Africa/Johannesburg", + "gracePeriod": 10, + "sentOpenEmail": false, + "sentClosingEmail": false, + "sentClosedEmail": false, + "sentPublishedEmail": false, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "studentDeadlines": {}, + "instructorDeadlines": {}, + "id": "00000000-0000-4000-8000-000000000701", + "course": { + "id": "tm.e2e.FNumScaleQn.CS2104" + }, + "name": "First Session" + }, + "openSession2": { + "creatorEmail": "tmms.test@gmail.tmt", + "instructions": "Instructions for second session
", + "createdTime": "2012-04-01T23:59:00Z", + "startTime": "2012-04-01T22:00:00Z", + "endTime": "2026-04-30T22:00:00Z", + "sessionVisibleFromTime": "2012-04-01T22:00:00Z", + "resultsVisibleFromTime": "2026-05-01T22:00:00Z", + "timeZone": "Africa/Johannesburg", + "gracePeriod": 10, + "sentOpenEmail": false, + "sentClosingEmail": false, + "sentClosedEmail": false, + "sentPublishedEmail": false, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "studentDeadlines": {}, + "instructorDeadlines": {}, + "id": "00000000-0000-4000-8000-000000000702", + "course": { + "id": "tm.e2e.FNumScaleQn.CS1101" + }, + "name": "Second Session" + } + }, + "feedbackQuestions": { + "qn1ForFirstSession": { + "id": "00000000-0000-4000-8000-000000000801", + "feedbackSession": { + "id": "00000000-0000-4000-8000-000000000701" + }, + "questionDetails": { + "questionType": "NUMSCALE", + "questionText": "Rate this team's product", + "minScale": 0, + "maxScale": 10, + "step": 0.2 + }, + "description": "Testing description for first session
", + "questionNumber": 1, + "giverType": "STUDENTS", + "recipientType": "TEAMS_EXCLUDING_SELF", + "numOfEntitiesToGiveFeedbackTo": 1, + "showResponsesTo": ["INSTRUCTORS", "RECEIVER"], + "showGiverNameTo": ["INSTRUCTORS"], + "showRecipientNameTo": ["INSTRUCTORS", "RECEIVER"] + }, + "qn1ForSecondSession": { + "id": "00000000-0000-4000-8000-000000000802", + "feedbackSession": { + "id": "00000000-0000-4000-8000-000000000702" + }, + "questionDetails": { + "questionType": "NUMSCALE", + "questionText": "Rate this team's teamwork", + "minScale": 1, + "maxScale": 10, + "step": 0.005 + }, + "description": "Testing description for second session
", + "questionNumber": 1, + "giverType": "STUDENTS", + "recipientType": "TEAMS_EXCLUDING_SELF", + "numOfEntitiesToGiveFeedbackTo": 1, + "showResponsesTo": ["INSTRUCTORS", "RECEIVER"], + "showGiverNameTo": ["INSTRUCTORS"], + "showRecipientNameTo": ["INSTRUCTORS", "RECEIVER"] + } + }, + "notifications": {}, + "readNotifications": {}, + "feedbackResponseComments": {}, + "students": { + "alice.tmms@FNumScaleQn.CS2104": { + "id": "00000000-0000-4000-8000-000000000601", + "account": { + "id": "00000000-0000-4000-8000-000000000002" + }, + "course": { + "id": "tm.e2e.FNumScaleQn.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "email": "alice.b.tmms@gmail.tmt", + "name": "Alice Betsy", + "comments": "This student's name is Alice Betsy" + }, + "benny.tmms@FNumScaleQn.CS2104": { + "id": "00000000-0000-4000-8000-000000000602", + "course": { + "id": "tm.e2e.FNumScaleQn.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000202" + }, + "email": "benny.tmms@gmail.tmt", + "name": "Benny Charles", + "comments": "This student's name is Benny Charles" + }, + "charlie.tmms@FNumScaleQn.CS1101": { + "id": "00000000-0000-4000-8000-000000000603", + "course": { + "id": "tm.e2e.FNumScaleQn.CS1101" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000203" + }, + "email": "charlie.tmms@gmail.tmt", + "name": "Charlie Davis", + "comments": "This student's name is Charlie Davis" + } + } +} diff --git a/src/e2e/resources/data/InstructorHomePageE2ETestSql.json b/src/e2e/resources/data/InstructorHomePageE2ETestSql.json new file mode 100644 index 000000000000..ec5fa8858b77 --- /dev/null +++ b/src/e2e/resources/data/InstructorHomePageE2ETestSql.json @@ -0,0 +1,452 @@ +{ + "accounts": { + "IHome.instr": { + "id": "00000000-0000-4000-8000-000000000001", + "googleId": "tm.e2e.IHome.instructor.tmms", + "name": "Teammates Test", + "email": "IHome.instructor.tmms@gmail.tmt" + } + }, + "accountRequests": {}, + "courses": { + "IHome.CS2104": { + "id": "tm.e2e.IHome.CS2104", + "name": "Programming Language Concepts", + "timeZone": "Asia/Singapore", + "institute": "TEAMMATES Test Institute 1", + "createdAt": "2012-04-01T23:58:00Z" + }, + "IHome.CS1101": { + "id": "tm.e2e.IHome.CS1101", + "name": "Programming Methodology", + "timeZone": "Asia/Singapore", + "institute": "TEAMMATES Test Institute 1", + "createdAt": "2013-04-01T23:59:00Z" + } + }, + "sections": { + "tm.e2e.IHome.CS2104-None": { + "id": "00000000-0000-4000-8000-000000000201", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "name": "None" + }, + "tm.e2e.IHome.CS1101-None": { + "id": "00000000-0000-4000-8000-000000000202", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "name": "None" + } + }, + "teams": { + "tm.e2e.IHome.CS2104-None-Team1": { + "id": "00000000-0000-4000-8000-000000000301", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 1" + }, + "tm.e2e.IHome.CS2104-None-Team2": { + "id": "00000000-0000-4000-8000-000000000302", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 2" + }, + "tm.e2e.IHome.CS1101-None-Team1": { + "id": "00000000-0000-4000-8000-000000000303", + "section": { + "id": "00000000-0000-4000-8000-000000000202" + }, + "name": "Team 1" + }, + "tm.e2e.IHome.CS1101-None-Team2": { + "id": "00000000-0000-4000-8000-000000000304", + "section": { + "id": "00000000-0000-4000-8000-000000000202" + }, + "name": "Team 2" + } + }, + "deadlineExtensions": {}, + "instructors": { + "IHome.instr.CS2104": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000501", + "courseId": "tm.e2e.IHome.CS2104", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "IHome.instructor.tmms@gmail.tmt" + }, + "IHome.instr.CS1101": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000502", + "courseId": "tm.e2e.IHome.CS1101", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "IHome.instructor.tmms@gmail.tmt" + } + }, + "students": { + "IHome.alice.b.tmms@IHome.CS2104": { + "comments": "This student's name is Alice Betsy", + "id": "00000000-0000-4000-8000-000000000601", + "courseId": "tm.e2e.IHome.CS2104", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Alice Betsy", + "email": "IHome.alice.b.tmms@gmail.tmt" + }, + "IHome.benny.c.tmms@IHome.CS2104": { + "comments": "This student's name is Benny Charles", + "id": "00000000-0000-4000-8000-000000000602", + "courseId": "tm.e2e.IHome.CS2104", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Benny Charles", + "email": "IHome.benny.c.tmms@gmail.tmt" + }, + "IHome.charlie.d.tmms@IHome.CS2104": { + "comments": "This student's name is Charlie Davis", + "id": "00000000-0000-4000-8000-000000000603", + "courseId": "tm.e2e.IHome.CS2104", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000302" + }, + "name": "Charlie Davis", + "email": "IHome.charlie.d.tmms@gmail.tmt" + }, + "IHome.danny.e.tmms@IHome.CS2104": { + "comments": "This student's name is Danny Engrid", + "id": "00000000-0000-4000-8000-000000000604", + "courseId": "tm.e2e.IHome.CS2104", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000302" + }, + "name": "Danny Engrid", + "email": "IHome.danny.e.tmms@gmail.tmt" + }, + "IHome.alice.b.tmms@IHome.CS1101": { + "comments": "This student's name is Alice Betsy", + "id": "00000000-0000-4000-8000-000000000605", + "courseId": "tm.e2e.IHome.CS1101", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000303" + }, + "name": "Alice Betsy", + "email": "IHome.alice.b.tmms@gmail.tmt" + }, + "IHome.benny.c.tmms@IHome.CS1101": { + "comments": "This student's name is Benny Charles", + "id": "00000000-0000-4000-8000-000000000606", + "courseId": "tm.e2e.IHome.CS1101", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000303" + }, + "name": "Benny Charles", + "email": "IHome.benny.c.tmms@gmail.tmt" + }, + "IHome.charlie.d.tmms@IHome.CS1101": { + "comments": "This student's name is Charlie Davis", + "id": "00000000-0000-4000-8000-000000000607", + "courseId": "tm.e2e.IHome.CS1101", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000304" + }, + "name": "Charlie Davis", + "email": "IHome.charlie.d.tmms@gmail.tmt" + }, + "IHome.danny.e.tmms@IHome.CS1101": { + "comments": "This student's name is Danny Engrid", + "id": "00000000-0000-4000-8000-000000000608", + "courseId": "tm.e2e.IHome.CS1101", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000304" + }, + "name": "Danny Engrid", + "email": "IHome.danny.e.tmms@gmail.tmt" + } + }, + "feedbackSessions": { + "First Feedback Session": { + "id": "00000000-0000-4000-8000-000000000701", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "name": "First Feedback Session", + "creatorEmail": "IHome.instructor.tmms@gmail.tmt", + "instructions": "Please please fill in the following questions.", + "startTime": "2012-04-01T04:00:00Z", + "endTime": "2027-04-30T16:00:00Z", + "sessionVisibleFromTime": "2012-03-28T16:00:00Z", + "resultsVisibleFromTime": "2027-05-01T16:00:00Z", + "gracePeriod": 10, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "isOpeningSoonEmailSent": false, + "isOpenEmailSent": false, + "isClosingSoonEmailSent": false, + "isClosedEmailSent": false, + "isPublishedEmailSent": false, + "createdAt": "2012-03-20T23:59:00Z" + }, + "Second Feedback Session": { + "id": "00000000-0000-4000-8000-000000000702", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "name": "Second Feedback Session", + "creatorEmail": "IHome.instructor.tmms@gmail.tmt", + "instructions": "Please please fill in the following questions.", + "startTime": "2012-03-29T04:00:00Z", + "endTime": "2012-05-01T04:00:00Z", + "sessionVisibleFromTime": "2012-03-28T16:00:00Z", + "resultsVisibleFromTime": "2012-05-01T16:00:00Z", + "gracePeriod": 10, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "isOpeningSoonEmailSent": false, + "isOpenEmailSent": false, + "isClosingSoonEmailSent": false, + "isClosedEmailSent": false, + "isPublishedEmailSent": false, + "createdAt": "2012-03-20T23:59:00Z" + }, + "Third Feedback Session": { + "id": "00000000-0000-4000-8000-000000000703", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "name": "Third Feedback Session", + "creatorEmail": "IHome.instructor.tmms@gmail.tmt", + "instructions": "Please please fill in the following questions.", + "startTime": "2012-04-10T16:00:00Z", + "endTime": "2012-04-30T16:00:00Z", + "sessionVisibleFromTime": "2012-03-28T16:00:00Z", + "resultsVisibleFromTime": "2027-05-01T16:00:00Z", + "gracePeriod": 10, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "isOpeningSoonEmailSent": false, + "isOpenEmailSent": false, + "isClosingSoonEmailSent": false, + "isClosedEmailSent": false, + "isPublishedEmailSent": false, + "createdAt": "2012-03-20T23:59:00Z" + }, + "Fourth Feedback Session": { + "id": "00000000-0000-4000-8000-000000000704", + "course": { + "id": "tm.e2e.IHome.CS2104" + }, + "name": "Fourth Feedback Session", + "creatorEmail": "IHome.instructor.tmms@gmail.tmt", + "instructions": "Please please fill in the following questions.", + "startTime": "2012-04-05T04:00:00Z", + "endTime": "2012-04-20T04:00:00Z", + "sessionVisibleFromTime": "2012-03-28T16:00:00Z", + "resultsVisibleFromTime": "2012-05-01T16:00:00Z", + "gracePeriod": 10, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "isOpeningSoonEmailSent": false, + "isOpenEmailSent": false, + "isClosingSoonEmailSent": false, + "isClosedEmailSent": false, + "isPublishedEmailSent": false, + "createdAt": "2012-03-20T23:59:00Z" + }, + "CS1101 Session": { + "id": "00000000-0000-4000-8000-000000000705", + "course": { + "id": "tm.e2e.IHome.CS1101" + }, + "name": "CS1101 Session", + "creatorEmail": "IHome.instructor.tmms@gmail.tmt", + "instructions": "Please please fill in the following questions.", + "startTime": "2012-04-05T04:00:00Z", + "endTime": "2012-04-20T04:00:00Z", + "sessionVisibleFromTime": "2012-03-28T16:00:00Z", + "resultsVisibleFromTime": "2012-05-01T16:00:00Z", + "gracePeriod": 10, + "isOpeningEmailEnabled": true, + "isClosingEmailEnabled": true, + "isPublishedEmailEnabled": true, + "isOpeningSoonEmailSent": false, + "isOpenEmailSent": false, + "isClosingSoonEmailSent": false, + "isClosedEmailSent": false, + "isPublishedEmailSent": false, + "createdAt": "2012-03-20T23:59:00Z" + } + }, + "feedbackQuestions": { + "IHome.CS2104:First Feedback Session:Q1": { + "questionDetails": { + "shouldAllowRichText": true, + "questionType": "TEXT", + "questionText": "Rate 5 other students' products" + }, + "id": "00000000-0000-4000-8000-000000000801", + "feedbackSession": { + "id": "00000000-0000-4000-8000-000000000701" + }, + "description": "Feedback text question.", + "questionNumber": 1, + "giverType": "STUDENTS", + "recipientType": "STUDENTS", + "numOfEntitiesToGiveFeedbackTo": 5, + "showResponsesTo": [ + "INSTRUCTORS", + "RECEIVER" + ], + "showGiverNameTo": [ + "INSTRUCTORS" + ], + "showRecipientNameTo": [ + "INSTRUCTORS", + "RECEIVER" + ] + }, + "IHome.CS2104:Third Feedback Session:Q1": { + "questionDetails": { + "shouldAllowRichText": true, + "questionType": "TEXT", + "questionText": "Rate 5 other students' products" + }, + "id": "00000000-0000-4000-8000-000000000802", + "feedbackSession": { + "id": "00000000-0000-4000-8000-000000000703" + }, + "description": "Feedback text question.", + "questionNumber": 1, + "giverType": "STUDENTS", + "recipientType": "STUDENTS", + "numOfEntitiesToGiveFeedbackTo": 5, + "showResponsesTo": [ + "INSTRUCTORS", + "RECEIVER" + ], + "showGiverNameTo": [ + "INSTRUCTORS" + ], + "showRecipientNameTo": [ + "INSTRUCTORS", + "RECEIVER" + ] + } + }, + "feedbackResponses": { + "response1": { + "answer": { + "answer": "Alice response to Danny.", + "questionType": "TEXT" + }, + "id": "00000000-0000-4000-8000-000000000901", + "giver": "IHome.alice.b.tmms@gmail.tmt", + "giverSection": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "recipient": "IHome.danny.e.tmms@gmail.tmt", + "recipientSection": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "feedbackQuestion": { + "id": "00000000-0000-4000-8000-000000000801", + "questionDetails": { + "shouldAllowRichText": true, + "questionType": "TEXT", + "questionText": "Rate 5 other students' products" + } + } + } + }, + "feedbackResponseComments": {}, + "notifications": { + "notification1": { + "id": "00000000-0000-4000-8000-000000000002", + "startTime": "2011-01-01T00:00:00Z", + "endTime": "2099-01-01T00:00:00Z", + "style": "DANGER", + "targetUser": "GENERAL", + "title": "A deprecation note", + "message": "Deprecation happens in three minutes
", + "shown": false + } + }, + "readNotifications": {} +} diff --git a/src/e2e/resources/data/InstructorStudentListPageE2ETestSql.json b/src/e2e/resources/data/InstructorStudentListPageE2ETestSql.json new file mode 100644 index 000000000000..41c5f4af82e0 --- /dev/null +++ b/src/e2e/resources/data/InstructorStudentListPageE2ETestSql.json @@ -0,0 +1,282 @@ +{ + "accounts": { + "instructorOfCourse1": { + "googleId": "tm.e2e.ISList.instr1", + "name": "Instructor of Course 1", + "email": "ISList.instr1@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000001" + }, + "Student3Course3": { + "googleId": "tm.e2e.ISList.charlie.tmms", + "name": "Charlie D", + "email": "ISList.charlie.tmms@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000002" + } + }, + "accountRequests": {}, + "courses": { + "course1": { + "id": "tm.e2e.ISList.course1", + "name": "Name of Course 1", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1" + }, + "course2": { + "id": "tm.e2e.ISList.course2", + "name": "Name of Course 2", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1" + }, + "course3": { + "id": "tm.e2e.ISList.course3", + "name": "Name of Course 3", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 5" + } + }, + "sections": { + "tm.e2e.ISList.course2-SectionA": { + "id": "00000000-0000-4000-8000-000000000201", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "name": "Section A" + }, + "tm.e2e.ISList.course2-SectionB": { + "id": "00000000-0000-4000-8000-000000000202", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "name": "Section B" + }, + "tm.e2e.ISList.course3-Section1": { + "id": "00000000-0000-4000-8000-000000000203", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "name": "Section 1" + } + }, + "teams": { + "tm.e2e.ISList.course2-SectionA-Team1": { + "id": "00000000-0000-4000-8000-000000000301", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 1" + }, + "tm.e2e.ISList.course2-SectionB-Team2": { + "id": "00000000-0000-4000-8000-000000000302", + "section": { + "id": "00000000-0000-4000-8000-000000000202" + }, + "name": "Team 2" + }, + "tm.e2e.ISList.course3-Section1-Team1": { + "id": "00000000-0000-4000-8000-000000000303", + "section": { + "id": "00000000-0000-4000-8000-000000000203" + }, + "name": "Team 1" + }, + "tm.e2e.ISList.course3-Section1-Team2": { + "id": "00000000-0000-4000-8000-000000000304", + "section": { + "id": "00000000-0000-4000-8000-000000000203" + }, + "name": "Team 2" + } + }, + "deadlineExtensions": {}, + "instructors": { + "instructorOfCourse1": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000501", + "courseId": "tm.e2e.ISList.course1", + "course": { + "id": "tm.e2e.ISList.course1" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Instructor1 Course1", + "email": "ISList.instr1@gmail.tmt" + }, + "instructorOfCourse2": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_CUSTOM", + "privileges": { + "courseLevel": { + "canModifyCourse": false, + "canModifyInstructor": false, + "canModifySession": false, + "canModifyStudent": false, + "canViewStudentInSections": false, + "canViewSessionInSections": false, + "canSubmitSessionInSections": false, + "canModifySessionCommentsInSections": false + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000502", + "courseId": "tm.e2e.ISList.course2", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Instructor1 Course2", + "email": "ISList.instr1@gmail.tmt" + }, + "instructorOfCourse3": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000503", + "courseId": "tm.e2e.ISList.course3", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Instructor1 Course3", + "email": "ISList.instr1@gmail.tmt" + } + }, + "students": { + "Student1Course2": { + "comments": "This student's name is Alice", + "id": "00000000-0000-4000-8000-000000000601", + "courseId": "tm.e2e.ISList.course2", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Alice", + "email": "ISList.alice.tmms@gmail.tmt" + }, + "Student2Course2": { + "comments": "This student's name is Benny Charles", + "id": "00000000-0000-4000-8000-000000000602", + "courseId": "tm.e2e.ISList.course2", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000302" + }, + "name": "Benny Charles", + "email": "benny.c.tmms@gmail.tmt" + }, + "Student3Course2": { + "comments": "This student's name is Hugh Ivanov", + "id": "00000000-0000-4000-8000-000000000603", + "courseId": "tm.e2e.ISList.course2", + "course": { + "id": "tm.e2e.ISList.course2" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000302" + }, + "name": "Hugh Ivanov", + "email": "hugh.i.tmms@gmail.tmt" + }, + "Student1Course3": { + "comments": "This student's name is Alice", + "id": "00000000-0000-4000-8000-000000000604", + "courseId": "tm.e2e.ISList.course3", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000303" + }, + "name": "Alice Betsy", + "email": "ISList.alice.tmms@gmail.tmt" + }, + "Student2Course3": { + "comments": "This student's name is Benny Charles", + "id": "00000000-0000-4000-8000-000000000605", + "courseId": "tm.e2e.ISList.course3", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000303" + }, + "name": "Benny Charles", + "email": "benny.c.tmms@gmail.tmt" + }, + "Student3Course3": { + "comments": "This student's name is Charlie Davis", + "id": "00000000-0000-4000-8000-000000000606", + "courseId": "tm.e2e.ISList.course3", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000002" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000304" + }, + "name": "Charlie D", + "email": "ISList.charlie.tmms@gmail.tmt" + }, + "Student4Course3": { + "comments": "This student's name is Denny Charlés", + "id": "00000000-0000-4000-8000-000000000607", + "courseId": "tm.e2e.ISList.course3", + "course": { + "id": "tm.e2e.ISList.course3" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000304" + }, + "name": "Denny Charlés", + "email": "denny.c.tmms@gmail.tmt" + } + }, + "feedbackSessions": {}, + "feedbackQuestions": {}, + "feedbackResponses": {}, + "feedbackResponseComments": {}, + "notifications": {}, + "readNotifications": {} +} diff --git a/src/e2e/resources/data/InstructorStudentRecordsPageE2ETestSql.json b/src/e2e/resources/data/InstructorStudentRecordsPageE2ETestSql.json new file mode 100644 index 000000000000..0c5783361fe0 --- /dev/null +++ b/src/e2e/resources/data/InstructorStudentRecordsPageE2ETestSql.json @@ -0,0 +1,99 @@ +{ + "accounts": { + "teammates.test": { + "googleId": "tm.e2e.ISRecords.teammates.test", + "name": "Teammates Test", + "email": "teammates.test@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000001" + }, + "benny.c.tmms@ISR.CS2104": { + "googleId": "tm.e2e.ISRecords.benny.c.tmms", + "name": "Benny Charlés", + "email": "benny.c.tmms@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000002" + } + }, + "accountRequests": {}, + "courses": { + "CS2104": { + "id": "tm.e2e.ISRecords.CS2104", + "name": "Programming Language Concepts", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1" + } + }, + "sections": { + "tm.e2e.ISRecords.CS2104-None": { + "id": "00000000-0000-4000-8000-000000000201", + "course": { + "id": "tm.e2e.ISRecords.CS2104" + }, + "name": "None" + } + }, + "teams": { + "tm.e2e.ISRecords.CS2104-None-Team1": { + "id": "00000000-0000-4000-8000-000000000301", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 1" + } + }, + "deadlineExtensions": {}, + "instructors": { + "teammates.test.CS2104": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000501", + "courseId": "tm.e2e.ISRecords.CS2104", + "course": { + "id": "tm.e2e.ISRecords.CS2104" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "teammates.test@gmail.tmt" + } + }, + "students": { + "benny.c.tmms@ISR.CS2104": { + "comments": "This student's name is Benny Charlés", + "id": "00000000-0000-4000-8000-000000000601", + "courseId": "tm.e2e.ISRecords.CS2104", + "course": { + "id": "tm.e2e.ISRecords.CS2104" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000002" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Benny Charlés", + "email": "benny.c.tmms@gmail.tmt" + } + }, + "feedbackSessions": {}, + "feedbackQuestions": {}, + "feedbackResponses": {}, + "feedbackResponseComments": {}, + "notifications": {}, + "readNotifications": {} +} diff --git a/src/e2e/resources/data/StudentCourseDetailsPageE2ETestSql.json b/src/e2e/resources/data/StudentCourseDetailsPageE2ETestSql.json new file mode 100644 index 000000000000..c56b3fde3f31 --- /dev/null +++ b/src/e2e/resources/data/StudentCourseDetailsPageE2ETestSql.json @@ -0,0 +1,152 @@ +{ + "accounts": { + "SCDet.instr": { + "googleId": "tm.e2e.SCDet.instr", + "name": "Instructor", + "email": "tmms.test@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000001" + }, + "SCDet.alice": { + "googleId": "tm.e2e.SCDet.alice", + "email": "SCDet.alice@gmail.tmt", + "name": "Alice Betsy", + "id": "00000000-0000-4000-8000-000000000002" + } + }, + "accountRequests": {}, + "courses": { + "SCDet.CS2104": { + "id": "tm.e2e.SCDet.CS2104", + "name": "Programming Language Concepts", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1", + "createdAt": "2012-04-02T11:00:00Z" + } + }, + "sections": { + "tm.e2e.SCDet.CS2104-None": { + "id": "00000000-0000-4000-8000-000000000201", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "name": "None" + } + }, + "teams": { + "tm.e2e.SCDet.CS2104-None-Team1": { + "id": "00000000-0000-4000-8000-000000000301", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 1" + } + }, + "deadlineExtensions": {}, + "instructors": { + "SCDet.instr": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000501", + "courseId": "tm.e2e.SCDet.CS2104", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "SCDet.instr@gmail.tmt" + }, + "SCDet.instr2": { + "isDisplayedToStudents": true, + "displayName": "Instructor", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000502", + "courseId": "tm.e2e.SCDet.CS2104", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "name": "Teammates Test 2", + "email": "SCDet.instr2@gmail.tmt" + } + }, + "students": { + "SCDet.alice": { + "comments": "This student's name is Alice Betsy", + "id": "00000000-0000-4000-8000-000000000601", + "courseId": "tm.e2e.SCDet.CS2104", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000002" + }, + "name": "Alice Betsy", + "email": "SCDet.alice@gmail.tmt" + }, + "SCDet.benny": { + "comments": "This student's name is Benny Charles", + "id": "00000000-0000-4000-8000-000000000602", + "courseId": "tm.e2e.SCDet.CS2104", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Benny Charles", + "email": "SCDet.benny@gmail.tmt" + }, + "SCDet.charlie": { + "comments": "This student's name is Charlie Davis", + "id": "00000000-0000-4000-8000-000000000603", + "courseId": "tm.e2e.SCDet.CS2104", + "course": { + "id": "tm.e2e.SCDet.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Charlie Davis", + "email": "SCDet.charlie@gmail.tmt" + } + }, + "feedbackSessions": {}, + "feedbackQuestions": {}, + "feedbackResponses": {}, + "feedbackResponseComments": {}, + "notifications": {}, + "readNotifications": {} +} diff --git a/src/e2e/resources/data/StudentCourseJoinConfirmationPageE2ETestSql.json b/src/e2e/resources/data/StudentCourseJoinConfirmationPageE2ETestSql.json new file mode 100644 index 000000000000..4866f6f16c29 --- /dev/null +++ b/src/e2e/resources/data/StudentCourseJoinConfirmationPageE2ETestSql.json @@ -0,0 +1,159 @@ +{ + "accounts": { + "SCJoinConf.instr": { + "googleId": "tm.e2e.SCJoinConf.instr", + "name": "Teammates Test", + "email": "SCJoinConf.instr@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000001" + }, + "alice.tmms": { + "googleId": "tm.e2e.SCJoinConf.alice", + "name": "Alice B", + "email": "SCJoinConf.alice@gmail.tmt", + "id": "00000000-0000-4000-8000-000000000002" + } + }, + "accountRequests": {}, + "courses": { + "SCJoinConf.CS2104": { + "id": "tm.e2e.SCJoinConf.CS2104", + "name": "Programming Language Concepts", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1" + }, + "SCJoinConf.CS1101": { + "id": "tm.e2e.SCJoinConf.CS1101", + "name": "Programming Methodology", + "timeZone": "UTC", + "institute": "TEAMMATES Test Institute 1" + } + }, + "sections": { + "tm.e2e.SCJoinConf.CS2104-None": { + "id": "00000000-0000-4000-8000-000000000201", + "course": { + "id": "tm.e2e.SCJoinConf.CS2104" + }, + "name": "None" + }, + "tm.e2e.SCJoinConf.CS1101-None": { + "id": "00000000-0000-4000-8000-000000000202", + "course": { + "id": "tm.e2e.SCJoinConf.CS1101" + }, + "name": "None" + } + }, + "teams": { + "tm.e2e.SCJoinConf.CS2104-None-Team1": { + "id": "00000000-0000-4000-8000-000000000301", + "section": { + "id": "00000000-0000-4000-8000-000000000201" + }, + "name": "Team 1" + }, + "tm.e2e.SCJoinConf.CS1101-None-Team1": { + "id": "00000000-0000-4000-8000-000000000302", + "section": { + "id": "00000000-0000-4000-8000-000000000202" + }, + "name": "Team 1" + } + }, + "deadlineExtensions": {}, + "instructors": { + "SCJoinConf.instr.CS2104": { + "isDisplayedToStudents": true, + "displayName": "Co-owner", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "id": "00000000-0000-4000-8000-000000000501", + "course": { + "id": "tm.e2e.SCJoinConf.CS2104" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "SCJoinConf.instr@gmail.tmt" + }, + "SCJoinConf.instr.CS1101": { + "isDisplayedToStudents": true, + "displayName": "Co-owner", + "role": "INSTRUCTOR_PERMISSION_ROLE_COOWNER", + "privileges": { + "courseLevel": { + "canModifyCourse": true, + "canModifyInstructor": true, + "canModifySession": true, + "canModifyStudent": true, + "canViewStudentInSections": true, + "canViewSessionInSections": true, + "canSubmitSessionInSections": true, + "canModifySessionCommentsInSections": true + }, + "sectionLevel": {}, + "sessionLevel": {} + }, + "courseId": "tm.e2e.SCJoinConf.CS1101", + "course": { + "id": "tm.e2e.SCJoinConf.CS1101" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000001" + }, + "name": "Teammates Test", + "email": "SCJoinConf.instr@gmail.tmt" + } + }, + "students": { + "alice.tmms@SCJoinConf.CS2104": { + "comments": "This student's name is Amy Betsy", + "id": "00000000-0000-4000-8000-000000000601", + "courseId": "tm.e2e.SCJoinConf.CS2104", + "course": { + "id": "tm.e2e.SCJoinConf.CS2104" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Amy Betsy", + "email": "SCJoinConf.alice@gmail.tmt" + }, + "alice.tmms@SCJoinConf.CS1101": { + "comments": "This student's name is Amy Betsy", + "id": "00000000-0000-4000-8000-000000000602", + "courseId": "tm.e2e.SCJoinConf.CS1101", + "course": { + "id": "tm.e2e.SCJoinConf.CS1101" + }, + "account": { + "id": "00000000-0000-4000-8000-000000000002" + }, + "team": { + "id": "00000000-0000-4000-8000-000000000301" + }, + "name": "Amy Betsy", + "email": "SCJoinConf.alice@gmail.tmt" + } + }, + "feedbackSessions": {}, + "feedbackQuestions": {}, + "feedbackResponses": {}, + "feedbackResponseComments": {}, + "notifications": {}, + "readNotifications": {} +} diff --git a/src/e2e/resources/testng-e2e-sql.xml b/src/e2e/resources/testng-e2e-sql.xml index 78dcc2d13a1f..e8615603a8b1 100644 --- a/src/e2e/resources/testng-e2e-sql.xml +++ b/src/e2e/resources/testng-e2e-sql.xml @@ -9,10 +9,19 @@Hi, Example
\n") + .append("Thanks for your interest in using TEAMMATES. ") + .append("We are unable to create a TEAMMATES instructor account for you.
\n\n") + .append("\n")
+ .append(" Reason: The email address you provided ")
+ .append("is not an 'official' email address provided by your institution.
\n")
+ .append(" Remedy: ")
+ .append("Please re-submit an account request with your 'official' institution email address.\n")
+ .append("
If you need further clarification or would like to appeal this decision, ") + .append("please feel free to contact us at teammates@comp.nus.edu.sg.
\n") + .append("Regards,
TEAMMATES Team.
Note that these header names should correspond to the variables used in the JMeter L&P test.
+ */ + public abstract List