Files
sm-quizzes-plugin/classes/policy_test.go
Jakub Zych 6c6ecae9d8 feat: add test mode to quizzes and withhold its solutions
- mode, navigation and max_attempts columns with Go-side defaults
- classes.Withheld gates every solution field of the answer feedback
  and the attempt result while a test attempt is open
- a test's quiz detail lists no questions before the attempt starts
- admin fields and lang keys for the three settings
2026-11-09 14:03:34 +01:00

40 lines
1.2 KiB
Go

package classes_test
import (
"testing"
"time"
"git.golem15.com/golem15/sm-quizzes-plugin/classes"
"git.golem15.com/golem15/sm-quizzes-plugin/models"
)
func TestIsTestAndWithheld(t *testing.T) {
if classes.IsTest(nil) {
t.Error("IsTest(nil) = true")
}
for mode, want := range map[string]bool{"": false, models.ModeLearning: false, "exam": false, models.ModeTest: true} {
if got := classes.IsTest(&models.Quiz{Mode: mode}); got != want {
t.Errorf("IsTest(mode %q) = %v, want %v", mode, got, want)
}
}
done := time.Now()
test, learning := &models.Quiz{Mode: models.ModeTest}, &models.Quiz{Mode: models.ModeLearning}
cases := []struct {
name string
a *models.Attempt
want bool
}{
{"open test", &models.Attempt{Quiz: test}, true},
{"completed test", &models.Attempt{Quiz: test, CompletedAt: &done}, false},
{"open learning", &models.Attempt{Quiz: learning}, false},
{"zero mode", &models.Attempt{Quiz: &models.Quiz{}}, false},
{"nil attempt", nil, false},
{"nil quiz", &models.Attempt{}, false},
}
for _, tc := range cases {
if got := classes.Withheld(tc.a); got != tc.want {
t.Errorf("Withheld(%s) = %v, want %v", tc.name, got, tc.want)
}
}
}