PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
// Copyright 2015 go-swagger maintainers // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package validate import ( "fmt" "os" "path/filepath" "regexp" "sort" "strings" "testing" "github.com/go-openapi/loads" "github.com/go-openapi/strfmt" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/yaml.v3" ) var ( // This debug environment variable allows to report and capture actual validation messages // during testing. It should be disabled (undefined) during CI tests. DebugTest = os.Getenv("SWAGGER_DEBUG_TEST") != "" ) type ExpectedMessage struct { Message string `yaml:"message"` WithContinueOnErrors bool `yaml:"withContinueOnErrors"` // should be expected only when SetContinueOnErrors(true) IsRegexp bool `yaml:"isRegexp"` // expected message is interpreted as regexp (with regexp.MatchString()) } type ExpectedFixture struct { Comment string `yaml:"comment,omitempty"` Todo string `yaml:"todo,omitempty"` ExpectedLoadError bool `yaml:"expectedLoadError"` // expect error on load: skip validate step ExpectedValid bool `yaml:"expectedValid"` // expect valid spec ExpectedMessages []ExpectedMessage `yaml:"expectedMessages"` ExpectedWarnings []ExpectedMessage `yaml:"expectedWarnings"` Tested bool `yaml:"-"` Failed bool `yaml:"-"` } type ExpectedMap map[string]*ExpectedFixture func (m ExpectedMap) Get(key string) (*ExpectedFixture, bool) { v, ok := m[key] // no need to lock this map for now return v, ok } // Test message improvements, issue #44 and some more // ContinueOnErrors mode on // WARNING: this test is very demanding and constructed with varied scenarios, // which are not necessarily "unitary". Expect multiple changes in messages whenever // altering the validator. func Test_MessageQualityContinueOnErrors_Issue44(t *testing.T) { if !enableLongTests { skipNotify(t) t.SkipNow() } errs := testMessageQuality(t, true, true) /* set haltOnErrors=true to iterate spec by spec */ assert.Zero(t, errs, "Message testing didn't match expectations") } // ContinueOnErrors mode off func Test_MessageQualityStopOnErrors_Issue44(t *testing.T) { if !enableLongTests { skipNotify(t) t.SkipNow() } errs := testMessageQuality(t, true, false) /* set haltOnErrors=true to iterate spec by spec */ assert.Zero(t, errs, "Message testing didn't match expectations") } func loadTestConfig(t *testing.T, fp string) ExpectedMap { expectedConfig, err := os.ReadFile(fp) require.NoErrorf(t, err, "cannot read expected messages config file: %v", err) tested := make(ExpectedMap, 200) err = yaml.Unmarshal(expectedConfig, &tested) require.NoErrorf(t, err, "cannot unmarshall expected messages from config file : %v", err) // Check config for fixture, expected := range tested { require.Nil(t, UniqueItems("", "", expected.ExpectedMessages), "duplicate error messages configured for %s", fixture) require.Nil(t, UniqueItems("", "", expected.ExpectedWarnings), "duplicate warning messages configured for %s", fixture) } return tested } func testMessageQuality(t *testing.T, haltOnErrors bool, continueOnErrors bool) int { // Verifies the production of validation error messages in multiple // spec scenarios. // // The objective is to demonstrate that: // - messages are stable // - validation continues as much as possible, even in presence of many errors // // haltOnErrors is used in dev mode to study and fix testcases step by step (output is pretty verbose) // // set SWAGGER_DEBUG_TEST=1 env to get a report of messages at the end of each test. // expectedMessage{"", false, false}, // // expected messages and warnings are configured in ./fixtures/validation/expected_messages.yaml // var errs int // error count tested := loadTestConfig(t, filepath.Join("fixtures", "validation", "expected_messages.yaml")) if err := filepath.Walk(filepath.Join("fixtures", "validation"), testWalkSpecs(t, tested, haltOnErrors, continueOnErrors)); err != nil { t.Logf("%v", err) errs++ } recapTest(t, tested) return errs } func testDebugLog(t *testing.T, thisTest *ExpectedFixture) { if DebugTest { if thisTest.Comment != "" { t.Logf("\tDEVMODE: Comment: %s", thisTest.Comment) } if thisTest.Todo != "" { t.Logf("\tDEVMODE: Todo: %s", thisTest.Todo) } } } func expectInvalid(t *testing.T, path string, thisTest *ExpectedFixture, continueOnErrors bool) { // Checking invalid specs t.Logf("Testing messages for invalid spec: %s", path) testDebugLog(t, thisTest) doc, err := loads.Spec(path) // Check specs with load errors (error is located in pkg loads or spec) if thisTest.ExpectedLoadError { // Expect a load error: no further validation may possibly be conducted. require.Error(t, err, "expected this spec to return a load error") assert.Equal(t, 0, verifyLoadErrors(t, err, thisTest.ExpectedMessages)) return } require.NoError(t, err, "expected this spec to load properly") // Validate the spec document validator := NewSpecValidator(doc.Schema(), strfmt.Default) validator.SetContinueOnErrors(continueOnErrors) res, warn := validator.Validate(doc) // Check specs with load errors (error is located in pkg loads or spec) require.False(t, res.IsValid(), "expected this spec to be invalid") errs := verifyErrorsVsWarnings(t, res, warn) errs += verifyErrors(t, res, thisTest.ExpectedMessages, "error", continueOnErrors) errs += verifyErrors(t, warn, thisTest.ExpectedWarnings, "warning", continueOnErrors) assert.Equal(t, 0, errs) if errs > 0 { t.Logf("Message qualification on spec validation failed for %s", path) // DEVMODE allows developers to experiment and tune expected results if DebugTest { reportTest(t, path, res, thisTest.ExpectedMessages, "error", continueOnErrors) reportTest(t, path, warn, thisTest.ExpectedWarnings, "warning", continueOnErrors) } } } func expectValid(t *testing.T, path string, thisTest *ExpectedFixture, continueOnErrors bool) { // Expecting no message (e.g.valid spec): 0 message expected t.Logf("Testing valid spec: %s", path) testDebugLog(t, thisTest) doc, err := loads.Spec(path) require.NoError(t, err, "expected this spec to load without error") validator := NewSpecValidator(doc.Schema(), strfmt.Default) validator.SetContinueOnErrors(continueOnErrors) res, warn := validator.Validate(doc) assert.True(t, res.IsValid(), "expected this spec to be valid") assert.Emptyf(t, res.Errors, "expected no returned errors") // check warnings errs := verifyErrors(t, warn, thisTest.ExpectedWarnings, "warning", continueOnErrors) assert.Equal(t, 0, errs) if DebugTest && errs > 0 { reportTest(t, path, res, thisTest.ExpectedMessages, "error", continueOnErrors) reportTest(t, path, warn, thisTest.ExpectedWarnings, "warning", continueOnErrors) } } func checkMustHalt(t *testing.T, haltOnErrors bool) { if t.Failed() && haltOnErrors { assert.FailNow(t, "test halted: stop testing on message checking error mode") return } } func testWalkSpecs(t *testing.T, tested ExpectedMap, haltOnErrors, continueOnErrors bool) filepath.WalkFunc { return func(path string, info os.FileInfo, err error) error { thisTest, found := tested.Get(info.Name()) if info.IsDir() || !found { // skip return nil } t.Run(path, func(t *testing.T) { if !DebugTest { // when running in dev mode, run serially t.Parallel() } defer func() { thisTest.Tested = true thisTest.Failed = t.Failed() }() if !thisTest.ExpectedValid { expectInvalid(t, path, thisTest, continueOnErrors) checkMustHalt(t, haltOnErrors) } else { expectValid(t, path, thisTest, continueOnErrors) checkMustHalt(t, haltOnErrors) } }) return nil } } func recapTest(t *testing.T, config ExpectedMap) { recapFailed := false for k, v := range config { if !v.Tested { t.Logf("WARNING: %s configured but not tested (fixture not found)", k) recapFailed = true } else if v.Failed { t.Logf("ERROR: %s failed passing messages verification", k) recapFailed = true } } if !recapFailed { t.Log("INFO:We are good") } } func reportTest(t *testing.T, path string, res *Result, expectedMessages []ExpectedMessage, msgtype string, continueOnErrors bool) { // Prints out a recap of error messages. To be enabled during development / test iterations verifiedErrors := make([]string, 0, 50) lines := make([]string, 0, 50) for _, e := range res.Errors { verifiedErrors = append(verifiedErrors, e.Error()) } t.Logf("DEVMODE:Recap of returned %s messages while validating %s ", msgtype, path) for _, v := range verifiedErrors { status := fmt.Sprintf("Unexpected %s", msgtype) for _, s := range expectedMessages { if (s.WithContinueOnErrors && continueOnErrors) || !s.WithContinueOnErrors { if s.IsRegexp { if matched, _ := regexp.MatchString(s.Message, v); matched { status = fmt.Sprintf("Expected %s", msgtype) break } } else { if strings.Contains(v, s.Message) { status = fmt.Sprintf("Expected %s", msgtype) break } } } } lines = append(lines, fmt.Sprintf("[%s]%s", status, v)) } for _, s := range expectedMessages { if (s.WithContinueOnErrors && continueOnErrors) || !s.WithContinueOnErrors { status := fmt.Sprintf("Missing %s", msgtype) for _, v := range verifiedErrors { if s.IsRegexp { if matched, _ := regexp.MatchString(s.Message, v); matched { status = fmt.Sprintf("Expected %s", msgtype) break } } else { if strings.Contains(v, s.Message) { status = fmt.Sprintf("Expected %s", msgtype) break } } } if status != fmt.Sprintf("Expected %s", msgtype) { lines = append(lines, fmt.Sprintf("[%s]%s", status, s.Message)) } } } if len(lines) > 0 { sort.Strings(lines) for _, line := range lines { t.Logf(line) } } } func verifyErrorsVsWarnings(t *testing.T, res, warn *Result) int { // First verification of result conventions: results are redundant, just a matter of presentation w := len(warn.Errors) if !assert.Len(t, res.Warnings, w) || !assert.Empty(t, warn.Warnings) || !assert.Subset(t, res.Warnings, warn.Errors) || !assert.Subset(t, warn.Errors, res.Warnings) { t.Log("Result equivalence errors vs warnings not verified") return 1 } return 0 } func verifyErrors(t *testing.T, res *Result, expectedMessages []ExpectedMessage, msgtype string, continueOnErrors bool) int { var numExpected, errs int verifiedErrors := make([]string, 0, 50) for _, e := range res.Errors { verifiedErrors = append(verifiedErrors, e.Error()) } for _, s := range expectedMessages { if (s.WithContinueOnErrors == true && continueOnErrors == true) || s.WithContinueOnErrors == false { numExpected++ } } // We got the expected number of messages (e.g. no duplicates, no uncontrolled side-effect, ...) if !assert.Len(t, verifiedErrors, numExpected, "unexpected number of %s messages returned. Wanted %d, got %d", msgtype, numExpected, len(verifiedErrors)) { errs++ } // Check that all expected messages are here for _, s := range expectedMessages { found := false if (s.WithContinueOnErrors == true && continueOnErrors == true) || s.WithContinueOnErrors == false { for _, v := range verifiedErrors { if s.IsRegexp { if matched, _ := regexp.MatchString(s.Message, v); matched { found = true break } } else { if strings.Contains(v, s.Message) { found = true break } } } if !assert.True(t, found, "Missing expected %s message: %s", msgtype, s.Message) { errs++ } } } // Check for no unexpected message for _, v := range verifiedErrors { found := false for _, s := range expectedMessages { if (s.WithContinueOnErrors == true && continueOnErrors == true) || s.WithContinueOnErrors == false { if s.IsRegexp { if matched, _ := regexp.MatchString(s.Message, v); matched { found = true break } } else { if strings.Contains(v, s.Message) { found = true break } } } } if !assert.True(t, found, "unexpected %s message: %s", msgtype, v) { errs++ } } return errs } func verifyLoadErrors(t *testing.T, err error, expectedMessages []ExpectedMessage) int { var errs int // Perform several matches on single error message // Process here error messages from loads (normally unit tested in the load package: // we just want to figure out how all this is captured at the validate package level. v := err.Error() for _, s := range expectedMessages { var found bool if s.IsRegexp { if found, _ = regexp.MatchString(s.Message, v); found { break } } else { if found = strings.Contains(v, s.Message); found { break } } if !assert.True(t, found, "unexpected load error: %s", v) { t.Logf("Expecting one of the following:") for _, s := range expectedMessages { smode := "Contains" if s.IsRegexp { smode = "MatchString" } t.Logf("[%s]:%s", smode, s.Message) } errs++ } } return errs } func testIssue(t *testing.T, path string, expectedNumErrors, expectedNumWarnings int) { res, _ := loadAndValidate(t, path) if expectedNumErrors > -1 && !assert.Len(t, res.Errors, expectedNumErrors) { t.Log("Returned errors:") for _, e := range res.Errors { t.Logf("%v", e) } } if expectedNumWarnings > -1 && !assert.Len(t, res.Warnings, expectedNumWarnings) { t.Log("Returned warnings:") for _, e := range res.Warnings { t.Logf("%v", e) } } } // Test unitary fixture for dev and bug fixing func Test_SingleFixture(t *testing.T) { t.SkipNow() path := filepath.Join("fixtures", "validation", "fixture-1231.yaml") testIssue(t, path, -1, -1) }