github.com/boomhut/fiber/v2@v2.0.0-20230603160335-b65c856e57d3/hooks_test.go (about)

     1  package fiber
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/boomhut/fiber/v2/utils"
    10  
    11  	"github.com/valyala/bytebufferpool"
    12  )
    13  
    14  func testSimpleHandler(c *Ctx) error {
    15  	return c.SendString("simple")
    16  }
    17  
    18  func Test_Hook_OnRoute(t *testing.T) {
    19  	t.Parallel()
    20  	app := New()
    21  
    22  	app.Hooks().OnRoute(func(r Route) error {
    23  		utils.AssertEqual(t, "", r.Name)
    24  
    25  		return nil
    26  	})
    27  
    28  	app.Get("/", testSimpleHandler).Name("x")
    29  
    30  	subApp := New()
    31  	subApp.Get("/test", testSimpleHandler)
    32  
    33  	app.Mount("/sub", subApp)
    34  }
    35  
    36  func Test_Hook_OnRoute_Mount(t *testing.T) {
    37  	t.Parallel()
    38  	app := New()
    39  	subApp := New()
    40  	app.Mount("/sub", subApp)
    41  
    42  	subApp.Hooks().OnRoute(func(r Route) error {
    43  		utils.AssertEqual(t, "/sub/test", r.Path)
    44  
    45  		return nil
    46  	})
    47  
    48  	app.Hooks().OnRoute(func(r Route) error {
    49  		utils.AssertEqual(t, "/", r.Path)
    50  
    51  		return nil
    52  	})
    53  
    54  	app.Get("/", testSimpleHandler).Name("x")
    55  	subApp.Get("/test", testSimpleHandler)
    56  }
    57  
    58  func Test_Hook_OnName(t *testing.T) {
    59  	t.Parallel()
    60  	app := New()
    61  
    62  	buf := bytebufferpool.Get()
    63  	defer bytebufferpool.Put(buf)
    64  
    65  	app.Hooks().OnName(func(r Route) error {
    66  		_, err := buf.WriteString(r.Name)
    67  		utils.AssertEqual(t, nil, err)
    68  
    69  		return nil
    70  	})
    71  
    72  	app.Get("/", testSimpleHandler).Name("index")
    73  
    74  	subApp := New()
    75  	subApp.Get("/test", testSimpleHandler)
    76  	subApp.Get("/test2", testSimpleHandler)
    77  
    78  	app.Mount("/sub", subApp)
    79  
    80  	utils.AssertEqual(t, "index", buf.String())
    81  }
    82  
    83  func Test_Hook_OnName_Error(t *testing.T) {
    84  	t.Parallel()
    85  	app := New()
    86  	defer func() {
    87  		if err := recover(); err != nil {
    88  			utils.AssertEqual(t, "unknown error", fmt.Sprintf("%v", err))
    89  		}
    90  	}()
    91  
    92  	app.Hooks().OnName(func(r Route) error {
    93  		return errors.New("unknown error")
    94  	})
    95  
    96  	app.Get("/", testSimpleHandler).Name("index")
    97  }
    98  
    99  func Test_Hook_OnGroup(t *testing.T) {
   100  	t.Parallel()
   101  	app := New()
   102  
   103  	buf := bytebufferpool.Get()
   104  	defer bytebufferpool.Put(buf)
   105  
   106  	app.Hooks().OnGroup(func(g Group) error {
   107  		_, err := buf.WriteString(g.Prefix)
   108  		utils.AssertEqual(t, nil, err)
   109  		return nil
   110  	})
   111  
   112  	grp := app.Group("/x").Name("x.")
   113  	grp.Group("/a")
   114  
   115  	utils.AssertEqual(t, "/x/x/a", buf.String())
   116  }
   117  
   118  func Test_Hook_OnGroup_Mount(t *testing.T) {
   119  	t.Parallel()
   120  	app := New()
   121  	micro := New()
   122  	micro.Mount("/john", app)
   123  
   124  	app.Hooks().OnGroup(func(g Group) error {
   125  		utils.AssertEqual(t, "/john/v1", g.Prefix)
   126  		return nil
   127  	})
   128  
   129  	v1 := app.Group("/v1")
   130  	v1.Get("/doe", func(c *Ctx) error {
   131  		return c.SendStatus(StatusOK)
   132  	})
   133  }
   134  
   135  func Test_Hook_OnGroupName(t *testing.T) {
   136  	t.Parallel()
   137  	app := New()
   138  
   139  	buf := bytebufferpool.Get()
   140  	defer bytebufferpool.Put(buf)
   141  
   142  	app.Hooks().OnGroupName(func(g Group) error {
   143  		_, err := buf.WriteString(g.name)
   144  		utils.AssertEqual(t, nil, err)
   145  
   146  		return nil
   147  	})
   148  
   149  	grp := app.Group("/x").Name("x.")
   150  	grp.Get("/test", testSimpleHandler)
   151  	grp.Get("/test2", testSimpleHandler)
   152  
   153  	utils.AssertEqual(t, "x.", buf.String())
   154  }
   155  
   156  func Test_Hook_OnGroupName_Error(t *testing.T) {
   157  	t.Parallel()
   158  	app := New()
   159  	defer func() {
   160  		if err := recover(); err != nil {
   161  			utils.AssertEqual(t, "unknown error", fmt.Sprintf("%v", err))
   162  		}
   163  	}()
   164  
   165  	app.Hooks().OnGroupName(func(g Group) error {
   166  		return errors.New("unknown error")
   167  	})
   168  
   169  	grp := app.Group("/x").Name("x.")
   170  	grp.Get("/test", testSimpleHandler)
   171  }
   172  
   173  func Test_Hook_OnShutdown(t *testing.T) {
   174  	t.Parallel()
   175  	app := New()
   176  
   177  	buf := bytebufferpool.Get()
   178  	defer bytebufferpool.Put(buf)
   179  
   180  	app.Hooks().OnShutdown(func() error {
   181  		_, err := buf.WriteString("shutdowning")
   182  		utils.AssertEqual(t, nil, err)
   183  
   184  		return nil
   185  	})
   186  
   187  	utils.AssertEqual(t, nil, app.Shutdown())
   188  	utils.AssertEqual(t, "shutdowning", buf.String())
   189  }
   190  
   191  func Test_Hook_OnListen(t *testing.T) {
   192  	t.Parallel()
   193  	app := New(Config{
   194  		DisableStartupMessage: true,
   195  	})
   196  
   197  	buf := bytebufferpool.Get()
   198  	defer bytebufferpool.Put(buf)
   199  
   200  	app.Hooks().OnListen(func() error {
   201  		_, err := buf.WriteString("ready")
   202  		utils.AssertEqual(t, nil, err)
   203  
   204  		return nil
   205  	})
   206  
   207  	go func() {
   208  		time.Sleep(1000 * time.Millisecond)
   209  		utils.AssertEqual(t, nil, app.Shutdown())
   210  	}()
   211  	utils.AssertEqual(t, nil, app.Listen(":9000"))
   212  
   213  	utils.AssertEqual(t, "ready", buf.String())
   214  }
   215  
   216  func Test_Hook_OnHook(t *testing.T) {
   217  	app := New()
   218  
   219  	// Reset test var
   220  	testPreforkMaster = true
   221  	testOnPrefork = true
   222  
   223  	go func() {
   224  		time.Sleep(1000 * time.Millisecond)
   225  		utils.AssertEqual(t, nil, app.Shutdown())
   226  	}()
   227  
   228  	app.Hooks().OnFork(func(pid int) error {
   229  		utils.AssertEqual(t, 1, pid)
   230  		return nil
   231  	})
   232  
   233  	utils.AssertEqual(t, nil, app.prefork(NetworkTCP4, ":3000", nil))
   234  }
   235  
   236  func Test_Hook_OnMount(t *testing.T) {
   237  	t.Parallel()
   238  	app := New()
   239  	app.Get("/", testSimpleHandler).Name("x")
   240  
   241  	subApp := New()
   242  	subApp.Get("/test", testSimpleHandler)
   243  
   244  	subApp.Hooks().OnMount(func(parent *App) error {
   245  		utils.AssertEqual(t, parent.mountFields.mountPath, "")
   246  
   247  		return nil
   248  	})
   249  
   250  	app.Mount("/sub", subApp)
   251  }