evcc-io/tariff/octopusit_test.go

100 lines
2.9 KiB
Go

package tariff
import (
"testing"
"time"
krakengql "github.com/evcc-io/evcc/tariff/octopuskraken/graphql"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestOctopusItConfigParse(t *testing.T) {
validConfig := map[string]any{
"email": "test@example.com",
"password": "testpassword",
"accountNumber": "A-12345678",
}
tariff, err := buildOctopusItFromConfig(validConfig)
require.NoError(t, err)
require.NotNil(t, tariff)
missingEmailConfig := map[string]any{
"password": "testpassword",
"accountNumber": "A-12345678",
}
_, err = buildOctopusItFromConfig(missingEmailConfig)
require.Error(t, err)
require.Contains(t, err.Error(), "missing email")
missingPasswordConfig := map[string]any{
"email": "test@example.com",
"accountNumber": "A-12345678",
}
_, err = buildOctopusItFromConfig(missingPasswordConfig)
require.Error(t, err)
require.Contains(t, err.Error(), "missing password")
missingAccountNumberConfig := map[string]any{
"email": "test@example.com",
"password": "testpassword",
}
_, err = buildOctopusItFromConfig(missingAccountNumberConfig)
require.Error(t, err)
require.Contains(t, err.Error(), "missing account number")
}
// fixedItAgreement builds a FIXED_SINGLE_RATE agreement matching the shape
// confirmed against the live Kraken IT API (issue #31505).
func fixedItAgreement(validFrom, validTo time.Time) krakengql.ItAgreement {
agr := krakengql.ItAgreement{
IsActive: true,
ValidFrom: validFrom,
ValidTo: validTo,
}
agr.Product.Code = "000129ESFML09XXXXXXXXOCTOFIXv109"
agr.Product.Prices = krakengql.ElectricityProductPrices{
ProductType: "FIXED_SINGLE_RATE",
ConsumptionCharge: "0.09900",
}
return agr
}
func TestRatesForItAgreementFixed(t *testing.T) {
now := time.Date(2026, 7, 10, 12, 0, 0, 0, time.UTC)
validFrom := now.AddDate(0, -9, 0)
validTo := now.AddDate(0, 3, 0)
agr := fixedItAgreement(validFrom, validTo)
rates, err := ratesForItAgreement(agr, now)
require.NoError(t, err)
require.Len(t, rates, 1)
r := rates[0]
assert.Equal(t, now, r.ValidFrom)
assert.Equal(t, now.AddDate(0, 0, planDays), r.ValidTo)
assert.InDelta(t, 9.9, r.GrossUnitRateCentsPerKwh, 1e-9)
}
func TestRatesForItAgreementCapsToAgreementValidity(t *testing.T) {
now := time.Date(2026, 7, 10, 12, 0, 0, 0, time.UTC)
validTo := now.AddDate(0, 0, 2)
agr := fixedItAgreement(now.AddDate(0, -1, 0), validTo)
rates, err := ratesForItAgreement(agr, now)
require.NoError(t, err)
require.Len(t, rates, 1)
assert.Equal(t, validTo, rates[0].ValidTo)
}
func TestRatesForItAgreementRejectsTimeOfUse(t *testing.T) {
now := time.Date(2026, 7, 10, 12, 0, 0, 0, time.UTC)
agr := fixedItAgreement(now.AddDate(0, -1, 0), now.AddDate(0, 1, 0))
agr.Product.Prices.ConsumptionChargeF2 = "0.12000"
agr.Product.Prices.ConsumptionChargeF3 = "0.07000"
_, err := ratesForItAgreement(agr, now)
require.Error(t, err)
assert.Contains(t, err.Error(), "time-of-use")
}