Skip to content

Commit 23b405d

Browse files
authored
Bugfix resolve #1155 (#1158)
* Revert "Revert "bugfix - resolve issue #1155" (#1157)" This reverts commit 25457ed. * added unit test for user provided input
1 parent 25457ed commit 23b405d

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

core/util/util.go

+30-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
log "github.com/sirupsen/logrus"
1515
"io/ioutil"
1616
"k8s.io/client-go/util/jsonpath"
17+
"math/big"
1718
"math/rand"
1819
"net/http"
1920
"net/url"
@@ -401,11 +402,14 @@ func jsonPath(query, toMatch string) interface{} {
401402

402403
// Jsonpath library converts large int into a string with scientific notion, the following
403404
// reverts that process to avoid mismatching when using the jsonpath result for csv data lookup
404-
floatResult, err := strconv.ParseFloat(result, 64)
405-
// if the string is a float and a whole number
406-
if err == nil && floatResult == float64(int64(floatResult)) {
407-
intResult := int(floatResult)
408-
result = strconv.Itoa(intResult)
405+
// Handle large integers in scientific notation by converting back to big.Int
406+
if isScientific(result) {
407+
// If result is in scientific notation, try converting to a big.Int
408+
bigInt := new(big.Int)
409+
bigInt, success := bigIntFromString(result)
410+
if success {
411+
result = bigInt.String() // Convert back to string representation of the big integer
412+
}
409413
}
410414

411415
// convert to array data if applicable
@@ -420,6 +424,27 @@ func jsonPath(query, toMatch string) interface{} {
420424
return arrayData
421425
}
422426

427+
// isScientific checks if a string is in scientific notation (e.g., "1.349599e+37")
428+
func isScientific(value string) bool {
429+
return strings.Contains(value, "e") || strings.Contains(value, "E")
430+
}
431+
432+
// bigIntFromString converts a string representing a number (potentially in scientific notation) to big.Int
433+
func bigIntFromString(value string) (*big.Int, bool) {
434+
// Parse the string as a big.Float to handle scientific notation
435+
flt := new(big.Float)
436+
flt, _, err := big.ParseFloat(value, 10, 0, big.ToNearestEven)
437+
if err != nil {
438+
return nil, false
439+
}
440+
441+
// Convert the big.Float to big.Int (rounding down)
442+
bigInt := new(big.Int)
443+
flt.Int(bigInt)
444+
445+
return bigInt, true
446+
}
447+
423448
func xPath(query, toMatch string) string {
424449
result, err := XpathExecution(query, toMatch)
425450
if err != nil {

core/util/util_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,27 @@ func Test_CopyMap(t *testing.T) {
234234
Expect(newMap["second"]).To(Equal("2"))
235235
}
236236

237+
func Test_JsonPathMethod_WithBigFloatingNumber(t *testing.T) {
238+
239+
RegisterTestingT(t)
240+
res := jsonPath("$.registrant", `{"registrant":"13495985898986869898697879879987978978.12345566777"}`)
241+
Expect(res).To(Equal("13495985898986869898697879879987978978.12345566777"))
242+
}
243+
244+
func Test_JsonPathMethod_WithBigIntegerUserProvidedNumber(t *testing.T) {
245+
246+
RegisterTestingT(t)
247+
res := jsonPath("$.registrant", `{"registrant":"0009007199254740999"}`)
248+
Expect(res).To(Equal("0009007199254740999"))
249+
}
250+
251+
func Test_JsonPathMethod_WithWordContainingEe(t *testing.T) {
252+
253+
RegisterTestingT(t)
254+
res := jsonPath("$.registrant", `{"registrant":"ETest"}`)
255+
Expect(res).To(Equal("ETest"))
256+
}
257+
237258
func Test_Identical_ReturnsTrue_WithExactlySameArray(t *testing.T) {
238259
RegisterTestingT(t)
239260
first := [2]string{"q1", "q2"}

0 commit comments

Comments
 (0)