From 6138ffe99d016cc311f250bc1555b5403b8b1216 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Thu, 08 Oct 2026 17:18:04 +0000
Subject: [PATCH] GS-2555

---
 test/testAbmelden.js            |   48 ++++++++-------
 test/data.js                    |    7 ++
 php/globus-ilias-rest/login.php |    3 
 test/testCreateKurs.js          |   26 +++-----
 test/testAnmelden.js            |   42 +++++++------
 5 files changed, 66 insertions(+), 60 deletions(-)

diff --git a/php/globus-ilias-rest/login.php b/php/globus-ilias-rest/login.php
index d1657a8..b425f78 100644
--- a/php/globus-ilias-rest/login.php
+++ b/php/globus-ilias-rest/login.php
@@ -167,10 +167,11 @@
 
 // ACHTUNG course_id muss obj_id sein!
 // die Rolle muss aus dem Kurs gelesen werden
+// ACHTUNG ilParticipants::readParticipants() ist protected (ILIAS 9) und wird
+// bereits im Konstruktor von getMembersObject() aufgerufen - nicht erneut aufrufen!
 function anmelden($usr_id, $course_id) {
     $course = ilObjectFactory::getInstanceByObjId($course_id);
     $membersObject = $course->getMembersObject();
-    $membersObject->readParticipants();
     $role = $membersObject::IL_CRS_MEMBER;
     return $membersObject->add($usr_id, $role);
 }
diff --git a/test/data.js b/test/data.js
index a40941e..69cc09f 100644
--- a/test/data.js
+++ b/test/data.js
@@ -39,9 +39,16 @@
    usr_id: 24038,
 }
 
+// real existing small course used by the anmelden/abmelden tests
+const anmelden = {
+   ref_id: 595,
+   obj_id: 36428,   // anmelden()/abmelden() expect the course obj_id, not the ref_id
+}
+
 module.exports = {
    user,
    kurs,
    setStatus,
+   anmelden,
 }
 
diff --git a/test/testAbmelden.js b/test/testAbmelden.js
index 5a44bc0..57b397d 100644
--- a/test/testAbmelden.js
+++ b/test/testAbmelden.js
@@ -1,46 +1,48 @@
 const expect = require("chai").expect
+const _ = require("lodash")
 
-const settings = require("../settings")
 const libIlias = require("../lib/libIlias")
 const db = require("../lib/db")
 const testData = require("./data")
 
 /////////////////////////////////////////////////////////////////////////
 
-describe.skip("the function anmelden", function () {
+// Integration test against a real ILIAS instance.
+// Creates a temporary user, enrolls it via libIlias.anmelden() into an
+// existing course, verifies that libIlias.abmelden() removes the
+// membership, then cleans up.
+describe("the function abmelden", function () {
 
-   const kurs = testData.kurs // TODO
-   const user = testData.user
-
-   let kursId = null
+   const courseId = testData.anmelden.obj_id
+   let user = null
    let userId = null
 
    beforeEach(async function () {
-      // const {usr_id:userId} = await libIlias.importIliasUser(user)
-      const userRes  = await libIlias.importIliasUser(user)
-      // const kursRes  = await libIlias.
-      console.log(data)
+      user = _.cloneDeep(testData.user)
+      const res = await libIlias.importIliasUser(user)
+      userId = res.usr_id
+      // precondition: the user must be enrolled
+      await libIlias.anmelden(userId, courseId)
    })
 
    afterEach(async function () {
-      await libIlias.deleteUser(userId)
-      // TODO delete kurs
+      if (!userId) return
+      // best effort cleanup (abmelden is idempotent)
+      await libIlias.abmelden(userId, courseId).catch(console.error)
+      await libIlias.deleteUser(userId).catch(console.error)
+      userId = null
    })
 
-   it("should import a new user to ILIAS", async function () {
-      console.log("!111")
-      console.error("finish test")
-      return
-
-      console.log("++abmelden", userId, kursId)
-      const res = await libIlias.abmelden(userId, kursId)
-      console.dir(res, {depth: null})
+   it("should remove the Teilnahme of a user", async function () {
+      const res = await libIlias.abmelden(userId, courseId)
       expect(res).to.have.property("status").and.to.equal("ok")
-      expect(res.command).to.equal("abmelden")
-      expect(res.method).to.equal("DELETE")
+      expect(res).to.have.property("command").and.to.equal("abmelden")
+      expect(res).to.have.property("method").and.to.equal("DELETE")
+
+      const members = await db.getKursTeilnehmerByRole(courseId)
+      expect(members.map(m => m.usr_id)).to.not.include(userId)
    })
 
 })
 
 /////////////////////////////////////////////////////////////////////////
-
diff --git a/test/testAnmelden.js b/test/testAnmelden.js
index d7ea823..8d27353 100644
--- a/test/testAnmelden.js
+++ b/test/testAnmelden.js
@@ -1,41 +1,45 @@
 const expect = require("chai").expect
+const _ = require("lodash")
 
-const settings = require("../settings")
 const libIlias = require("../lib/libIlias")
 const db = require("../lib/db")
 const testData = require("./data")
 
 /////////////////////////////////////////////////////////////////////////
 
-describe.skip("the function anmelden", function () {
+// Integration test against a real ILIAS instance.
+// Creates a temporary user, enrolls it via libIlias.anmelden() into an
+// existing course and verifies the membership, then cleans up.
+describe("the function anmelden", function () {
 
-   const kurs = testData.kurs // TODO
-   const user = testData.user
-
-   let kursId = 31938
-   let userId = 31954
+   const courseId = testData.anmelden.obj_id
+   let user = null
+   let userId = null
 
    beforeEach(async function () {
-      // TODO add kurs
-      // const res = await libIlias.importIliasUser(user)
-      // userId = res.usr_id
+      user = _.cloneDeep(testData.user)
+      const res = await libIlias.importIliasUser(user)
+      userId = res.usr_id
    })
 
    afterEach(async function () {
-      // await libIlias.deleteUser(userId)
-      // TODO delete kurs
+      if (!userId) return
+      // best effort cleanup
+      await libIlias.abmelden(userId, courseId).catch(console.error)
+      await libIlias.deleteUser(userId).catch(console.error)
+      userId = null
    })
 
-   it("should import a new user to ILIAS", async function () {
-      console.log("++anmelden", userId, kursId)
-      const res = await libIlias.anmelden(userId, kursId)
-      console.dir(res, {depth: null})
+   it("should enroll a user into a course", async function () {
+      const res = await libIlias.anmelden(userId, courseId)
       expect(res).to.have.property("status").and.to.equal("ok")
-      expect(res.command).to.equal("anmelden")
-      expect(res.method).to.equal("POST")
+      expect(res).to.have.property("command").and.to.equal("anmelden")
+      expect(res).to.have.property("method").and.to.equal("POST")
+
+      const members = await db.getKursTeilnehmerByRole(courseId)
+      expect(members.map(m => m.usr_id)).to.include(userId)
    })
 
 })
 
 /////////////////////////////////////////////////////////////////////////
-
diff --git a/test/testCreateKurs.js b/test/testCreateKurs.js
index 3d1fbb6..a10bf6c 100644
--- a/test/testCreateKurs.js
+++ b/test/testCreateKurs.js
@@ -1,33 +1,25 @@
 const expect = require("chai").expect
 
-const settings = require("../settings")
 const libIlias = require("../lib/libIlias")
-const db = require("../lib/db")
 const testData = require("./data")
 
 /////////////////////////////////////////////////////////////////////////
 
-describe("the function anmelden", function () {
+// Skipped: the ILIAS PHP component does not implement course creation yet
+// (php/globus-ilias-rest/login.php -> createKurs() throws "not implemented").
+// There is also no deleteKurs() for cleanup, so running this test would leave
+// a real course behind. Enable once both exist.
+describe("the function createKurs", function () {
 
-   const kurs = testData.kurs // TODO
-   let kursId = 31938
-
-   beforeEach(async function () {
-   })
-
-   afterEach(async function () {
-   })
+   const kurs = testData.kurs
 
    it.skip("should create a new Kurs in ILIAS", async function () {
-      console.log("++createKurs", kurs)
       const res = await libIlias.createKurs(kurs)
-      console.dir(res, {depth: null})
-      // expect(res).to.have.property("status").and.to.equal("ok")
-      // expect(res.command).to.equal("anmelden")
-      // expect(res.method).to.equal("POST")
+      expect(res).to.have.property("status").and.to.equal("ok")
+      expect(res.command).to.equal("createKurs")
+      expect(res).to.have.property("ref_id").and.to.be.a("number").above(0)
    })
 
 })
 
 /////////////////////////////////////////////////////////////////////////
-

--
Gitblit v1.8.0