github.com/gofiber/fiber/v2@v2.47.0/hooks_test.go (about)

     1  package fiber
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/gofiber/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  	buf2 := bytebufferpool.Get()
   143  	defer bytebufferpool.Put(buf2)
   144  
   145  	app.Hooks().OnGroupName(func(g Group) error {
   146  		_, err := buf.WriteString(g.name)
   147  		utils.AssertEqual(t, nil, err)
   148  
   149  		return nil
   150  	})
   151  
   152  	app.Hooks().OnName(func(r Route) error {
   153  		_, err := buf2.WriteString(r.Name)
   154  		utils.AssertEqual(t, nil, err)
   155  
   156  		return nil
   157  	})
   158  
   159  	grp := app.Group("/x").Name("x.")
   160  	grp.Get("/test", testSimpleHandler).Name("test")
   161  	grp.Get("/test2", testSimpleHandler)
   162  
   163  	utils.AssertEqual(t, "x.", buf.String())
   164  	utils.AssertEqual(t, "x.test", buf2.String())
   165  }
   166  
   167  func Test_Hook_OnGroupName_Error(t *testing.T) {
   168  	t.Parallel()
   169  	app := New()
   170  	defer func() {
   171  		if err := recover(); err != nil {
   172  			utils.AssertEqual(t, "unknown error", fmt.Sprintf("%v", err))
   173  		}
   174  	}()
   175  
   176  	app.Hooks().OnGroupName(func(g Group) error {
   177  		return errors.New("unknown error")
   178  	})
   179  
   180  	grp := app.Group("/x").Name("x.")
   181  	grp.Get("/test", testSimpleHandler)
   182  }
   183  
   184  func Test_Hook_OnShutdown(t *testing.T) {
   185  	t.Parallel()
   186  	app := New()
   187  
   188  	buf := bytebufferpool.Get()
   189  	defer bytebufferpool.Put(buf)
   190  
   191  	app.Hooks().OnShutdown(func() error {
   192  		_, err := buf.WriteString("shutdowning")
   193  		utils.AssertEqual(t, nil, err)
   194  
   195  		return nil
   196  	})
   197  
   198  	utils.AssertEqual(t, nil, app.Shutdown())
   199  	utils.AssertEqual(t, "shutdowning", buf.String())
   200  }
   201  
   202  func Test_Hook_OnListen(t *testing.T) {
   203  	t.Parallel()
   204  	app := New(Config{
   205  		DisableStartupMessage: true,
   206  	})
   207  
   208  	buf := bytebufferpool.Get()
   209  	defer bytebufferpool.Put(buf)
   210  
   211  	app.Hooks().OnListen(func() error {
   212  		_, err := buf.WriteString("ready")
   213  		utils.AssertEqual(t, nil, err)
   214  
   215  		return nil
   216  	})
   217  
   218  	go func() {
   219  		time.Sleep(1000 * time.Millisecond)
   220  		utils.AssertEqual(t, nil, app.Shutdown())
   221  	}()
   222  	utils.AssertEqual(t, nil, app.Listen(":9000"))
   223  
   224  	utils.AssertEqual(t, "ready", buf.String())
   225  }
   226  
   227  func Test_Hook_OnListenPrefork(t *testing.T) {
   228  	t.Parallel()
   229  	app := New(Config{
   230  		DisableStartupMessage: true,
   231  		Prefork:               true,
   232  	})
   233  
   234  	buf := bytebufferpool.Get()
   235  	defer bytebufferpool.Put(buf)
   236  
   237  	app.Hooks().OnListen(func() error {
   238  		_, err := buf.WriteString("ready")
   239  		utils.AssertEqual(t, nil, err)
   240  
   241  		return nil
   242  	})
   243  
   244  	go func() {
   245  		time.Sleep(1000 * time.Millisecond)
   246  		utils.AssertEqual(t, nil, app.Shutdown())
   247  	}()
   248  	utils.AssertEqual(t, nil, app.Listen(":9000"))
   249  
   250  	utils.AssertEqual(t, "ready", buf.String())
   251  }
   252  
   253  func Test_Hook_OnHook(t *testing.T) {
   254  	app := New()
   255  
   256  	// Reset test var
   257  	testPreforkMaster = true
   258  	testOnPrefork = true
   259  
   260  	go func() {
   261  		time.Sleep(1000 * time.Millisecond)
   262  		utils.AssertEqual(t, nil, app.Shutdown())
   263  	}()
   264  
   265  	app.Hooks().OnFork(func(pid int) error {
   266  		utils.AssertEqual(t, 1, pid)
   267  		return nil
   268  	})
   269  
   270  	utils.AssertEqual(t, nil, app.prefork(NetworkTCP4, ":3000", nil))
   271  }
   272  
   273  func Test_Hook_OnMount(t *testing.T) {
   274  	t.Parallel()
   275  	app := New()
   276  	app.Get("/", testSimpleHandler).Name("x")
   277  
   278  	subApp := New()
   279  	subApp.Get("/test", testSimpleHandler)
   280  
   281  	subApp.Hooks().OnMount(func(parent *App) error {
   282  		utils.AssertEqual(t, parent.mountFields.mountPath, "")
   283  
   284  		return nil
   285  	})
   286  
   287  	app.Mount("/sub", subApp)
   288  }