diff --git a/lib/hyperline.rb b/lib/hyperline.rb index 4ebedc1..d2847db 100644 --- a/lib/hyperline.rb +++ b/lib/hyperline.rb @@ -7,6 +7,7 @@ require_relative 'hyperline/collection' require_relative 'hyperline/resources/base_resource' require_relative 'hyperline/resources/products' +require_relative 'hyperline/resources/customers' require_relative 'hyperline/resources/subscriptions' require_relative 'hyperline/resources/invoices' require_relative 'hyperline/resources/plans' diff --git a/lib/hyperline/client.rb b/lib/hyperline/client.rb index 065cf2e..f64312f 100644 --- a/lib/hyperline/client.rb +++ b/lib/hyperline/client.rb @@ -22,6 +22,10 @@ def products @products ||= Resources::Products.new(@connection) end + def customers + @customers ||= Resources::Customers.new(@connection) + end + def subscriptions @subscriptions ||= Resources::Subscriptions.new(@connection) end diff --git a/lib/hyperline/resources/customers.rb b/lib/hyperline/resources/customers.rb new file mode 100644 index 0000000..1a78427 --- /dev/null +++ b/lib/hyperline/resources/customers.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Hyperline + module Resources + class Customers < BaseResource + def features(id) + request(:get, "#{base_path}/#{id}/features") + end + + private + + def base_path + '/v1/customers' + end + end + end +end diff --git a/spec/hyperline/resources/customers_spec.rb b/spec/hyperline/resources/customers_spec.rb new file mode 100644 index 0000000..5bf3b07 --- /dev/null +++ b/spec/hyperline/resources/customers_spec.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Hyperline::Resources::Customers do + let(:client) { build_client } + let(:customers) { client.customers } + + describe '#get' do + it 'returns a customer' do + stub_api( + :get, + '/v1/customers/cus_001', + body: { + id: 'cus_001', + name: 'Vault-Tec', + billing_email: 'billing@vault-tec.com', + currency: 'EUR', + country: 'DE' + } + ) + + result = customers.get('cus_001') + + expect(result['id']).to eq('cus_001') + expect(result['billing_email']).to eq('billing@vault-tec.com') + end + + it 'raises NotFoundError on 404' do + stub_api(:get, '/v1/customers/cus_missing', status: 404, body: { message: 'Customer not found' }) + + expect { customers.get('cus_missing') }.to raise_error(Hyperline::NotFoundError) + end + end + + describe '#features' do + it 'returns the resolved feature map for a customer' do + stub_api( + :get, + '/v1/customers/cus_001/features', + body: { + features: { + expenses_core: { value: true, source: 'subscription' }, + ats_active_jobs: { value: false, source: 'default' } + } + } + ) + + result = customers.features('cus_001') + + expect(result['features']['expenses_core']['value']).to be(true) + expect(result['features']['ats_active_jobs']['value']).to be(false) + end + + it 'raises NotFoundError on 404' do + stub_api( + :get, + '/v1/customers/cus_missing/features', + status: 404, + body: { message: 'Customer not found' } + ) + + expect { customers.features('cus_missing') }.to raise_error(Hyperline::NotFoundError) + end + end +end