123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- package main
- import (
- "encoding/json"
- "fmt"
- "log/slog"
- "net/http"
- "net/http/httptest"
- "os"
- "path/filepath"
- "strings"
- "testing"
- "time"
- "git.andreafazzi.eu/andrea/probo/pkg/models"
- "github.com/lmittmann/tint"
- "github.com/remogatto/prettytest"
- )
- var examPayload = `
- {
- "ID": "fe0a7ee0-f31a-413d-f123-ab5068bcaaaa",
- "Name": "Test session",
- "Exams": {
- "111222": {
- "id": "fe0a7ee0-f31a-413d-ba81-ab5068bc4c73",
- "created_at": "0001-01-01T00:00:00Z",
- "updated_at": "0001-01-01T00:00:00Z",
- "Participant": {
- "ID": "1234",
- "Firstname": "John",
- "Lastname": "Smith",
- "Token": "111222",
- "Attributes": {
- "class": "1 D LIN"
- }
- },
- "Quizzes": [
- {
- "id": "0610939b-a1a3-4d0e-bbc4-2aae0e8ee4b9",
- "created_at": "2023-11-27T17:51:53.910642221+01:00",
- "updated_at": "0001-01-01T00:00:00Z",
- "hash": "",
- "question": {
- "id": "98c0eec9-677f-464e-9e3e-864a859f29a3",
- "created_at": "0001-01-01T00:00:00Z",
- "updated_at": "0001-01-01T00:00:00Z",
- "text": "Question text with #tag1."
- },
- "answers": [
- {
- "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
- "text": "Answer 1"
- },
- {
- "id": "74547724-b905-476f-8cfc-6ee633f92ef3",
- "text": "Answer 2"
- },
- {
- "id": "96c1a8ee-c50c-4ebc-89e4-9f3ca356adbd",
- "text": "Answer 3"
- },
- {
- "id": "16c4b95e-64ce-4666-8cbe-b66fa59eb23b",
- "text": "Answer 4"
- }
- ],
- "tags": [
- {
- "CreatedAt": "0001-01-01T00:00:00Z",
- "UpdatedAt": "0001-01-01T00:00:00Z",
- "DeletedAt": null,
- "name": "#tag1"
- }
- ],
- "correct": {
- "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
- "text": "Answer 1"
- },
- "CorrectPos": 0,
- "type": 0
- },
- {
- "id": "915818c4-b0ce-4efc-8def-7fc8d5fa7454",
- "created_at": "2023-11-27T17:51:53.91077796+01:00",
- "updated_at": "0001-01-01T00:00:00Z",
- "hash": "",
- "question": {
- "id": "70793f0d-2855-4140-814e-40167464424b",
- "created_at": "0001-01-01T00:00:00Z",
- "updated_at": "0001-01-01T00:00:00Z",
- "text": "Another question text with #tag1."
- },
- "answers": [
- {
- "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
- "text": "Answer 1"
- },
- {
- "id": "74547724-b905-476f-8cfc-6ee633f92ef3",
- "text": "Answer 2"
- },
- {
- "id": "96c1a8ee-c50c-4ebc-89e4-9f3ca356adbd",
- "text": "Answer 3"
- },
- {
- "id": "16c4b95e-64ce-4666-8cbe-b66fa59eb23b",
- "text": "Answer 4"
- }
- ],
- "tags": [
- {
- "CreatedAt": "0001-01-01T00:00:00Z",
- "UpdatedAt": "0001-01-01T00:00:00Z",
- "DeletedAt": null,
- "name": "#tag1"
- }
- ],
- "correct": {
- "id": "1ab5ff1f-74c8-4efc-abdc-d03a3640f3bc",
- "text": "Answer 1"
- },
- "CorrectPos": 0,
- "type": 0
- }
- ]
- }
- },
- "333444": {
- "id": "12345678-abcd-efgh-ijkl-9876543210ef",
- "created_at": "2023-12-01T12:00:00Z",
- "updated_at": "2023-12-01T12:00:00Z",
- "Participant": {
- "ID": "5678",
- "Firstname": "Jane",
- "Lastname": "Doe",
- "Token": "333444",
- "Attributes": {
- "class": "2 A SCI"
- }
- },
- "Quizzes": [
- {
- "id": "22222222-abcd-efgh-ijkl-9876543210ef",
- "created_at": "2023-12-01T12:00:00Z",
- "updated_at": "2023-12-01T12:00:00Z",
- "hash": "",
- "question": {
- "id": "33333333-abcd-efgh-ijkl-9876543210ef",
- "created_at": "2023-12-01T12:00:00Z",
- "updated_at": "2023-12-01T12:00:00Z",
- "text": "Sample question text."
- },
- "answers": [
- {
- "id": "44444444-abcd-efgh-ijkl-9876543210ef",
- "text": "Option 1"
- },
- {
- "id": "55555555-abcd-efgh-ijkl-9876543210ef",
- "text": "Option 2"
- },
- {
- "id": "66666666-abcd-efgh-ijkl-9876543210ef",
- "text": "Option 3"
- },
- {
- "id": "77777777-abcd-efgh-ijkl-9876543210ef",
- "text": "Option 4"
- }
- ],
- "tags": [
- {
- "CreatedAt": "2023-12-01T12:00:00Z",
- "UpdatedAt": "2023-12-01T12:00:00Z",
- "DeletedAt": null,
- "name": "#tag2"
- }
- ],
- "correct": {
- "id": "44444444-abcd-efgh-ijkl-9876543210ef",
- "text": "Option 1"
- },
- "CorrectPos": 0,
- "type": 0
- }
- ]
- }
- }
- `
- type serverTestSuite struct {
- prettytest.Suite
- }
- func TestRunner(t *testing.T) {
- slog.SetDefault(slog.New(
- tint.NewHandler(os.Stderr, &tint.Options{
- Level: slog.LevelError,
- TimeFormat: time.Kitchen,
- }),
- ))
- prettytest.Run(
- t,
- new(serverTestSuite),
- )
- }
- func (t *serverTestSuite) TestCreate() {
- DefaultDataDir = "testdata"
- s, err := NewDefaultServer()
- t.Nil(err)
- if !t.Failed() {
- request, _ := http.NewRequest(http.MethodPost, "/create", strings.NewReader(examPayload))
- response := httptest.NewRecorder()
- handler := http.HandlerFunc(s.createExamSessionHandler)
- handler.ServeHTTP(response, request)
- t.Equal(http.StatusOK, response.Code)
- if !t.Failed() {
- var session *models.Session
- err := json.Unmarshal(response.Body.Bytes(), &session)
- t.Nil(err)
- path := filepath.Join(GetDefaultSessionDir(), "session_fe0a7ee0-f31a-413d-f123-ab5068bcaaaa.json")
- _, err = os.Stat(path)
- t.Nil(err)
- defer os.Remove(path)
- t.Equal("fe0a7ee0-f31a-413d-f123-ab5068bcaaaa", session.ID)
- }
- }
- }
- func (t *serverTestSuite) TestRead() {
- DefaultDataDir = "testdata"
- s, err := NewDefaultServer()
- t.Nil(err)
- if !t.Failed() {
- request, _ := http.NewRequest(http.MethodPost, "/create", strings.NewReader(examPayload))
- response := httptest.NewRecorder()
- handler := http.HandlerFunc(s.createExamSessionHandler)
- handler.ServeHTTP(response, request)
- t.Equal(http.StatusOK, response.Code)
- if !t.Failed() {
- var session *models.Session
- err := json.Unmarshal(response.Body.Bytes(), &session)
- t.Nil(err)
- path := filepath.Join(GetDefaultSessionDir(), "session_fe0a7ee0-f31a-413d-f123-ab5068bcaaaa.json")
- _, err = os.Stat(path)
- t.Nil(err)
- if !t.Failed() {
- defer os.RemoveAll(path)
- request, _ := http.NewRequest(http.MethodGet, fmt.Sprintf("/%s/%s", session.ID, "111222"), nil)
- response := httptest.NewRecorder()
- handler := http.HandlerFunc(s.getExamHandler)
- handler.ServeHTTP(response, request)
- t.Equal(http.StatusOK, response.Code)
- }
- }
- }
- }
|