Kontentga o‘tish

HTTP Testlari

Kirish

Veb-ilovalarni yaratishda, siz tez-tez HTTP so'rovlaringiz boshidan oxirigacha to'g'ri ishlayotganligini sinab ko'rishingiz kerak bo'ladi. Goravelning test vositalari buni oddiy qiladi - siz murakkab test muhitlarini sozlashsiz so'rovlarni simulyatsiya qilishingiz va javoblarni tekshirishingiz mumkin.

So'rovlar berish

Goravel-da HTTP nuqtalarini test qilish oddiy naqshdan foydalanadi. O'zingizning TestCase dan Http usuli bilan boshlang, u tasdiqlashlar uchun *testing.T parametrini talab qiladi. Bu sizga Get, Post va Put kabi barcha umumiy HTTP fe'llarini boshqaradigan so'rov ob'ektini (framework/contracts/testing.TestRequest) beradi.

Haqiqiy HTTP chaqiruvlarini amalga oshirish o'rniga, bu usullar ilovangizning so'rov tsikli ichki simulyatsiyasini amalga oshiradi. Har bir so'rov natijalarni tekshirish uchun usullarga ega bo'lgan javob ob'ektini (framework/contracts/testing.TestResponse) qaytaradi.

Bu yerda oddiy misol:

go
func (s *ExampleTestSuite) TestIndex() {
	response, err := s.Http(s.T()).Get("/users/1")
	s.Nil(err)
	response.AssertStatus(200)
}

So'rov sarlavhalarini sozlash

So'rov sarlavhalarini sozlash uchun bitta sarlavha uchun WithHeader yoki bir nechta sarlavhalar uchun WithHeaders dan foydalanishingiz mumkin:

go
func (s *ExampleTestSuite) TestIndex() {
    // Bitta sarlavha
    response, err := s.Http(s.T()).WithHeader("X-Custom-Header", "Value").Get("/users/1")

    // Bir nechta sarlavhalar
    response, err := s.Http(s.T()).WithHeaders(map[string]string{
        "X-Custom-Header": "Value",
        "Accept": "application/json",
    }).Get("/users/1")
}

So'rov berishdan oldin cookie qiymatlarini o'rnatish uchun WithCookie yoki WithCookies usulidan foydalanishingiz mumkin.

go
import "github.com/goravel/framework/testing/http"

func (s *ExampleTestSuite) TestIndex() {
	response, err := s.Http(s.T()).WithCookie(http.Cookie("name", "krishan")).Get("/users/1")

	// yoki bir nechta Cookie lar uchun WithCookies dan foydalaning
	response, err := s.Http(s.T()).WithCookies(http.Cookies(map[string]string{
        "name": "krishan",
        "lang": "en",
    })).Get("/users/1")
}

WithSession

Ma'lumotlarni sessiyaga WithSession usuli yordamida o'rnatishingiz mumkin:

go
func (s *ExampleTestSuite) TestIndex() {
	response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")
}

Javoblarni tuzatish

So'rov berilgandan so'ng, so'rovdan qaytarilgan ma'lumotlarni tekshirish uchun Session, Headers, Content, Cookies yoki Json usulidan foydalanishingiz mumkin.

go
func (s *ExampleTestSuite) TestIndex() {
	response, err := s.Http(s.T()).WithSession(map[string]any{"role": "admin"}).Get("/users/1")

	content, err := response.Content()

	cookies := response.Cookies()

	headers := response.Headers()

	json, err := response.Json() // javob tanasi json (map[string]any) sifatida tahlil qilinadi

	session, err := response.Session() // joriy so'rov sessiyasida saqlangan barcha qiymatlarni qaytaradi
}

Tana qurish

Post, Put, Delete va hokazo usullar uchun. Goravel io.Reader ni ikkinchi argument sifatida qabul qiladi. Yuklamalarni qurishni soddalashtirish uchun tizim so'rov tanalarini qurish uchun foydali usullarni taqdim etadi.

go
import "github.com/goravel/framework/support/http"

func (s *ExampleTestSuite) TestIndex() {
    builder := http.NewBody().SetField("name", "krishan")

    body, err := builder.Build()

    response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", body)
}

JSON API larini test qilish

Goravel JSON API javoblarini samarali test qilish uchun bir nechta yordamchilarni taqdim etadi. U javob tanasini Go map[string]any ga o'tkazishga harakat qiladi. Agar o'tkazish muvaffaqiyatsiz bo'lsa, bog'liq tasdiqlar ham muvaffaqiyatsiz bo'ladi.

go
func (s *ExampleTestSuite) TestIndex() {
    response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
	s.Nil(err)

	response.AssertStatus(201).
		AssertJson(map[string]any{
			"created": true,
        })
}

O'tkazilgan JSON ga to'g'ridan-to'g'ri kirish uchun TestResponse dagi Json usulidan foydalaning. Bu sizga javob tanasining alohida elementlarini tekshirish imkonini beradi.

go
json, err := response.Json()
s.Nil(err)
s.True(json["created"])

TIP

AssertJson usuli javobda qo'shimcha maydonlar bo'lsa ham, javobda ko'rsatilgan barcha qiymatlar mavjudligini tekshiradi. AssertExactJson dan foydalanmaguningizcha, u aniq mos kelishni talab qilmaydi.

Aniq JSON mosliklarini tasdiqlash

Agar javobingiz kutilgan JSON bilan aniq mos kelishini (qo'shimcha yoki etishmayotgan maydonlarsiz) tekshirish kerak bo'lsa, AssertExactJson usulidan foydalaning.

go
func (s *ExampleTestSuite) TestIndex() {
    response, err := s.Http(s.T()).WithHeader("Content-Type", body.ContentType()).Post("/users", nil)
	s.Nil(err)

	response.AssertStatus(201).
		AssertExactJson(map[string]any{
			"created": true,
        })
}

Oqimli JSON test qilish

Goravel JSON javoblarida oqimli tasdiqlarni amalga oshirishni osonlashtiradi. AssertFluentJson usulidan foydalangan holda, siz framework/contracts/testing.AssertableJSON ning namunasi bilan ta'minlaydigan yopilishni o'tkazishingiz mumkin. Bu namun sizga so'rovingiz tomonidan qaytarilgan JSON javobidagi aniq qiymatlar yoki shartlarni tekshirish imkonini beradi.

Masalan, JSON javobida ma'lum bir qiymat mavjudligini tasdiqlash uchun Where usulidan, va atribut mavjud emasligiga ishonch hosil qilish uchun Missing usulidan foydalanishingiz mumkin.

go
import contractstesting "github.com/goravel/framework/contracts/testing"

func (s *ExampleTestSuite) TestIndex() {
    response, err := s.Http(s.T()).Get("/users/1")
	s.Nil(err)

	response.AssertStatus(201).
		AssertFluentJson(func (json contractstesting.AssertableJSON) {
			json.Where("id", float64(1)).
				Where("name", "bowen").
				WhereNot("lang", "en").
				Missing("password")
        })
}

Atribut mavjudligi / yo'qligini tasdiqlash

Agar atribut mavjud yoki yo'qligini tekshirishni istasangiz, Goravel buni Has va Missing usullari bilan soddalashtiradi.

go
response.AssertStatus(201).
    AssertFluentJson(func (json contractstesting.AssertableJSON) {
        json.Has("username").
            Missing("password")
    })

Shuningdek, bir vaqtning o'zida bir nechta atributlarning mavjudligi yoki yo'qligini HasAll va MissingAll yordamida tasdiqlashingiz mumkin.

go
response.AssertStatus(201).
    AssertFluentJson(func (json contractstesting.AssertableJSON) {
        json.Has([]string{"username", "email"}).
            MissingAll([]string{"verified", "password"})
    })

Agar sizga ro'yxatdan kamida bitta atributning mavjudligini tekshirish kerak bo'lsa, HasAny usulidan foydalaning.

go
response.AssertStatus(201).
    AssertFluentJson(func (json contractstesting.AssertableJSON) {
		json.HasAny([]string{"username", "email"})
    })

JSON kollektsiyasi tasdiqlarini qamrab olish

Javobda nomlangan kalit ostida ob'ektlar to'plami mavjud bo'lsa, uning tuzilishi va tarkibini tasdiqlash uchun turli usullardan foydalanishingiz mumkin.

go
type Item struct {
    ID int `json:"id"`
}

facades.Route().Get("/", func(ctx http.Context) http.Response {
    items := []Item{
        {ID: 1},
        {ID: 2},
    }
    return ctx.Response().Json(200, map[string]{
		"items": items,
    })
}

Kolleksiyadagi elementlar sonini tekshirish uchun Count usulidan foydalanishingiz mumkin. Birinchi elementning xususiyatlarini tasdiqlash uchun AssertableJson namunasi bilan ta'minlaydigan First usulidan foydalaning. Xuddi shunday, Each usuli sizga barcha elementlar ustida aylanish va ularning xususiyatlarini alohida tasdiqlash imkonini beradi. Boshqa tomondan, HasWithScope usuli First va Count funksionalligini birlashtiradi, bu sizga birinchi elementni va uning tarkibini tasdiqlash imkonini beradi, shu bilan birga qamrovli tasdiqlar uchun AssertableJson namunasi bilan ta'minlaydi.

go
// Count va First
response.AssertStatus(200).
    AssertFluentJson(func(json contractstesting.AssertableJSON) {
        json.Count("items", 2).
            First("items", func(json contractstesting.AssertableJSON) {
                json.Where("id", 1)
            })
    })

// Each
response.AssertStatus(200).
    AssertFluentJson(func(json contractstesting.AssertableJSON) {
        json.Count("items", 2).
            Each("items", func(json contractstesting.AssertableJSON) {
                json.Has("id")
            })
    })

// HasWithScope
response.AssertStatus(200).
    AssertFluentJson(func(json contractstesting.AssertableJSON) {
        json.HasWithScope("items", 2, func(json contractstesting.AssertableJSON) {
            json.Where("id", 1)
        })
    })

Mavjud tasdiqlar

Javob tasdiqlari

AssertAcceptedAssertBadRequestAssertConflict
AssertCookieAssertCookieExpiredAssertCookieMissing
AssertCookieNotExpiredAssertCreatedAssertDontSee
AssertExactJsonAssertFluentJsonAssertForbidden
AssertFoundAssertGoneAssertHeader
AssertHeaderMissingAssertInternalServerErrorAssertJson
AssertJsonMissingAssertMethodNotAllowedAssertMovedPermanently
AssertNoContentAssertNotAcceptableAssertNotFound
AssertNotModifiedAssertOkAssertPartialContent
AssertPaymentRequiredAssertRequestTimeoutAssertSee
AssertSeeInOrderAssertServerErrorAssertServiceUnavailable
AssertStatusAssertSuccessfulAssertTemporaryRedirect
AssertTooManyRequestsAssertUnauthorizedAssertUnprocessableEntity

AssertAccepted

Javobning 202 Qabul qilindi HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertAccepted()

AssertBadRequest

Javobning 400 Noto‘g‘ri so‘rov HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertBadRequest()

AssertConflict

Javobning 409 Ziddiyat HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertConflict()

AssertCookie

Javobda belgilangan nom va qiymatga ega cookie borligini tasdiqlaydi:

go
response.AssertCookie("name", "value")

AssertCookieExpired

Belgilangan cookie muddati o‘tganligini tasdiqlaydi:

go
response.AssertCookieExpired("name")

AssertCookieMissing

Javobda belgilangan nomga ega cookie yo‘qligini tasdiqlaydi:

go
response.AssertCookieMissing("name")

AssertCookieNotExpired

Belgilangan cookie muddati o‘tmaganligini tasdiqlaydi:

go
response.AssertCookieNotExpired("name")

AssertCreated

Javobning 201 Yaratildi HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertCreated()

AssertDontSee

Javobda belgilangan qiymatlar yo‘qligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) qiymatlardagi maxsus belgilarni tekshirishdan oldin ekranlash kerakligini aniqlaydi. Agar ko‘rsatilmagan bo‘lsa, standart holatda true ga o‘rnatiladi.

go
response.AssertDontSee([]string{"<div>"}, false)  // Maxsus belgilarni ekranlamang

AssertExactJson

Javob JSONi taqdim etilgan map[string]any bilan aniq mos kelishini tasdiqlaydi:

go
response.AssertExactJson(map[string]any{"created": true})

AssertFluentJson

Javob JSONini oqim interfeysi yordamida tasdiqlaydi:

go
import contractstesting "github.com/goravel/framework/contracts/testing"

response.AssertFluentJson(func(json contractstesting.AssertableJSON) {
     json.Where("created", true)
})

AssertForbidden

Javobning 403 Taqiqlangan HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertForbidden()

AssertFound

Javobning 302 Topildi HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertFound()

AssertGone

Javobning 410 Yo‘qolgan HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertGone()

AssertHeader

Javobda belgilangan sarlavha berilgan qiymat bilan borligini tasdiqlaydi:

go
response.AssertHeader("Content-Type", "application/json")

AssertHeaderMissing

Javobda belgilangan sarlavha yo‘qligini tasdiqlaydi:

go
response.AssertHeaderMissing("X-Custom-Header")

AssertInternalServerError

Javobning 500 Ichki server xatosi HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertInternalServerError()

AssertJson

Javob JSONida taqdim etilgan fragment borligini tasdiqlaydi:

go
response.AssertJson(map[string]any{"created": true})

AssertJsonMissing

Javob JSONida belgilangan kalitlar yoki qiymatlar yo'qligini tasdiqlaydi:

go
response.AssertJsonMissing(map[string]any{"created": false})

AssertMethodNotAllowed

Javobning 405 Method Not Allowed HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertMethodNotAllowed()

AssertMovedPermanently

Javobning 301 Moved Permanently HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertMovedPermanently()

AssertNoContent

Javobning 204 No Content HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertNoContent()

AssertNotAcceptable

Javobning 406 Not Acceptable HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertNotAcceptable()

AssertNotFound

Javobning 404 Not Found HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertNotFound()

AssertNotModified

Javobning 304 Not Modified HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertNotModified()

AssertOk

Javobning 200 OK HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertOk()

AssertPartialContent

Javobning 206 Partial Content HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertPartialContent()

AssertPaymentRequired

Javobning 402 Payment Required HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertPaymentRequired()

AssertRequestTimeout

Javobning 408 Request Timeout HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertRequestTimeout()

AssertSee

Javobda belgilangan qiymatlar mavjudligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) tekshirishdan oldin qiymatlardagi maxsus belgilarni ekranlash kerakligini aniqlaydi. Agar ko'rsatilmagan bo'lsa, standart holatda true ga o'rnatiladi.

go
response.AssertSee([]string{"<div>"}, false)  // Maxsus belgilarni ekranlamang

AssertSeeInOrder

Javobda belgilangan qiymatlar berilgan tartibda mavjudligini tasdiqlaydi. Ikkinchi parametr (ixtiyoriy) tekshirishdan oldin qiymatlardagi maxsus belgilarni ekranlash kerakligini aniqlaydi. Agar ko'rsatilmagan bo'lsa, standart holatda true ga o'rnatiladi.

go
response.AssertSeeInOrder([]string{"First", "Second"}, false)  // Maxsus belgilarni ekranlamang

AssertServerError

Javobning server xatosi (>= 500 , < 600) HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertServerError()

AssertServiceUnavailable

Javobning 503 Service Unavailable HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertServiceUnavailable()

AssertStatus

Javobning belgilangan HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertStatus(200)

AssertSuccessful

Javobning muvaffaqiyatli HTTP holat kodiga (2xx) ega ekanligini tasdiqlaydi:

go
response.AssertSuccessful()

AssertTemporaryRedirect

Javobning 307 Temporary Redirect HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertTemporaryRedirect()

AssertTooManyRequests

Javobning 429 Too Many Requests HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertTooManyRequests()

AssertUnauthorized

Javobning 401 Unauthorized HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertUnauthorized()

AssertUnprocessableEntity

Javobning 422 Unprocessable Entity HTTP holat kodiga ega ekanligini tasdiqlaydi:

go
response.AssertUnprocessableEntity()

MIT litsenziyasi ostida chiqarilgan