diff --git a/app/controllers/api/hub_spot_controller.rb b/app/controllers/api/hub_spot_controller.rb
index 0775bdc..54a6141 100644
--- a/app/controllers/api/hub_spot_controller.rb
+++ b/app/controllers/api/hub_spot_controller.rb
@@ -3,7 +3,7 @@ class Api::HubSpotController < ApplicationController
def create
inquiry = Inquiry.find(params[:inquiry_id])
- HubSpotService.move(inquiry)
+ HubSpotService.send(inquiry)
inquiry.notes.create(body: "This inquiry was exported to HubSpot", creator: current_user)
render json: { message: 'Successfully added to HubSpot' }
rescue => error
diff --git a/app/controllers/api/inquiries_controller.rb b/app/controllers/api/inquiries_controller.rb
index 0716927..484019d 100644
--- a/app/controllers/api/inquiries_controller.rb
+++ b/app/controllers/api/inquiries_controller.rb
@@ -5,7 +5,7 @@ class Api::InquiriesController < ApplicationController
def create
if @office_provider_inquiry
- HubSpotService.move(params[:inquiry])
+ HubSpotService.send(params[:inquiry])
render json: { message: 'Thanks for your answers! We\'ll be in touch' } and return
else
inquiry = Inquiry.create(inquiry_params)
diff --git a/app/models/inquiry.rb b/app/models/inquiry.rb
index 989fd40..f480286 100644
--- a/app/models/inquiry.rb
+++ b/app/models/inquiry.rb
@@ -48,7 +48,7 @@ def aasm_event_failed(event_name, old_state_name)
after_create :send_notifications
- enum office_type: { office: 1, open_space: 2, combined: 3 }
+ enum office_type: { office_space: 1, office_room: 2, fixed_space: 3, flexible_space: 4 }
enum inquiry_status: { pending: 1, started: 2, done: 3 }
enum flexible: { yes: 1, no: 2, mixed: 3 }
enum start_date: { now: 1, quarter: 2, unsure: 3 }
diff --git a/app/services/hub_spot_service.rb b/app/services/hub_spot_service.rb
index 1df1ada..1f93445 100644
--- a/app/services/hub_spot_service.rb
+++ b/app/services/hub_spot_service.rb
@@ -1,9 +1,9 @@
module HubSpotService
@api_key = Rails.application.credentials.dig(:hub_spot, :api_key)
- def self.move(inquiry)
+ def self.send(inquiry)
inquiry = OpenStruct.new(inquiry) unless inquiry.is_a?(Inquiry)
- contact = create_contact(inquiry)
- id = JSON.parse(contact.body)['vid']
+ contact = find_or_create_contact(inquiry)
+ id = contact[:vid]
note = if inquiry.try(:officeProvider).nil?
format_note(inquiry)
else
@@ -14,16 +14,27 @@ def self.move(inquiry)
true
end
- def self.create_contact(inquiry)
- RestClient.post(
- "https://api.hubapi.com/contacts/v1/contact?hapikey=#{@api_key}",
- {
- properties: [
- { property: 'email', value: inquiry.email },
- { property: 'phone', value: inquiry.phone }
- ]
- }.to_json, { content_type: :json, accept: :json }
- )
+ def self.find_or_create_contact(inquiry)
+ data = format_data(inquiry)
+ begin
+ contact = JSON.parse(
+ RestClient.get("https://api.hubapi.com/contacts/v1/contact/email/#{inquiry.email}/profile?hapikey=#{@api_key}")
+ ).symbolize_keys
+ rescue StandardError => e
+ contact = JSON.parse(e.response.body).symbolize_keys
+ end
+ if contact[:status] != 'error'
+ RestClient.post(
+ "https://api.hubapi.com/contacts/v1/contact/vid/#{contact[:vid]}/profile?hapikey=#{@api_key}",
+ data.to_json, { content_type: :json, accept: :json }
+ )
+ else
+ RestClient.post(
+ "https://api.hubapi.com/contacts/v1/contact?hapikey=#{@api_key}",
+ data.to_json, { content_type: :json, accept: :json }
+ )
+ end
+ contact
end
def self.create_note(note, id, timestamp)
@@ -70,4 +81,15 @@ def self.format_rent_out_note(inquiry)
Notes: #{inquiry.notes}
"
end
+
+ def self.format_data(inquiry)
+ data = {
+ properties: [
+ { property: 'email', value: inquiry.email },
+ { property: 'phone', value: inquiry.phone }
+ ]
+ }
+ inquiry.try(:name).try(:present?) && data[:properties].push({ property: 'firstname', value: inquiry.name })
+ data
+ end
end
diff --git a/spec/fixtures/files/contact_hub_spot_found.json b/spec/fixtures/files/contact_hub_spot_found.json
new file mode 100644
index 0000000..529428d
--- /dev/null
+++ b/spec/fixtures/files/contact_hub_spot_found.json
@@ -0,0 +1,713 @@
+{
+ "vid": 1251,
+ "canonical-vid": 1251,
+ "merged-vids": [],
+ "portal-id": 20246979,
+ "is-contact": true,
+ "properties": {
+ "hs_is_unworked": {
+ "value": "false",
+ "versions": [
+ {
+ "value": "false",
+ "source-type": "CALCULATED",
+ "source-id": "CalculatedPropertyComputer",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583806,
+ "selected": false
+ },
+ {
+ "value": "true",
+ "source-type": "CALCULATED",
+ "source-id": "CalculatedPropertyComputer",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "firstname": {
+ "value": "Thomas",
+ "versions": [
+ {
+ "value": "Thomas",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "associatedcompanyid": {
+ "value": "6247765371",
+ "versions": [
+ {
+ "value": "6247765371",
+ "source-type": "CALCULATED",
+ "source-id": "RollupProperties",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331610,
+ "selected": false
+ }
+ ]
+ },
+ "num_unique_conversion_events": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 0,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_revenue": {
+ "value": "0.0",
+ "versions": [
+ {
+ "value": "0.0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_social_num_broadcast_clicks": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "createdate": {
+ "value": "1625820331142",
+ "versions": [
+ {
+ "value": "1625820331142",
+ "source-type": "CONTACTS",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_num_visits": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_social_linkedin_clicks": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hubspot_owner_id": {
+ "value": "84375625",
+ "versions": [
+ {
+ "value": "84375625",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "num_contacted_notes": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ENGAGEMENTS",
+ "source-id": "ObjectPropertyUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583792,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_source": {
+ "value": "OFFLINE",
+ "versions": [
+ {
+ "value": "OFFLINE",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_email_domain": {
+ "value": "craftacademy.se",
+ "versions": [
+ {
+ "value": "craftacademy.se",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_num_page_views": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_all_owner_ids": {
+ "value": "84375625",
+ "versions": [
+ {
+ "value": "84375625",
+ "source-type": "CALCULATED",
+ "source-id": "PermissionsUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332102,
+ "selected": false
+ }
+ ]
+ },
+ "hs_count_is_worked": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "CALCULATED",
+ "source-id": "CalculatedPropertyComputer",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "email": {
+ "value": "thomas@craftacademy.se",
+ "versions": [
+ {
+ "value": "thomas@craftacademy.se",
+ "source-type": "CONTACTS",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "notes_last_updated": {
+ "value": "1625822580238",
+ "versions": [
+ {
+ "value": "1625822580238",
+ "source-type": "ENGAGEMENTS",
+ "source-id": "ObjectPropertyUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583792,
+ "selected": false
+ }
+ ]
+ },
+ "lastmodifieddate": {
+ "value": "1625822583806",
+ "versions": [
+ {
+ "value": "1625822583806",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583806,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_first_timestamp": {
+ "value": "1625820331070",
+ "versions": [
+ {
+ "value": "1625820331070",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_social_google_plus_clicks": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_lifecyclestage_subscriber_date": {
+ "value": "1625820331070",
+ "versions": [
+ {
+ "value": "1625820331070",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "hs_user_ids_of_all_owners": {
+ "value": "25179223",
+ "versions": [
+ {
+ "value": "25179223",
+ "source-type": "CALCULATED",
+ "source-id": "PermissionsUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332102,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_average_page_views": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_all_contact_vids": {
+ "value": "1251",
+ "versions": [
+ {
+ "value": "1251",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331189,
+ "selected": false
+ }
+ ]
+ },
+ "lastname": {
+ "value": "Ochman",
+ "versions": [
+ {
+ "value": "Ochman",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "hs_social_facebook_clicks": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_is_contact": {
+ "value": "true",
+ "versions": [
+ {
+ "value": "true",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331194,
+ "selected": false
+ }
+ ]
+ },
+ "hubspot_owner_assigneddate": {
+ "value": "1625820331070",
+ "versions": [
+ {
+ "value": "1625820331070",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "num_conversion_events": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "hs_object_id": {
+ "value": "1251",
+ "versions": [
+ {
+ "value": "1251",
+ "source-type": "CALCULATED",
+ "source-id": null,
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_num_event_completions": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_social_twitter_clicks": {
+ "value": "0",
+ "versions": [
+ {
+ "value": "0",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_source_data_2": {
+ "value": "userId:25179223",
+ "versions": [
+ {
+ "value": "userId:25179223",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "hs_analytics_source_data_1": {
+ "value": "CONTACTS",
+ "versions": [
+ {
+ "value": "CONTACTS",
+ "source-type": "ANALYTICS",
+ "source-id": "ContactAnalyticsDetailsUpdateWorker",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820332117,
+ "selected": false
+ }
+ ]
+ },
+ "lifecyclestage": {
+ "value": "subscriber",
+ "versions": [
+ {
+ "value": "subscriber",
+ "source-type": "CRM_UI",
+ "source-id": "userId:25179223",
+ "source-label": null,
+ "updated-by-user-id": 25179223,
+ "timestamp": 1625820331070,
+ "selected": false
+ }
+ ]
+ },
+ "hs_sales_email_last_replied": {
+ "value": "1625822580238",
+ "versions": [
+ {
+ "value": "1625822580238",
+ "source-type": "ENGAGEMENTS",
+ "source-id": "ObjectPropertyUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583792,
+ "selected": false
+ }
+ ]
+ },
+ "num_notes": {
+ "value": "1",
+ "versions": [
+ {
+ "value": "1",
+ "source-type": "ENGAGEMENTS",
+ "source-id": "ObjectPropertyUpdater",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625822583792,
+ "selected": false
+ }
+ ]
+ },
+ "hs_count_is_unworked": {
+ "value": "1",
+ "versions": [
+ {
+ "value": "1",
+ "source-type": "CALCULATED",
+ "source-id": "CalculatedPropertyComputer",
+ "source-label": null,
+ "updated-by-user-id": null,
+ "timestamp": 1625820331142,
+ "selected": false
+ }
+ ]
+ }
+ },
+ "form-submissions": [],
+ "list-memberships": [],
+ "identity-profiles": [
+ {
+ "vid": 1251,
+ "saved-at-timestamp": 1625820331194,
+ "deleted-changed-timestamp": 0,
+ "identities": [
+ {
+ "type": "EMAIL",
+ "value": "thomas@craftacademy.se",
+ "timestamp": 1625820331142,
+ "is-primary": true
+ },
+ {
+ "type": "LEAD_GUID",
+ "value": "97e59193-4eb8-408b-9daa-91307c6d623a",
+ "timestamp": 1625820331189
+ }
+ ]
+ }
+ ],
+ "merge-audits": [],
+ "associated-company": {
+ "company-id": 6247765371,
+ "portal-id": 20246979,
+ "properties": {
+ "country": {
+ "value": "Sweden"
+ },
+ "city": {
+ "value": "Göteborg"
+ },
+ "num_associated_contacts": {
+ "value": "1"
+ },
+ "timezone": {
+ "value": "Europe/Stockholm"
+ },
+ "facebook_company_page": {
+ "value": "https://facebook.com/craftacademysweden"
+ },
+ "createdate": {
+ "value": "1623832057959"
+ },
+ "description": {
+ "value": "Vill du kunna bygga nästa Uber eller Airbnb? Det handlar inte bara om att ha en bra idé - det handlar även om att KUNNA förverkliga den. Makers Academys unika utbildning ger dig det du behöver för att kunna skapa, utveckla och sjösätta webbaserade tjän..."
+ },
+ "hs_num_blockers": {
+ "value": "0"
+ },
+ "web_technologies": {
+ "value": "apache;ubuntu;typeform;facebook_connect;google_analytics;google_apps;facebook_advertiser"
+ },
+ "numberofemployees": {
+ "value": "10"
+ },
+ "hs_analytics_num_visits": {
+ "value": "0"
+ },
+ "linkedin_company_page": {
+ "value": "https://www.linkedin.com/company/craftacademy"
+ },
+ "hs_analytics_source": {
+ "value": "OFFLINE"
+ },
+ "num_contacted_notes": {
+ "value": "0"
+ },
+ "founded_year": {
+ "value": "2015"
+ },
+ "hs_analytics_num_page_views": {
+ "value": "0"
+ },
+ "state": {
+ "value": "Västra Götalands län"
+ },
+ "linkedinbio": {
+ "value": "Vill du kunna bygga nästa Uber eller Airbnb? Det handlar inte bara om att ha en bra idé - det handlar även om att KUNNA förverkliga den. Makers Academys unika utbildning ger dig det du behöver för att kunna skapa, utveckla och sjösätta webbaserade tjän..."
+ },
+ "hs_num_open_deals": {
+ "value": "0"
+ },
+ "zip": {
+ "value": "41129"
+ },
+ "notes_last_updated": {
+ "value": "1625822580238"
+ },
+ "website": {
+ "value": "craftacademy.se"
+ },
+ "address": {
+ "value": "1 Holtermansgatan"
+ },
+ "hs_analytics_first_timestamp": {
+ "value": "1625820331070"
+ },
+ "first_contact_createdate": {
+ "value": "1625820331142"
+ },
+ "twitterhandle": {
+ "value": "CraftAcademySE"
+ },
+ "hs_target_account_probability": {
+ "value": "0.38625118136405945"
+ },
+ "hs_lastmodifieddate": {
+ "value": "1626091204873"
+ },
+ "hs_num_decision_makers": {
+ "value": "0"
+ },
+ "phone": {
+ "value": "+46 73 261 25 27"
+ },
+ "domain": {
+ "value": "craftacademy.se"
+ },
+ "hs_num_child_companies": {
+ "value": "0"
+ },
+ "hs_num_contacts_with_buying_roles": {
+ "value": "0"
+ },
+ "hs_object_id": {
+ "value": "6247765371"
+ },
+ "is_public": {
+ "value": "false"
+ },
+ "name": {
+ "value": "Craft Academy"
+ },
+ "hs_analytics_source_data_2": {
+ "value": "userId:25179223"
+ },
+ "hs_analytics_source_data_1": {
+ "value": "CONTACTS"
+ },
+ "hs_sales_email_last_replied": {
+ "value": "1625822580238"
+ },
+ "num_notes": {
+ "value": "1"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/fixtures/files/contact_hub_spot_not_found.json b/spec/fixtures/files/contact_hub_spot_not_found.json
new file mode 100644
index 0000000..6b01a03
--- /dev/null
+++ b/spec/fixtures/files/contact_hub_spot_not_found.json
@@ -0,0 +1,11 @@
+{
+ "status": "error",
+ "message": "contact does not exist",
+ "correlationId": "87cd9842-60b3-4999-b56b-e01cef171853",
+ "errors": [
+ {
+ "message": "The contact testingapis@hubspot.com does not exist."
+ }
+ ],
+ "category": "OBJECT_NOT_FOUND"
+}
diff --git a/spec/models/inquiry_spec.rb b/spec/models/inquiry_spec.rb
index 26334e7..eac86f8 100644
--- a/spec/models/inquiry_spec.rb
+++ b/spec/models/inquiry_spec.rb
@@ -61,7 +61,7 @@
describe 'Office type' do
it {
is_expected.to define_enum_for(:office_type)
- .with_values({ office: 1, open_space: 2, combined: 3 })
+ .with_values({ office_space: 1, office_room: 2, fixed_space: 3, flexible_space: 4 })
}
end
@@ -135,54 +135,53 @@
describe 'Pending inquiry' do
it 'is expected to be able to ":start' do
- expect{
+ expect do
pending_inquiry.start
- }
- .not_to raise_error
+ end
+ .not_to raise_error
end
it 'is expected to not be able to ":finish"' do
- expect{
+ expect do
pending_inquiry.finish
- }
- .to raise_error(StandardError)
- .with_message("You can't perform this on an inquiry that is 'pending'")
+ end
+ .to raise_error(StandardError)
+ .with_message("You can't perform this on an inquiry that is 'pending'")
end
end
describe 'Started inquiry' do
it 'is expected to be able to ":set_to_pending"' do
- expect{
+ expect do
started_inquiry.set_to_pending
- }
- .not_to raise_error
+ end
+ .not_to raise_error
end
it 'is expected to be able to "finish"' do
- expect{
+ expect do
started_inquiry.finish
- }
- .not_to raise_error
+ end
+ .not_to raise_error
end
end
describe 'Done inquiry' do
it 'is expected to not be able to ":set_to_pending"' do
- expect{
+ expect do
done_inquiry.set_to_pending
- }
- .to raise_error(StandardError)
- .with_message("You can't perform this on an inquiry that is 'done'")
+ end
+ .to raise_error(StandardError)
+ .with_message("You can't perform this on an inquiry that is 'done'")
end
it 'is expected to not be able to ":start"' do
- expect{
+ expect do
done_inquiry.start
- }
- .to raise_error(StandardError)
- .with_message("You can't perform this on an inquiry that is 'done'")
+ end
+ .to raise_error(StandardError)
+ .with_message("You can't perform this on an inquiry that is 'done'")
end
end
end
-
end
diff --git a/spec/requests/api/hub_spot/create_spec.rb b/spec/requests/api/hub_spot/create_spec.rb
index f6e246d..4f6b288 100644
--- a/spec/requests/api/hub_spot/create_spec.rb
+++ b/spec/requests/api/hub_spot/create_spec.rb
@@ -4,8 +4,18 @@
let(:broker_headers) { { HTTP_ACCEPT: 'application/json' }.merge!(credentials) }
let(:inquiry) { create(:inquiry, inquiry_status: 'started', email: 'steve@yahoo.se') }
+ before do
+ stub_request(
+ :get,
+ %r{https://api.hubapi.com/contacts/v1/contact/email}
+ ).to_return(
+ status: 200,
+ body: file_fixture('contact_hub_spot_not_found.json').read
+ )
+ end
describe 'successfully' do
before do
+
post "/api/inquiries/#{inquiry.id}/hub_spot",
headers: broker_headers
end
@@ -23,7 +33,15 @@
expect(inquiry.notes.last.body).to eq 'This inquiry was exported to HubSpot'
end
- it 'is expected to send off HubSpot request for contact' do
+ it 'is expected to send off HubSpot request for finding contact' do
+ expect(a_request(
+ :get,
+ "https://api.hubapi.com/contacts/v1/contact/email/steve@yahoo.se/profile?hapikey=#{Rails.application.credentials.dig(:hub_spot,
+ :api_key)}"
+ )).to have_been_made.times(1)
+ end
+
+ it 'is expected to send off HubSpot request for creating contact' do
expect(a_request(
:post,
"https://api.hubapi.com/contacts/v1/contact?hapikey=#{Rails.application.credentials.dig(:hub_spot,
diff --git a/spec/requests/api/inquiries/create_spec.rb b/spec/requests/api/inquiries/create_spec.rb
index e8ee756..f4ee30a 100644
--- a/spec/requests/api/inquiries/create_spec.rb
+++ b/spec/requests/api/inquiries/create_spec.rb
@@ -1,14 +1,13 @@
RSpec.describe 'POST /api/inquiries', type: :request do
+ let(:mail_delivery) { ActionMailer::Base.deliveries }
describe 'regular inquiry' do
describe 'successfully' do
- let(:mail_delivery) { ActionMailer::Base.deliveries }
-
before do
post '/api/inquiries',
params: {
inquiry: {
size: 1,
- office_type: 'office',
+ office_type: 'office_room',
inquiry_status: 'pending',
peers: 'Yes',
email: 'example@example.com',
@@ -106,7 +105,7 @@
params: {
inquiry: {
size: 1,
- office_type: 'office',
+ office_type: 'office_room',
inquiry_status: 'pending',
company: 'Craft',
peers: 'Yes',
@@ -129,9 +128,58 @@
end
end
- describe 'rent out office inquiry' do
- let(:mail_delivery) { ActionMailer::Base.deliveries }
+ describe 'rent out office inquiry for new contact' do
+ before do
+ stub_request(
+ :get,
+ %r{https://api.hubapi.com/contacts/v1/contact/email}
+ ).to_return(
+ status: 200,
+ body: file_fixture('contact_hub_spot_not_found.json').read
+ )
+ post '/api/inquiries',
+ params: {
+ inquiry: {
+ officeProvider: true,
+ name: 'Thomas',
+ phone: '031111111',
+ email: 'thomas@mail.com',
+ notes: 'I really need to get someone to share my office with',
+ language: 'en'
+ }
+ }
+ end
+
+ it 'is expected to return a 200 status' do
+ expect(response).to have_http_status 200
+ end
+
+ it 'is expected to respond with a success message' do
+ expect(response_json['message']).to eq 'Thanks for your answers! We\'ll be in touch'
+ end
+
+ it 'is expected to NOT have created a new Inquiry' do
+ expect(Inquiry.all.count).to eq 0
+ end
+ end
+
+ describe 'rent out office inquiry with email for existing user' do
before do
+ stub_request(
+ :get,
+ %r{https://api.hubapi.com/contacts/v1/contact/email}
+ ).to_return(
+ status: 404,
+ body: file_fixture('contact_hub_spot_found.json').read
+ )
+
+ stub_request(
+ :post,
+ %r{https://api.hubapi.com/contacts/v1/contact/vid}
+ ).to_return(
+ status: 204,
+ body: nil
+ )
post '/api/inquiries',
params: {
inquiry: {
diff --git a/spec/requests/api/inquiries/index_spec.rb b/spec/requests/api/inquiries/index_spec.rb
index d0d73d6..f83a960 100644
--- a/spec/requests/api/inquiries/index_spec.rb
+++ b/spec/requests/api/inquiries/index_spec.rb
@@ -21,7 +21,7 @@
end
it 'is expected to include the inquiry\'s office type' do
- expect(response_json['inquiries'].first['office_type']).to eq 'office'
+ expect(response_json['inquiries'].first['office_type']).to eq 'office_space'
end
it 'is expected to include the inquiry\'s status type' do