diff --git a/engine/cdr_test.go b/engine/cdr_test.go
index 4c345f2b7..bd330cd7e 100644
--- a/engine/cdr_test.go
+++ b/engine/cdr_test.go
@@ -318,7 +318,7 @@ func TestCDRNewCDRFromSQL(t *testing.T) {
Subject: "1001",
Destination: "+4986517174963",
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC),
- AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC),
+ AnswerTime: utils.TimePointer(time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC)),
Usage: 10000000000,
Cost: 1.01,
RequestType: utils.MetaRated,
diff --git a/engine/models_test.go b/engine/models_test.go
new file mode 100644
index 000000000..e730fb7cd
--- /dev/null
+++ b/engine/models_test.go
@@ -0,0 +1,84 @@
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or56
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+
+package engine
+
+import (
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/cgrates/cgrates/utils"
+)
+
+func TestModelsAsMapStringInterface(t *testing.T) {
+ testCdrSql := CDRsql{
+ ID: 1,
+ Cgrid: "testCgrID1",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ Source: "testSource",
+ OriginID: "testOriginId",
+ TOR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ Usage: 2,
+ ExtraFields: "extraFields",
+ CostSource: "testCostSource",
+ Cost: 2,
+ CostDetails: "testCostDetails",
+ ExtraInfo: "testExtraInfo",
+ CreatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ UpdatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ DeletedAt: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ }
+ expected := map[string]interface{}{
+ "cgrid": testCdrSql.Cgrid,
+ "run_id": testCdrSql.RunID,
+ "origin_host": testCdrSql.OriginHost,
+ "source": testCdrSql.Source,
+ "origin_id": testCdrSql.OriginID,
+ "tor": testCdrSql.TOR,
+ "request_type": testCdrSql.RequestType,
+ "tenant": testCdrSql.Tenant,
+ "category": testCdrSql.Category,
+ "account": testCdrSql.Account,
+ "subject": testCdrSql.Subject,
+ "destination": testCdrSql.Destination,
+ "setup_time": testCdrSql.SetupTime,
+ "answer_time": testCdrSql.AnswerTime,
+ "usage": testCdrSql.Usage,
+ "extra_fields": testCdrSql.ExtraFields,
+ "cost_source": testCdrSql.CostSource,
+ "cost": testCdrSql.Cost,
+ "cost_details": testCdrSql.CostDetails,
+ "extra_info": testCdrSql.ExtraInfo,
+ "created_at": testCdrSql.CreatedAt,
+ "updated_at": testCdrSql.UpdatedAt,
+ }
+ result := testCdrSql.AsMapStringInterface()
+ if !reflect.DeepEqual(expected, result) {
+ t.Errorf("\nExpected <%+v>, \nReceived <%+v>", expected, result)
+ }
+}
diff --git a/migrator/cdrs_test.go b/migrator/cdrs_test.go
new file mode 100644
index 000000000..8492ac507
--- /dev/null
+++ b/migrator/cdrs_test.go
@@ -0,0 +1,210 @@
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+package migrator
+
+import (
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/cgrates/cgrates/engine"
+ "github.com/cgrates/cgrates/utils"
+)
+
+func TestCdrsNewV1CDRFromCDRSql(t *testing.T) {
+ testCdrSql := &engine.CDRsql{
+ ID: 1,
+ Cgrid: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ Source: "testSource",
+ TOR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ Usage: 1,
+ CostSource: "testSource",
+ Cost: 2,
+ ExtraInfo: "testExtraInfo",
+ CreatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ UpdatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ DeletedAt: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ }
+ expected := &v1Cdrs{
+ CGRID: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ OrderID: 1,
+ Source: "testSource",
+ ToR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ Usage: time.Nanosecond,
+ ExtraInfo: "testExtraInfo",
+ Partial: false,
+ Rated: false,
+ CostSource: "testSource",
+ Cost: 2,
+ }
+ result, err := NewV1CDRFromCDRSql(testCdrSql)
+ if err != nil {
+ t.Error(err)
+ }
+ if !reflect.DeepEqual(expected, result) {
+ t.Errorf("\nExpected <%+v>, \nReceived <%+v>", expected, result)
+ }
+}
+
+func TestCdrsAsCDRsql(t *testing.T) {
+ testV1Cdrs := &v1Cdrs{
+ CGRID: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ OrderID: 1,
+ Source: "testSource",
+ ToR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ Usage: time.Nanosecond,
+ ExtraInfo: "testExtraInfo",
+ Partial: false,
+ Rated: false,
+ CostSource: "testSource",
+ Cost: 2,
+ }
+
+ expected := &engine.CDRsql{
+ ID: 0,
+ Cgrid: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ Source: "testSource",
+ TOR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ Usage: 1,
+ CostSource: "testSource",
+ Cost: 2,
+ ExtraInfo: "testExtraInfo",
+ CreatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ ExtraFields: "",
+ CostDetails: "",
+ }
+ result := testV1Cdrs.AsCDRsql()
+ result.CreatedAt = time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)
+ result.ExtraFields = ""
+ result.CostDetails = ""
+ if !reflect.DeepEqual(expected, result) {
+ t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ToJSON(expected), utils.ToJSON(result))
+ }
+}
+
+func TestCdrsAsCDRsqlAnswertimeEmpty(t *testing.T) {
+ var answTime time.Time
+ testV1Cdrs := &v1Cdrs{
+ AnswerTime: answTime,
+ }
+
+ expected := &engine.CDRsql{
+ AnswerTime: nil,
+ CreatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ }
+ result := testV1Cdrs.AsCDRsql()
+ result.CreatedAt = time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)
+ result.ExtraFields = ""
+ result.CostDetails = ""
+ if !reflect.DeepEqual(expected, result) {
+ t.Errorf("\nExpected <%+v>, \nReceived <%+v>", utils.ToJSON(expected), utils.ToJSON(result))
+ }
+}
+
+func TestCdrsNewV1CDRFromCDRSqlAnswerTimeNil(t *testing.T) {
+ testCdrSql := &engine.CDRsql{
+ ID: 1,
+ Cgrid: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ Source: "testSource",
+ TOR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: nil,
+ Usage: 1,
+ CostSource: "testSource",
+ Cost: 2,
+ ExtraInfo: "testExtraInfo",
+ CreatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ UpdatedAt: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ DeletedAt: utils.TimePointer(time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC)),
+ }
+ var answTime time.Time
+ expected := &v1Cdrs{
+ CGRID: "testID",
+ RunID: "testRunID",
+ OriginHost: "testOriginHost",
+ OrderID: 1,
+ Source: "testSource",
+ ToR: "testTOR",
+ RequestType: "testRequestType",
+ Tenant: "cgrates.org",
+ Category: "testCategory",
+ Account: "testAccount",
+ Subject: "testSubject",
+ Destination: "testDestination",
+ SetupTime: time.Date(2021, 3, 3, 3, 3, 3, 3, time.UTC),
+ AnswerTime: answTime,
+ Usage: time.Nanosecond,
+ ExtraInfo: "testExtraInfo",
+ Partial: false,
+ Rated: false,
+ CostSource: "testSource",
+ Cost: 2,
+ }
+ result, err := NewV1CDRFromCDRSql(testCdrSql)
+ if err != nil {
+ t.Error(err)
+ }
+ if !reflect.DeepEqual(expected, result) {
+ t.Errorf("\nExpected <%+v>, \nReceived <%+v>", expected, result)
+ }
+}