From c2efca7b6071ca6c0d5d4b5bc1310351c70a92c9 Mon Sep 17 00:00:00 2001 From: James Reategui Date: Thu, 15 May 2025 11:24:21 -0400 Subject: [PATCH 1/2] implement finding WMI when get multiple WMI matches wiht tests --- internal/core/queries/decode_vin.go | 21 ++++-- internal/core/queries/decode_vin_test.go | 81 ++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/internal/core/queries/decode_vin.go b/internal/core/queries/decode_vin.go index 3d4563b4..e2f0cf63 100644 --- a/internal/core/queries/decode_vin.go +++ b/internal/core/queries/decode_vin.go @@ -490,18 +490,31 @@ func (dc DecodeVINQueryHandler) vinInfoFromKnown(vin vin.VIN, knownModel string, vinInfo.VIN = vin.String() wmis, err := models.Wmis(models.WmiWhere.Wmi.EQ(vin.Wmi())).All(context.Background(), dc.dbs().Reader) if err != nil { - return nil, errors.Wrap(err, "vinInfoFromKnown: could not get WMI from vin wmi "+vin.Wmi()) + return nil, errors.Wrap(err, "vinInfoFromKnown: unknown WMI "+vin.Wmi()) } if len(wmis) > 1 { - return nil, fmt.Errorf("vinInfoFromKnown: more than one WMI found for vin wmi %s", vin.Wmi()) + // see if we can find an existing device definition for this WMI + for _, wmi := range wmis { + definitionID := common.DeviceDefinitionSlug(stringutils.SlugString(wmi.ManufacturerName), stringutils.SlugString(knownModel), int16(knownYear)) + deviceDefinitionTablelandModel, _, err := dc.deviceDefinitionOnChainService.GetDefinitionByID(context.Background(), definitionID) + if err == nil && deviceDefinitionTablelandModel != nil { + vinInfo.Make = wmi.ManufacturerName + break + } + } + // if make is blank means no matching DD's found. We don't have a good way to determine the right Make / OEM + if vinInfo.Make == "" { + return nil, fmt.Errorf("vinInfoFromKnown: unable to find the OEM for WMI %s", vin.Wmi()) + } + } else { + vinInfo.Make = wmis[0].ManufacturerName } - vinInfo.Make = wmis[0].ManufacturerName vinInfo.Year = knownYear vinInfo.Model = knownModel vinInfo.Source = "probably smartcar" if len(vinInfo.Model) == 0 || len(vinInfo.Make) == 0 || vinInfo.Year == 0 { - return nil, fmt.Errorf("unable to decode from known info") + return nil, fmt.Errorf("vinInfoFromKnown: unable to decode from known info") } return vinInfo, nil diff --git a/internal/core/queries/decode_vin_test.go b/internal/core/queries/decode_vin_test.go index feced071..5fd39424 100644 --- a/internal/core/queries/decode_vin_test.go +++ b/internal/core/queries/decode_vin_test.go @@ -947,3 +947,84 @@ func TestResolveMetadataFromInfo(t *testing.T) { func buildStyleName(vinInfo *coremodels.DrivlyVINResponse) string { return strings.TrimSpace(vinInfo.Trim + " " + vinInfo.SubModel) } + +func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_multipleWMI() { + vinny := "1FMCU0G61MUA52727" + v := vinutil.VIN(vinny) + // insert into wmi + wmi1 := models.Wmi{ + Wmi: "1FM", + ManufacturerName: "Ford", + } + wmi2 := models.Wmi{ + Wmi: "1FM", + ManufacturerName: "Lincoln", + } + err := wmi1.Insert(s.ctx, s.pdb.DBS().Writer, boil.Infer()) + require.NoError(s.T(), err) + err = wmi2.Insert(s.ctx, s.pdb.DBS().Writer, boil.Infer()) + require.NoError(s.T(), err) + // mock call to get definition by id + definitionID := "ford_escape_2020" + s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), definitionID).Return(&coremodels.DeviceDefinitionTablelandModel{ + ID: definitionID, + KSUID: ksuid.New().String(), + Model: "Escape", + Year: 2020, + DeviceType: common.DefaultDeviceType, + ImageURI: "", + Metadata: nil, + }, nil, nil) + + got, err := s.queryHandler.vinInfoFromKnown(v, "Escape", 2020) + require.NoError(s.T(), err) + assert.Equal(s.T(), "1FMCU0G61MUA52727", got.VIN) + assert.Equal(s.T(), "Ford", got.Make) + assert.Equal(s.T(), "Escape", got.Model) + assert.Equal(s.T(), int32(2020), got.Year) +} + +func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_singleWMI() { + vinny := "1FMCU0G61MUA52727" + v := vinutil.VIN(vinny) + // insert into wmi + wmi1 := models.Wmi{ + Wmi: "1FM", + ManufacturerName: "Ford", + } + + err := wmi1.Insert(s.ctx, s.pdb.DBS().Writer, boil.Infer()) + require.NoError(s.T(), err) + + got, err := s.queryHandler.vinInfoFromKnown(v, "Escape", 2020) + require.NoError(s.T(), err) + assert.Equal(s.T(), "1FMCU0G61MUA52727", got.VIN) + assert.Equal(s.T(), "Ford", got.Make) + assert.Equal(s.T(), "Escape", got.Model) + assert.Equal(s.T(), int32(2020), got.Year) +} + +func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_multipleWMINoDDFound() { + vinny := "1FMCU0G61MUA52727" + v := vinutil.VIN(vinny) + // insert into wmi + wmi1 := models.Wmi{ + Wmi: "1FM", + ManufacturerName: "Ford", + } + wmi2 := models.Wmi{ + Wmi: "1FM", + ManufacturerName: "Lincoln", + } + err := wmi1.Insert(s.ctx, s.pdb.DBS().Writer, boil.Infer()) + require.NoError(s.T(), err) + err = wmi2.Insert(s.ctx, s.pdb.DBS().Writer, boil.Infer()) + require.NoError(s.T(), err) + // mock call to get definition by id + definitionID := "ford_escape_2020" + s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), definitionID).Times(2).Return(nil, nil, fmt.Errorf("not found")) + + got, err := s.queryHandler.vinInfoFromKnown(v, "Escape", 2020) + require.Error(s.T(), err, "vinInfoFromKnown: unable to find the OEM for WMI 1FM") + require.Nil(s.T(), got) +} From 35365b4f7a73389aa9d21396f1a0d8338cb2a58e Mon Sep 17 00:00:00 2001 From: James Reategui Date: Thu, 15 May 2025 11:49:11 -0400 Subject: [PATCH 2/2] improve error message, make tests more reliable --- internal/core/queries/decode_vin.go | 4 +++- internal/core/queries/decode_vin_test.go | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/internal/core/queries/decode_vin.go b/internal/core/queries/decode_vin.go index e2f0cf63..2d499889 100644 --- a/internal/core/queries/decode_vin.go +++ b/internal/core/queries/decode_vin.go @@ -494,7 +494,9 @@ func (dc DecodeVINQueryHandler) vinInfoFromKnown(vin vin.VIN, knownModel string, } if len(wmis) > 1 { // see if we can find an existing device definition for this WMI + makeNamesForError := "" for _, wmi := range wmis { + makeNamesForError += wmi.ManufacturerName + ", " definitionID := common.DeviceDefinitionSlug(stringutils.SlugString(wmi.ManufacturerName), stringutils.SlugString(knownModel), int16(knownYear)) deviceDefinitionTablelandModel, _, err := dc.deviceDefinitionOnChainService.GetDefinitionByID(context.Background(), definitionID) if err == nil && deviceDefinitionTablelandModel != nil { @@ -504,7 +506,7 @@ func (dc DecodeVINQueryHandler) vinInfoFromKnown(vin vin.VIN, knownModel string, } // if make is blank means no matching DD's found. We don't have a good way to determine the right Make / OEM if vinInfo.Make == "" { - return nil, fmt.Errorf("vinInfoFromKnown: unable to find the OEM for WMI %s", vin.Wmi()) + return nil, fmt.Errorf("vinInfoFromKnown: unable to determine the right OEM between %sfor WMI %s", makeNamesForError, vin.Wmi()) } } else { vinInfo.Make = wmis[0].ManufacturerName diff --git a/internal/core/queries/decode_vin_test.go b/internal/core/queries/decode_vin_test.go index 5fd39424..631cb26a 100644 --- a/internal/core/queries/decode_vin_test.go +++ b/internal/core/queries/decode_vin_test.go @@ -966,7 +966,8 @@ func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_ require.NoError(s.T(), err) // mock call to get definition by id definitionID := "ford_escape_2020" - s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), definitionID).Return(&coremodels.DeviceDefinitionTablelandModel{ + + s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), gomock.AnyOf("lincoln_escape_2020", definitionID)).AnyTimes().Return(&coremodels.DeviceDefinitionTablelandModel{ ID: definitionID, KSUID: ksuid.New().String(), Model: "Escape", @@ -975,6 +976,7 @@ func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_ ImageURI: "", Metadata: nil, }, nil, nil) + //s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), "lincoln_escape_2020").AnyTimes().Return(nil, nil, fmt.Errorf("not found")) got, err := s.queryHandler.vinInfoFromKnown(v, "Escape", 2020) require.NoError(s.T(), err) @@ -1022,9 +1024,9 @@ func (s *DecodeVINQueryHandlerSuite) TestDecodeVINQueryHandler_vinInfoFromKnown_ require.NoError(s.T(), err) // mock call to get definition by id definitionID := "ford_escape_2020" - s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), definitionID).Times(2).Return(nil, nil, fmt.Errorf("not found")) + s.mockDeviceDefinitionOnChainService.EXPECT().GetDefinitionByID(gomock.Any(), gomock.AnyOf("lincoln_escape_2020", definitionID)).Times(2).Return(nil, nil, fmt.Errorf("not found")) got, err := s.queryHandler.vinInfoFromKnown(v, "Escape", 2020) - require.Error(s.T(), err, "vinInfoFromKnown: unable to find the OEM for WMI 1FM") + require.Error(s.T(), err, "vinInfoFromKnown: unable to determine the right OEM between Ford, Lincoln for WMI %s 1FM") require.Nil(s.T(), got) }