...

Source file src/edge-infra.dev/pkg/sds/emergencyaccess/eagateway/server/endsession_test.go

Documentation: edge-infra.dev/pkg/sds/emergencyaccess/eagateway/server

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/json"
     7  	"errors"
     8  	"fmt"
     9  	"io"
    10  	"net/http"
    11  	"net/http/httptest"
    12  	"strings"
    13  	"testing"
    14  	"time"
    15  
    16  	"edge-infra.dev/pkg/sds/emergencyaccess/eaconst"
    17  	"edge-infra.dev/pkg/sds/emergencyaccess/eagateway"
    18  	"edge-infra.dev/pkg/sds/emergencyaccess/msgdata"
    19  	"edge-infra.dev/pkg/sds/emergencyaccess/remotecli"
    20  	"edge-infra.dev/pkg/sds/emergencyaccess/types"
    21  
    22  	"github.com/gin-gonic/gin"
    23  	"github.com/stretchr/testify/assert"
    24  )
    25  
    26  type endSessionTestRCLI struct {
    27  	eagateway.RemoteCLI
    28  	cache map[string]remotecli.Target
    29  }
    30  
    31  func (rcli *endSessionTestRCLI) StartSession(_ context.Context, sessionID string, _ chan<- msgdata.CommandResponse, target remotecli.Target, _ ...remotecli.RCLIOption) error {
    32  	rcli.cache[sessionID] = target
    33  	return nil
    34  }
    35  
    36  func (rcli *endSessionTestRCLI) EndSession(_ context.Context, sessionID string) error {
    37  	if sessionID == "fail" {
    38  		return errors.New(sessionID)
    39  	}
    40  	delete(rcli.cache, sessionID)
    41  	return nil
    42  }
    43  
    44  func TestEndSessionSuccess(t *testing.T) {
    45  	r := httptest.NewRecorder()
    46  	gin.SetMode(gin.TestMode)
    47  	c, ginEngine := gin.CreateTestContext(r)
    48  
    49  	// Setup
    50  	authServer, authServerURL := authserviceServer(http.StatusOK)
    51  	defer authServer.Close()
    52  
    53  	rcli := &endSessionTestRCLI{}
    54  	rcli.cache = make(map[string]remotecli.Target)
    55  	config := eagateway.Config{AuthServiceHost: authServerURL}
    56  	server, err := New(config, ginEngine, newLogger(), rcli, nil)
    57  	assert.NoError(t, err)
    58  
    59  	// Test
    60  	for i := 0; i <= 2; i++ {
    61  		sessionID := fmt.Sprint(i)
    62  		target := defaultTarget
    63  		target.Terminalid = fmt.Sprint(i)
    64  		err = server.rcli.StartSession(c, sessionID, nil, target)
    65  		assert.NoError(t, err)
    66  	}
    67  
    68  	for i := 0; i < 2; i++ {
    69  		sessionID := fmt.Sprint(i)
    70  		payload := types.EndSessionPayload{SessionID: sessionID}
    71  		message, err := json.Marshal(payload)
    72  		assert.NoError(t, err)
    73  
    74  		req, err := http.NewRequestWithContext(c, http.MethodPost, "/ea/endSession", bytes.NewReader(message))
    75  		assert.NoError(t, err)
    76  		req.Header.Set(eaconst.HeaderAuthKeyRoles, "role")
    77  		ginEngine.ServeHTTP(r, req)
    78  		assert.Eventually(t, func() bool {
    79  			return r.Result().StatusCode == http.StatusOK
    80  		}, 100*time.Millisecond, 10*time.Millisecond)
    81  
    82  		assert.Nil(t, rcli.cache[sessionID])
    83  		for j := i + 1; j <= 2; j++ {
    84  			assert.NotNil(t, rcli.cache[fmt.Sprint(j)])
    85  		}
    86  	}
    87  }
    88  
    89  func TestEndSessionFail(t *testing.T) {
    90  	tests := map[string]struct {
    91  		sessionID     string
    92  		target        types.Target
    93  		expStatusCode int
    94  		expOut        string
    95  	}{
    96  		"Invalid Payload": {
    97  			sessionID:     "",
    98  			target:        types.Target{},
    99  			expStatusCode: http.StatusBadRequest,
   100  			expOut:        `{"details":["Payload missing Session ID"], "errorCode":60202, "errorMessage":"Request Error - Invalid payload properties"}`,
   101  		},
   102  		"RCLI Fail": {
   103  			sessionID:     "fail",
   104  			target:        defaultTarget,
   105  			expStatusCode: http.StatusInternalServerError,
   106  			expOut:        `{"errorCode": 63101, "errorMessage": "End Session Failure - Failed to end session"}`,
   107  		},
   108  		// TODO invalid json fail
   109  	}
   110  
   111  	for name, tc := range tests {
   112  		t.Run(name, func(t *testing.T) {
   113  			r := httptest.NewRecorder()
   114  			gin.SetMode(gin.TestMode)
   115  			c, ginEngine := gin.CreateTestContext(r)
   116  
   117  			// Setup
   118  			authServer, authServerURL := authserviceServer(http.StatusOK)
   119  			defer authServer.Close()
   120  
   121  			rcli := &endSessionTestRCLI{}
   122  			rcli.cache = make(map[string]remotecli.Target)
   123  			server, err := New(eagateway.Config{AuthServiceHost: authServerURL}, ginEngine, newLogger(), rcli, nil)
   124  			assert.NoError(t, err)
   125  
   126  			// Test
   127  			err = server.rcli.StartSession(c, tc.sessionID, nil, tc.target)
   128  			assert.NoError(t, err)
   129  
   130  			payload := types.EndSessionPayload{SessionID: tc.sessionID}
   131  			message, err := json.Marshal(payload)
   132  			assert.NoError(t, err)
   133  			req, err := http.NewRequestWithContext(c, http.MethodPost, "/ea/endSession", bytes.NewReader(message))
   134  			assert.NoError(t, err)
   135  			req.Header.Set(eaconst.HeaderAuthKeyRoles, "role")
   136  			ginEngine.ServeHTTP(r, req)
   137  
   138  			assert.Equal(t, tc.expStatusCode, r.Result().StatusCode)
   139  
   140  			buf := strings.Builder{}
   141  			_, err = io.Copy(&buf, r.Result().Body)
   142  			assert.NoError(t, err)
   143  
   144  			assert.JSONEq(t, tc.expOut, buf.String())
   145  		})
   146  	}
   147  }
   148  

View as plain text