@@ -2,6 +2,7 @@ package controller_test
22
33import (
44 "expenses/internal/models"
5+ "expenses/pkg/utils"
56 "fmt"
67 "net/http"
78 "strconv"
@@ -38,18 +39,6 @@ func createAccount(testHelper *TestHelper, name string, balance float64) float64
3839 return response ["data" ].(map [string ]any )["id" ].(float64 )
3940}
4041
41- func uploadStatement (testHelper * TestHelper , accountId float64 , filename string , fileContent []byte ) float64 {
42- statementInput := map [string ]any {
43- "account_id" : int64 (accountId ),
44- "original_filename" : filename ,
45- "file_type" : "csv" ,
46- "file" : fileContent ,
47- }
48- resp , response := testHelper .MakeMultipartRequest (http .MethodPost , "/statement" , statementInput )
49- Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
50- return response ["data" ].(map [string ]any )["id" ].(float64 )
51- }
52-
5342func waitForStatementDone (testHelper * TestHelper , statementId float64 ) map [string ]any {
5443 var status string
5544 var data map [string ]any
@@ -408,9 +397,9 @@ var _ = Describe("StatementController", func() {
408397 Expect (response ).To (HaveKey ("message" ))
409398 })
410399
411- It ("should return error for file larger than 256kb " , func () {
412- // Create a file >256kb
413- bigFile := make ([]byte , 257 * 1024 )
400+ It ("should return error for file larger than 5MB " , func () {
401+ // Create a file >5MB
402+ bigFile := make ([]byte , 5 * 1024 * 1024 + 1 )
414403 for i := range bigFile {
415404 bigFile [i ] = 'A'
416405 }
@@ -644,7 +633,7 @@ var _ = Describe("StatementController", func() {
644633
645634 It ("should handle service error in PreviewStatement" , func () {
646635 // Create a file that will cause service-level validation error
647- fileContent := make ([]byte , 300 * 1024 ) // File larger than 256KB
636+ fileContent := make ([]byte , 5 * 1024 * 1024 + 1 ) // File larger than 5MB
648637 for i := range fileContent {
649638 fileContent [i ] = 'A'
650639 }
@@ -732,19 +721,21 @@ var _ = Describe("StatementController", func() {
732721 Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
733722 accountId := response ["data" ].(map [string ]any )["id" ].(float64 )
734723
735- // 4. Create a statement with file upload
736- fileContent := []byte (
737- "Txn Date Value Date Description Ref No. Debit Credit Balance\n " +
738- "1 Aug 2022 1 Aug 2022 TO TRANSFER-UPI/DR/221356312527/RITIK S/SBIN/rs6321908@/UPI-- 123456 100.00 1000.00\n " +
739- "BADROW\n " +
740- "2 Aug 2022 2 Aug 2022 BY TRANSFER-NEFT*HDFC0000001*N215222062454075*QURIATE TECHNOLO-- 654321 200.00 1200.00\n " +
741- "Computer Generated Statement" )
742- fileName := "integration_statement.csv"
724+ // 4. Create a statement with an XLSX upload so the SBI parser can handle it
725+ xlsxData := [][]string {
726+ {"Txn Date" , "Details" , "Ref No." , "Debit" , "Credit" , "Balance" },
727+ {"1 Aug 2022" , "TO TRANSFER-UPI/DR/221356312527/RITIK S/SBIN/rs6321908@/UPI--" , "123456" , "100.00" , "" , "1000.00" },
728+ {"BADROW" },
729+ {"2 Aug 2022" , "BY TRANSFER-NEFT*HDFC0000001*N215222062454075*QURIATE TECHNOLO--" , "654321" , "" , "200.00" , "1200.00" },
730+ {"Computer Generated Statement" },
731+ }
732+ fileBytes := utils .CreateXLSXFile (xlsxData )
733+ fileName := "integration_statement.xlsx"
743734 statementInput := map [string ]any {
744735 "account_id" : int64 (accountId ),
745736 "original_filename" : fileName ,
746- "file_type" : "csv " ,
747- "file" : fileContent ,
737+ "file_type" : "excel " ,
738+ "file" : fileBytes ,
748739 }
749740 resp , response = testHelper .MakeMultipartRequest (http .MethodPost , "/statement" , statementInput )
750741 Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
@@ -782,12 +773,24 @@ var _ = Describe("StatementController", func() {
782773 testHelper := createUniqueUser (baseURL )
783774 accountId := createAccount (testHelper , "Account 1" , 1000.0 )
784775
785- fileContent4 := []byte ("Txn Date\t Value Date\t Description\t Ref No.\t Debit\t Credit\t Balance\n " +
786- "1 Aug 2022\t 1 Aug 2022\t Desc1\t 123\t 100.00\t \t 1000.00\n " +
787- "2 Aug 2022\t 2 Aug 2022\t Desc2\t 124\t 200.00\t \t 1200.00\n " +
788- "3 Aug 2022\t 3 Aug 2022\t Desc3\t 125\t 300.00\t \t 1500.00\n " +
789- "4 Aug 2022\t 4 Aug 2022\t Desc4\t 126\t 400.00\t \t 1900.00\n Computer Generated Statement" )
790- statementId := uploadStatement (testHelper , accountId , "statement_4.csv" , fileContent4 )
776+ // Upload as XLSX so the SBI parser can parse rows reliably
777+ xlsx4 := [][]string {
778+ {"Txn Date" , "Details" , "Ref No." , "Debit" , "Credit" , "Balance" },
779+ {"1 Aug 2022" , "Desc1" , "123" , "100.00" , "" , "1000.00" },
780+ {"2 Aug 2022" , "Desc2" , "124" , "200.00" , "" , "1200.00" },
781+ {"3 Aug 2022" , "Desc3" , "125" , "300.00" , "" , "1500.00" },
782+ {"4 Aug 2022" , "Desc4" , "126" , "400.00" , "" , "1900.00" },
783+ }
784+ fileBytes4 := utils .CreateXLSXFile (xlsx4 )
785+ statementInput4 := map [string ]any {
786+ "account_id" : int64 (accountId ),
787+ "original_filename" : "statement_4.xlsx" ,
788+ "file_type" : "excel" ,
789+ "file" : fileBytes4 ,
790+ }
791+ resp , response := testHelper .MakeMultipartRequest (http .MethodPost , "/statement" , statementInput4 )
792+ Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
793+ statementId := response ["data" ].(map [string ]any )["id" ].(float64 )
791794 waitForStatementDone (testHelper , statementId )
792795
793796 // Fetch transactions for the first statement
@@ -799,15 +802,27 @@ var _ = Describe("StatementController", func() {
799802 transactions := txData ["transactions" ].([]any )
800803 Expect (transactions ).To (HaveLen (4 ))
801804
802- fileContent7 := []byte ("Txn Date\t Value Date\t Description\t Ref No.\t Debit\t Credit\t Balance\n " +
803- "1 Aug 2022\t 1 Aug 2022\t Desc1\t 123\t 100.00\t \t 1000.00\n " +
804- "2 Aug 2022\t 2 Aug 2022\t Desc2\t 124\t 200.00\t \t 1200.00\n " +
805- "3 Aug 2022\t 3 Aug 2022\t Desc3\t 125\t 300.00\t \t 1500.00\n " +
806- "4 Aug 2022\t 4 Aug 2022\t Desc4\t 126\t 400.00\t \t 1900.00\n " +
807- "5 Aug 2022\t 5 Aug 2022\t Desc5\t 127\t 500.00\t \t 2400.00\n " +
808- "6 Aug 2022\t 6 Aug 2022\t Desc6\t 128\t 600.00\t \t 3000.00\n " +
809- "7 Aug 2022\t 7 Aug 2022\t Desc7\t 129\t 700.00\t \t 3700.00\n Computer Generated Statement" )
810- statementId = uploadStatement (testHelper , accountId , "statement_7.csv" , fileContent7 )
805+ // Upload as XLSX for the 7-row statement
806+ xlsx7 := [][]string {
807+ {"Txn Date" , "Details" , "Ref No." , "Debit" , "Credit" , "Balance" },
808+ {"1 Aug 2022" , "Desc1" , "123" , "100.00" , "" , "1000.00" },
809+ {"2 Aug 2022" , "Desc2" , "124" , "200.00" , "" , "1200.00" },
810+ {"3 Aug 2022" , "Desc3" , "125" , "300.00" , "" , "1500.00" },
811+ {"4 Aug 2022" , "Desc4" , "126" , "400.00" , "" , "1900.00" },
812+ {"5 Aug 2022" , "Desc5" , "127" , "500.00" , "" , "2400.00" },
813+ {"6 Aug 2022" , "Desc6" , "128" , "600.00" , "" , "3000.00" },
814+ {"7 Aug 2022" , "Desc7" , "129" , "700.00" , "" , "3700.00" },
815+ }
816+ fileBytes7 := utils .CreateXLSXFile (xlsx7 )
817+ statementInput7 := map [string ]any {
818+ "account_id" : int64 (accountId ),
819+ "original_filename" : "statement_7.xlsx" ,
820+ "file_type" : "excel" ,
821+ "file" : fileBytes7 ,
822+ }
823+ resp , response = testHelper .MakeMultipartRequest (http .MethodPost , "/statement" , statementInput7 )
824+ Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
825+ statementId = response ["data" ].(map [string ]any )["id" ].(float64 )
811826 waitForStatementDone (testHelper , statementId )
812827
813828 // Fetch transactions for the second statement
@@ -820,20 +835,41 @@ var _ = Describe("StatementController", func() {
820835 Expect (transactions ).To (HaveLen (3 ))
821836 })
822837
823- It ("should parse statement with 1000 transactions" , func () {
838+ It ("should parse statement with 10000 transactions" , func () {
824839 testHelper := createUniqueUser (baseURL )
825840 accountId := createAccount (testHelper , "Account 1" , 1000.0 )
826841
827- var rows string
842+ // Build XLSX data (header + 10000 rows)
843+ data := [][]string {
844+ {"Txn Date" , "Details" , "Ref No." , "Debit" , "Credit" , "Balance" },
845+ }
828846 for i := 1 ; i <= 1000 ; i ++ {
829- rows += fmt .Sprintf ("22 Aug 2022 22 Aug 2022 Desc%d %d %.2f %.2f\n " , i , 1000 + i , float64 (i ), float64 (1000 + i ))
847+ row := []string {
848+ "22 Aug 2022" ,
849+ fmt .Sprintf ("Desc%d" , i ),
850+ fmt .Sprintf ("%d" , 1000 + i ),
851+ fmt .Sprintf ("%.2f" , float64 (i )),
852+ fmt .Sprintf ("%.2f" , float64 (1000 + i )),
853+ fmt .Sprintf ("%.2f" , float64 (2000 + i )),
854+ }
855+ data = append (data , row )
830856 }
831- fileContent := []byte ("Txn Date Value Date Description Ref No. Debit Credit Balance\n " + rows + "Computer Generated Statement" )
832- statementId := uploadStatement (testHelper , accountId , "statement_1000.csv" , fileContent )
857+
858+ fileBytes := utils .CreateXLSXFile (data )
859+ // Upload as an Excel file
860+ statementInput := map [string ]any {
861+ "account_id" : int64 (accountId ),
862+ "original_filename" : "statement_10000.xlsx" ,
863+ "file_type" : "excel" ,
864+ "file" : fileBytes ,
865+ }
866+ resp , response := testHelper .MakeMultipartRequest (http .MethodPost , "/statement" , statementInput )
867+ Expect (resp .StatusCode ).To (Equal (http .StatusCreated ))
868+ statementId := response ["data" ].(map [string ]any )["id" ].(float64 )
833869 waitForStatementDone (testHelper , statementId )
834870
835871 // Fetch transactions for the statement
836- resp , response : = testHelper .MakeRequest (http .MethodGet , "/transaction?page_size=10&statement_id=" + strconv .FormatFloat (statementId , 'f' , 0 , 64 ), nil )
872+ resp , response = testHelper .MakeRequest (http .MethodGet , "/transaction?page_size=10&statement_id=" + strconv .FormatFloat (statementId , 'f' , 0 , 64 ), nil )
837873 Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
838874 Expect (response ).To (HaveKey ("data" ))
839875 txData := response ["data" ].(map [string ]any )
@@ -872,11 +908,11 @@ var _ = Describe("StatementController", func() {
872908 Expect (resp .StatusCode ).To (Equal (http .StatusNotFound ))
873909 })
874910
875- It ("should fail to parse multipart file >256kb " , func () {
911+ It ("should fail to parse multipart file > 5MB " , func () {
876912 testHelper := createUniqueUser (baseURL )
877913 accountId := createAccount (testHelper , "BigFileAccount" , 1000.0 )
878- // Create a file >256kb
879- bigFile := make ([]byte , 257 * 1024 )
914+ // Create a file >5MB
915+ bigFile := make ([]byte , 5 * 1024 * 1024 + 1 )
880916 for i := range bigFile {
881917 bigFile [i ] = 'A'
882918 }
0 commit comments