diff --git a/lib/chartmogul.rb b/lib/chartmogul.rb index 6681795..cd7790c 100644 --- a/lib/chartmogul.rb +++ b/lib/chartmogul.rb @@ -50,6 +50,8 @@ require 'chartmogul/concerns/pageable2' require 'chartmogul/concerns/pageable_with_anchor' require 'chartmogul/concerns/pageable_with_cursor' +require 'chartmogul/concerns/auto_churn_subscription_setting' +require 'chartmogul/concerns/processing_status' require 'chartmogul/subscription' require 'chartmogul/invoice' @@ -58,6 +60,8 @@ require 'chartmogul/note' require 'chartmogul/contact' require 'chartmogul/data_source' +require 'chartmogul/data_source_settings/auto_churn_subscription_setting' +require 'chartmogul/data_source_settings/processing_status' require 'chartmogul/ping' require 'chartmogul/plan' require 'chartmogul/plan_group' diff --git a/lib/chartmogul/concerns/auto_churn_subscription_setting.rb b/lib/chartmogul/concerns/auto_churn_subscription_setting.rb new file mode 100644 index 0000000..3f504c7 --- /dev/null +++ b/lib/chartmogul/concerns/auto_churn_subscription_setting.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module ChartMogul + module Concerns + module AutoChurnSubscriptionSetting + def self.included(base) + base.send :prepend, InstanceMethods + + base.instance_eval do + readonly_attr :auto_churn_subscription_setting + end + end + + module InstanceMethods + def set_auto_churn_subscription_setting(auto_churn_subscription_setting_attributes) + @auto_churn_subscription_setting = ChartMogul::DataSourceSettings::AutoChurnSubscriptionSetting.new_from_json(auto_churn_subscription_setting_attributes) if auto_churn_subscription_setting_attributes + end + end + end + end +end diff --git a/lib/chartmogul/concerns/processing_status.rb b/lib/chartmogul/concerns/processing_status.rb new file mode 100644 index 0000000..5b7c754 --- /dev/null +++ b/lib/chartmogul/concerns/processing_status.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module ChartMogul + module Concerns + module ProcessingStatus + def self.included(base) + base.send :prepend, InstanceMethods + + base.instance_eval do + readonly_attr :processing_status + end + end + + module InstanceMethods + def set_processing_status(processing_status_attributes) + @processing_status = ChartMogul::DataSourceSettings::ProcessingStatus.new_from_json(processing_status_attributes) if processing_status_attributes + end + end + end + end +end diff --git a/lib/chartmogul/data_source.rb b/lib/chartmogul/data_source.rb index 7c31ed0..6ae71e3 100644 --- a/lib/chartmogul/data_source.rb +++ b/lib/chartmogul/data_source.rb @@ -9,6 +9,7 @@ class DataSource < APIResource readonly_attr :status readonly_attr :system readonly_attr :created_at, type: :time + readonly_attr :invoice_handling_setting writeable_attr :name @@ -17,10 +18,17 @@ class DataSource < APIResource include API::Actions::Custom include API::Actions::Destroy include API::Actions::Retrieve + include Concerns::AutoChurnSubscriptionSetting + include Concerns::ProcessingStatus def self.all(options = {}) DataSources.all(options) end + + def self.retrieve(uuid, options = {}) + path = ChartMogul::ResourcePath.new('/v1/data_sources/:uuid') + custom!(:get, path.apply_with_get_params(options.merge(uuid: uuid))) + end end class DataSources < APIResource diff --git a/lib/chartmogul/data_source_settings/auto_churn_subscription_setting.rb b/lib/chartmogul/data_source_settings/auto_churn_subscription_setting.rb new file mode 100644 index 0000000..50abe40 --- /dev/null +++ b/lib/chartmogul/data_source_settings/auto_churn_subscription_setting.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module ChartMogul + module DataSourceSettings + class AutoChurnSubscriptionSetting < ChartMogul::Object + readonly_attr :enabled + readonly_attr :interval + end + end +end diff --git a/lib/chartmogul/data_source_settings/processing_status.rb b/lib/chartmogul/data_source_settings/processing_status.rb new file mode 100644 index 0000000..a972c7d --- /dev/null +++ b/lib/chartmogul/data_source_settings/processing_status.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module ChartMogul + module DataSourceSettings + class ProcessingStatus < ChartMogul::Object + readonly_attr :processed + readonly_attr :pending + readonly_attr :failed + end + end +end diff --git a/spec/chartmogul/data_source_spec.rb b/spec/chartmogul/data_source_spec.rb index 5df6aea..3704942 100644 --- a/spec/chartmogul/data_source_spec.rb +++ b/spec/chartmogul/data_source_spec.rb @@ -44,13 +44,68 @@ expect(ds.uuid).not_to be_nil expect(ds.name).to eq('Test Data Source') - data_sources = ChartMogul::DataSource.all + data_sources = ChartMogul::DataSource.all( + with_processing_status: true, + with_auto_churn_subscription_setting: true, + with_invoice_handling_setting: true, + ) expect(data_sources.size).to eq(1) - expect(data_sources[0].uuid).to eq(ds.uuid) - expect(data_sources[0].name).to eq(ds.name) - expect(data_sources[0].created_at).to eq(ds.created_at) - expect(data_sources[0].status).to eq(ds.status) + data_source = data_sources[0] + expect(data_source.uuid).to eq(ds.uuid) + expect(data_source.name).to eq(ds.name) + expect(data_source.created_at).to eq(ds.created_at) + expect(data_source.status).to eq(ds.status) + expect(data_source.processing_status).to be_a(ChartMogul::DataSourceSettings::ProcessingStatus) + expect(data_source.processing_status.processed).to eq(12) + expect(data_source.processing_status.failed).to eq(8) + expect(data_source.processing_status.pending).to eq(37) + expect(data_source.auto_churn_subscription_setting).to be_a(ChartMogul::DataSourceSettings::AutoChurnSubscriptionSetting) + expect(data_source.auto_churn_subscription_setting.enabled).to eq(true) + expect(data_source.auto_churn_subscription_setting.interval).to eq(30) + expect(data_source.invoice_handling_setting).to be_a(Hash) + expect(data_source.invoice_handling_setting[:automatic]).to be_a(Hash) + expect(data_source.invoice_handling_setting[:automatic][:create_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:automatic][:update_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_refunded]).to eq(false) + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_voided]).to eq(true) + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_written_off]).to eq(true) + expect(data_source.invoice_handling_setting[:manual]).to be_a(Hash) + expect(data_source.invoice_handling_setting[:manual][:create_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:manual][:update_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_refunded]).to eq(false) + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_voided]).to eq(true) + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_written_off]).to eq(true) + + data_source = ChartMogul::DataSource.retrieve(ds.uuid, + with_processing_status: true, + with_auto_churn_subscription_setting: true, + with_invoice_handling_setting: true, + ) + expect(data_source.uuid).to eq(ds.uuid) + expect(data_source.name).to eq(ds.name) + expect(data_source.created_at).to eq(ds.created_at) + expect(data_source.status).to eq(ds.status) + expect(data_source.processing_status).to be_a(ChartMogul::DataSourceSettings::ProcessingStatus) + expect(data_source.processing_status.processed).to eq(12) + expect(data_source.processing_status.failed).to eq(8) + expect(data_source.processing_status.pending).to eq(37) + expect(data_source.auto_churn_subscription_setting).to be_a(ChartMogul::DataSourceSettings::AutoChurnSubscriptionSetting) + expect(data_source.auto_churn_subscription_setting.enabled).to eq(true) + expect(data_source.auto_churn_subscription_setting.interval).to eq(30) + expect(data_source.invoice_handling_setting).to be_a(Hash) + expect(data_source.invoice_handling_setting[:automatic]).to be_a(Hash) + expect(data_source.invoice_handling_setting[:automatic][:create_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:automatic][:update_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_refunded]).to eq(false) + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_voided]).to eq(true) + expect(data_source.invoice_handling_setting[:automatic][:prevent_subscription_for_invoice_written_off]).to eq(true) + expect(data_source.invoice_handling_setting[:manual]).to be_a(Hash) + expect(data_source.invoice_handling_setting[:manual][:create_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:manual][:update_subscription_when_invoice_is]).to eq('open') + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_refunded]).to eq(false) + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_voided]).to eq(true) + expect(data_source.invoice_handling_setting[:manual][:prevent_subscription_for_invoice_written_off]).to eq(true) data_sources[0].destroy! diff --git a/spec/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml b/spec/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml index 543ca96..08d77b5 100644 --- a/spec/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml +++ b/spec/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml @@ -8,7 +8,7 @@ http_interactions: string: '{"name":"Test Data Source"}' headers: User-Agent: - - Faraday v0.9.1 + - chartmogul-ruby/4.9.0 Content-Type: - application/json Authorization: @@ -16,129 +16,113 @@ http_interactions: response: status: code: 201 - message: + message: Created headers: - server: - - nginx/1.9.10 date: - - Sun, 05 Jun 2016 17:02:43 GMT + - Tue, 02 Dec 2025 09:32:26 GMT content-type: - - application/json; charset=utf-8 - transfer-encoding: - - chunked + - application/json + content-length: + - '150' connection: - - close - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - 1; mode=block - x-content-type-options: - - nosniff - etag: - - W/"2cbdc42d67c582b8b8e9b5b649142c6d" - cache-control: - - max-age=0, private, must-revalidate - x-request-id: - - 8e251145-840a-4a38-ba7c-468416d00c7a - x-runtime: - - '0.195234' - strict-transport-security: - - max-age=15768000 + - keep-alive + access-control-allow-credentials: + - 'true' body: encoding: UTF-8 - string: '{"uuid":"ds_9afd5143-3884-4977-9281-dbb5f15df461","name":"Test Data - Source","created_at":"2016-06-05T17:02:43.282Z","status":"never_imported"}' - http_version: - recorded_at: Sun, 05 Jun 2016 17:02:43 GMT + string: '{"uuid":"ds_d0b59f2a-cf61-11f0-95c7-c7391c16ed34","name":"Test Data + Source","system":"Custom","created_at":"2025-12-02T09:32:26.858Z","status":"idle"}' + recorded_at: Tue, 02 Dec 2025 09:32:26 GMT - request: method: get - uri: https://api.chartmogul.com/v1/data_sources + uri: https://api.chartmogul.com/v1/data_sources?with_auto_churn_subscription_setting=true&with_invoice_handling_setting=true&with_processing_status=true body: encoding: US-ASCII string: '' headers: User-Agent: - - Faraday v0.9.1 + - chartmogul-ruby/4.9.0 + Content-Type: + - application/json + Authorization: + - Basic hidden + response: + status: + code: 200 + message: OK + headers: + date: + - Tue, 02 Dec 2025 09:32:27 GMT + content-type: + - application/json + content-length: + - '169' + connection: + - keep-alive + access-control-allow-credentials: + - 'true' + body: + encoding: UTF-8 + string: '{"data_sources":[{"uuid":"ds_d0b59f2a-cf61-11f0-95c7-c7391c16ed34","name":"Test Data Source","system":"Custom","created_at":"2025-12-02T09:32:26.858Z","status":"idle","processing_status":{"processed":12,"failed":8,"pending":37},"auto_churn_subscription_setting":{"enabled":true,"interval":30},"invoice_handling_setting":{"manual":{"create_subscription_when_invoice_is":"open","update_subscription_when_invoice_is":"open","prevent_subscription_for_invoice_voided":true,"prevent_subscription_for_invoice_refunded":false,"prevent_subscription_for_invoice_written_off":true},"automatic":{"create_subscription_when_invoice_is":"open","update_subscription_when_invoice_is":"open","prevent_subscription_for_invoice_voided":true,"prevent_subscription_for_invoice_refunded":false,"prevent_subscription_for_invoice_written_off":true}}}]}' + recorded_at: Tue, 02 Dec 2025 09:32:27 GMT +- request: + method: get + uri: https://api.chartmogul.com/v1/data_sources/ds_d0b59f2a-cf61-11f0-95c7-c7391c16ed34?with_auto_churn_subscription_setting=true&with_invoice_handling_setting=true&with_processing_status=true + body: + encoding: UTF-8 + string: "{}" + headers: + User-Agent: + - chartmogul-ruby/4.9.0 + Content-Type: + - application/json Authorization: - Basic hidden response: status: code: 200 - message: + message: OK headers: - server: - - nginx/1.9.10 date: - - Sun, 05 Jun 2016 17:02:43 GMT + - Tue, 02 Dec 2025 09:32:27 GMT content-type: - - application/json; charset=utf-8 - transfer-encoding: - - chunked + - application/json + content-length: + - '173' connection: - - close - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - 1; mode=block - x-content-type-options: - - nosniff - etag: - - W/"8d1f4cac283a3aecfeea3e952b417e64" - cache-control: - - max-age=0, private, must-revalidate - x-request-id: - - a8ee9d0b-364e-4f70-a17f-bfb4883e6ba7 - x-runtime: - - '0.264734' - strict-transport-security: - - max-age=15768000 + - keep-alive + access-control-allow-credentials: + - 'true' body: encoding: UTF-8 - string: '{"data_sources":[{"uuid":"ds_9afd5143-3884-4977-9281-dbb5f15df461","name":"Test - Data Source","created_at":"2016-06-05T17:02:43.282Z","status":"never_imported"}]}' - http_version: - recorded_at: Sun, 05 Jun 2016 17:02:43 GMT + string: '{"uuid":"ds_d0b59f2a-cf61-11f0-95c7-c7391c16ed34","name":"Test Data Source","system":"Custom","created_at":"2025-12-02T09:32:26.858Z","status":"idle","processing_status":{"processed":12,"failed":8,"pending":37},"auto_churn_subscription_setting":{"enabled":true,"interval":30},"invoice_handling_setting":{"manual":{"create_subscription_when_invoice_is":"open","update_subscription_when_invoice_is":"open","prevent_subscription_for_invoice_voided":true,"prevent_subscription_for_invoice_refunded":false,"prevent_subscription_for_invoice_written_off":true},"automatic":{"create_subscription_when_invoice_is":"open","update_subscription_when_invoice_is":"open","prevent_subscription_for_invoice_voided":true,"prevent_subscription_for_invoice_refunded":false,"prevent_subscription_for_invoice_written_off":true}}}' + recorded_at: Tue, 02 Dec 2025 09:32:27 GMT - request: method: delete - uri: https://api.chartmogul.com/v1/data_sources/ds_9afd5143-3884-4977-9281-dbb5f15df461 + uri: https://api.chartmogul.com/v1/data_sources/ds_d0b59f2a-cf61-11f0-95c7-c7391c16ed34 body: encoding: US-ASCII string: '' headers: User-Agent: - - Faraday v0.9.1 + - chartmogul-ruby/4.9.0 Authorization: - Basic hidden response: status: code: 204 - message: + message: No Content headers: - server: - - nginx/1.9.10 date: - - Sun, 05 Jun 2016 17:02:44 GMT + - Tue, 02 Dec 2025 09:32:27 GMT connection: - - close - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - 1; mode=block - x-content-type-options: - - nosniff - cache-control: - - no-cache - x-request-id: - - 11210672-f1bf-4590-9db3-77894c7aa619 - x-runtime: - - '0.008042' - strict-transport-security: - - max-age=15768000 + - keep-alive + access-control-allow-credentials: + - 'true' body: encoding: UTF-8 string: '' - http_version: - recorded_at: Sun, 05 Jun 2016 17:02:44 GMT + recorded_at: Tue, 02 Dec 2025 09:32:27 GMT - request: method: get uri: https://api.chartmogul.com/v1/data_sources @@ -147,43 +131,28 @@ http_interactions: string: '' headers: User-Agent: - - Faraday v0.9.1 + - chartmogul-ruby/4.9.0 + Content-Type: + - application/json Authorization: - Basic hidden response: status: code: 200 - message: + message: OK headers: - server: - - nginx/1.9.10 date: - - Sun, 05 Jun 2016 17:02:54 GMT + - Tue, 02 Dec 2025 09:32:28 GMT content-type: - - application/json; charset=utf-8 - transfer-encoding: - - chunked + - application/json + content-length: + - '19' connection: - - close - x-frame-options: - - SAMEORIGIN - x-xss-protection: - - 1; mode=block - x-content-type-options: - - nosniff - etag: - - W/"fff2ed4cc06b2b7851a2db975ef7e229" - cache-control: - - max-age=0, private, must-revalidate - x-request-id: - - 1340397d-947c-4483-a970-d3707ea5d8a3 - x-runtime: - - '0.121280' - strict-transport-security: - - max-age=15768000 + - keep-alive + access-control-allow-credentials: + - 'true' body: encoding: UTF-8 string: '{"data_sources":[]}' - http_version: - recorded_at: Sun, 05 Jun 2016 17:02:54 GMT -recorded_with: VCR 3.0.3 + recorded_at: Tue, 02 Dec 2025 09:32:28 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8f2b2d9..a05b504 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,6 +8,7 @@ end require 'chartmogul' +require 'pry' require 'vcr' require 'webmock/rspec' require_relative 'support/shared_example_raises_deprecated_param_error'