gds_zendesk 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/LICENCE.txt +19 -0
- data/README.md +55 -0
- data/Rakefile +14 -0
- data/gds_zendesk.gemspec +28 -0
- data/jenkins.sh +6 -0
- data/lib/gds_zendesk.rb +1 -0
- data/lib/gds_zendesk/client.rb +56 -0
- data/lib/gds_zendesk/dummy_client.rb +65 -0
- data/lib/gds_zendesk/field_mappings.rb +6 -0
- data/lib/gds_zendesk/test_helpers.rb +67 -0
- data/lib/gds_zendesk/users.rb +49 -0
- data/lib/gds_zendesk/version.rb +3 -0
- data/lib/generators/gds_zendesk/install/install_generator.rb +24 -0
- data/spec/gds_zendesk/client_spec.rb +47 -0
- data/spec/gds_zendesk/dummy_client_spec.rb +43 -0
- data/spec/gds_zendesk/users_spec.rb +60 -0
- data/spec/spec_helper.rb +3 -0
- metadata +186 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENCE.txt
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (C) 2013 HM Government (Government Digital Service)
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
8
|
+
so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# GDS Zendesk
|
2
|
+
|
3
|
+
## What is it?
|
4
|
+
|
5
|
+
`gds_zendesk` is a Ruby gem which (partially) wraps the [Zendesk REST API v2](http://developer.zendesk.com/documentation/rest_api/introduction.html).
|
6
|
+
|
7
|
+
The [zendesk_api](https://github.com/zendesk/zendesk_api_client_rb) gem is used under the covers.
|
8
|
+
|
9
|
+
## Why does it exist?
|
10
|
+
|
11
|
+
This gem has certain advantages over the `zendesk_api` gem:
|
12
|
+
|
13
|
+
* Rails integration
|
14
|
+
* A dummy Zendesk client implementation, since Zendesk doesn't provide a staging environment
|
15
|
+
* Ability to simulate error conditions
|
16
|
+
|
17
|
+
## Rails integration
|
18
|
+
|
19
|
+
### Installation
|
20
|
+
|
21
|
+
Simply add the gem to your Gemfile and bundle it up:
|
22
|
+
|
23
|
+
gem 'gds_zendesk'
|
24
|
+
|
25
|
+
Run the installation generator:
|
26
|
+
|
27
|
+
$ rails generate gds_zendesk:install
|
28
|
+
|
29
|
+
This generates an initializer at `config/initializers/gds_zendesk.rb`.
|
30
|
+
|
31
|
+
### Configuration
|
32
|
+
|
33
|
+
#### Mandatory settings
|
34
|
+
|
35
|
+
This gem needs to be configured with a Zendesk username and password before it can be used.
|
36
|
+
These are set in `config/initializers/gds_zendesk.rb`
|
37
|
+
|
38
|
+
#### Enabling development mode
|
39
|
+
|
40
|
+
Because Zendesk doesn't provide a staging environment, it is advised to use the development mode
|
41
|
+
during development and testing. When this mode is enabled:
|
42
|
+
* the real Zendesk client is replaced by an interface-equivalent dummy implementation (which makes no network calls)
|
43
|
+
* ticket creation failures can be simulated by including `break_zendesk` anywhere in the ticket description
|
44
|
+
|
45
|
+
Development mode can be enabled by configuring `development_mode: true`. It is off by default.
|
46
|
+
|
47
|
+
## Usage
|
48
|
+
|
49
|
+
Invoke
|
50
|
+
|
51
|
+
```
|
52
|
+
GDSZendesk::Client.new(config_options)
|
53
|
+
```
|
54
|
+
|
55
|
+
to create a new client.
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
require "gem_publisher"
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
task :default => :spec
|
9
|
+
|
10
|
+
desc "Publish the gem"
|
11
|
+
task :publish_gem do |t|
|
12
|
+
gem = GemPublisher.publish_if_updated("gds_zendesk.gemspec", :rubygems)
|
13
|
+
puts "Published #{gem}" if gem
|
14
|
+
end
|
data/gds_zendesk.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gds_zendesk/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "gds_zendesk"
|
8
|
+
gem.version = GDSZendesk::VERSION
|
9
|
+
gem.authors = ["Jake Benilov"]
|
10
|
+
gem.email = ["benilov@gmail.com"]
|
11
|
+
gem.description = %q{Client and models for communicating with Zendesk}
|
12
|
+
gem.summary = %q{Client and models for communicating with Zendesk}
|
13
|
+
gem.homepage = "https://github.com/alphagov/gds_zendesk"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'null_logger', '0.0.1'
|
21
|
+
gem.add_dependency 'zendesk_api', '1.0.2'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'rake', '10.0.3'
|
24
|
+
gem.add_development_dependency 'rspec', '2.12.0'
|
25
|
+
gem.add_development_dependency 'gem_publisher', '1.2.0'
|
26
|
+
gem.add_development_dependency 'faraday_middleware', '0.8.8' # had to pin for gem resolution to work on Jenkins
|
27
|
+
gem.add_development_dependency "webmock", '1.9.0'
|
28
|
+
end
|
data/jenkins.sh
ADDED
data/lib/gds_zendesk.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "gds_zendesk/version"
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'null_logger'
|
3
|
+
require 'zendesk_api'
|
4
|
+
|
5
|
+
require 'gds_zendesk/users'
|
6
|
+
|
7
|
+
module GDSZendesk
|
8
|
+
class Client
|
9
|
+
extend Forwardable
|
10
|
+
def_delegators :@zendesk_client, :ticket
|
11
|
+
|
12
|
+
attr_accessor :config_options
|
13
|
+
|
14
|
+
def initialize(config_options)
|
15
|
+
@config_options = defaults.merge(config_options)
|
16
|
+
@zendesk_client = build
|
17
|
+
end
|
18
|
+
|
19
|
+
def users
|
20
|
+
Users.new(@zendesk_client)
|
21
|
+
end
|
22
|
+
|
23
|
+
def build
|
24
|
+
check_that_username_and_password_are_provided
|
25
|
+
|
26
|
+
ZendeskAPI::Client.new { |config|
|
27
|
+
config.url = "https://govuk.zendesk.com/api/v2/"
|
28
|
+
config.username = username
|
29
|
+
config.password = password
|
30
|
+
config.logger = logger
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def logger
|
36
|
+
@config_options[:logger] || @config_options["logger"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_that_username_and_password_are_provided
|
40
|
+
raise ArgumentError, "Zendesk username not provided" if username.nil?
|
41
|
+
raise ArgumentError, "Zendesk password not provided" if password.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def username
|
45
|
+
@config_options[:username] || @config_options["username"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def password
|
49
|
+
@config_options[:password] || @config_options["password"]
|
50
|
+
end
|
51
|
+
|
52
|
+
def defaults
|
53
|
+
{ logger: NullLogger.instance }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'null_logger'
|
2
|
+
require 'gds_zendesk/field_mappings'
|
3
|
+
require 'zendesk_api/error'
|
4
|
+
|
5
|
+
module GDSZendesk
|
6
|
+
class DummyClient
|
7
|
+
attr_reader :ticket, :users
|
8
|
+
|
9
|
+
def initialize(options)
|
10
|
+
@logger = options[:logger] || NullLogger.instance
|
11
|
+
@ticket = DummyTicket.new(@logger)
|
12
|
+
@users = DummyUsers.new(@logger)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class DummyTicket
|
17
|
+
attr_reader :options
|
18
|
+
|
19
|
+
def initialize(logger)
|
20
|
+
@logger = logger
|
21
|
+
end
|
22
|
+
|
23
|
+
def create!(options)
|
24
|
+
@options = options
|
25
|
+
if should_raise_error?
|
26
|
+
@logger.info("Simulating Zendesk ticket creation failure: #{options.inspect}")
|
27
|
+
raise ZendeskAPI::Error::RecordInvalid.new(body: {"details" => "sample error message from Zendesk"})
|
28
|
+
else
|
29
|
+
@logger.info("Zendesk ticket created: #{options.inspect}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
def should_raise_error?
|
35
|
+
description =~ /break_zendesk/ or comment =~ /break_zendesk/
|
36
|
+
end
|
37
|
+
|
38
|
+
def description
|
39
|
+
@options[:description]
|
40
|
+
end
|
41
|
+
|
42
|
+
def comment
|
43
|
+
@options[:comment][:value] unless @options[:comment].nil?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class DummyUsers
|
48
|
+
def initialize(logger)
|
49
|
+
@logger = logger
|
50
|
+
end
|
51
|
+
|
52
|
+
def search(attributes)
|
53
|
+
[]
|
54
|
+
end
|
55
|
+
|
56
|
+
def suspended?(user_email)
|
57
|
+
false
|
58
|
+
end
|
59
|
+
|
60
|
+
def create!(new_user_attributes)
|
61
|
+
@created_user_attributes = new_user_attributes
|
62
|
+
@logger.info("Zendesk user created: #{new_user_attributes.inspect}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module GDSZendesk
|
4
|
+
module TestHelpers
|
5
|
+
def zendesk_has_no_user_with_email(email)
|
6
|
+
stub_request(:get, "#{zendesk_endpoint}/users/search?query=#{email}").
|
7
|
+
to_return(body: {users: [], previous_page: nil, next_page: nil, count: 0}.to_json,
|
8
|
+
headers: {'Content-Type' => 'application/json'})
|
9
|
+
end
|
10
|
+
|
11
|
+
def zendesk_has_user(user_details)
|
12
|
+
stub_request(:get, "#{zendesk_endpoint}/users/search?query=#{user_details[:email]}").
|
13
|
+
to_return(body: {users: [user_details], previous_page: nil, next_page: nil, count: 1}.to_json,
|
14
|
+
headers: {'Content-Type' => 'application/json'})
|
15
|
+
end
|
16
|
+
|
17
|
+
def stub_zendesk_user_creation(user_properties = nil)
|
18
|
+
stub = stub_http_request(:post, "#{zendesk_endpoint}/users")
|
19
|
+
stub.with(body: {user: user_properties}) unless user_properties.nil?
|
20
|
+
stub.to_return(status: 201, body: { user: { id: 12345, name: "abc" }})
|
21
|
+
end
|
22
|
+
|
23
|
+
def stub_zendesk_ticket_creation(ticket_properties = nil)
|
24
|
+
stub = stub_http_request(:post, "#{zendesk_endpoint}/tickets")
|
25
|
+
stub.with(body: {ticket: ticket_properties}) unless ticket_properties.nil?
|
26
|
+
stub.to_return(status: 201, body: { ticket: { id: 12345 }})
|
27
|
+
end
|
28
|
+
|
29
|
+
def stub_zendesk_ticket_creation_with_body(body)
|
30
|
+
stub_http_request(:post, "#{zendesk_endpoint}/tickets").
|
31
|
+
with(body: body).
|
32
|
+
to_return(status: 201, body: { ticket: { id: 12345 }})
|
33
|
+
end
|
34
|
+
|
35
|
+
def stub_zendesk_user_update(user_id, user_properties)
|
36
|
+
stub_http_request(:put, "#{zendesk_endpoint}/users/#{user_id}").
|
37
|
+
with(body: {user: user_properties}).
|
38
|
+
to_return(status: 201, body: { user: { id: 12345, name: "abc" }})
|
39
|
+
end
|
40
|
+
|
41
|
+
def zendesk_is_unavailable
|
42
|
+
stub_request(:any, /#{zendesk_endpoint}\/.*/).to_return(status: 503)
|
43
|
+
end
|
44
|
+
|
45
|
+
def zendesk_endpoint
|
46
|
+
"https://#{valid_zendesk_credentials["username"]}:#{valid_zendesk_credentials["password"]}@govuk.zendesk.com/api/v2"
|
47
|
+
end
|
48
|
+
|
49
|
+
def valid_zendesk_credentials=(credentials)
|
50
|
+
@zendesk_credentials = credentials
|
51
|
+
end
|
52
|
+
|
53
|
+
def valid_zendesk_credentials
|
54
|
+
@zendesk_credentials || { "username" => "abc", "password" => "def" }
|
55
|
+
end
|
56
|
+
|
57
|
+
def assert_created_ticket_has(ticket_options)
|
58
|
+
assert_requested :post, %r{/api/v2/tickets},
|
59
|
+
body: { ticket: hash_including(ticket_options) }, times: 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def assert_created_ticket_has_requester(requester_options)
|
63
|
+
assert_requested :post, %r{/api/v2/tickets},
|
64
|
+
body: { ticket: hash_including(requester: hash_including(requester_options)) }, times: 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module GDSZendesk
|
2
|
+
class Users
|
3
|
+
def initialize(client)
|
4
|
+
@client = client
|
5
|
+
end
|
6
|
+
|
7
|
+
def create_or_update_user(requested_user)
|
8
|
+
existing_users = find_by_email(requested_user.email)
|
9
|
+
if existing_users.empty?
|
10
|
+
create(requested_user)
|
11
|
+
else
|
12
|
+
existing_user_in_zendesk = existing_users.first
|
13
|
+
update(existing_user_in_zendesk, requested_user)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def suspended?(user_email)
|
18
|
+
existing_users = find_by_email(user_email)
|
19
|
+
if existing_users.empty?
|
20
|
+
false
|
21
|
+
else
|
22
|
+
existing_user_in_zendesk = existing_users.first
|
23
|
+
existing_user_in_zendesk["suspended"]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def find_by_email(email)
|
29
|
+
@client.users.search(query: email).to_a
|
30
|
+
end
|
31
|
+
|
32
|
+
def create(requested_user)
|
33
|
+
@client.users.create!(email: requested_user.email,
|
34
|
+
name: requested_user.name,
|
35
|
+
details: "Job title: #{requested_user.job}",
|
36
|
+
phone: requested_user.phone,
|
37
|
+
verified: true)
|
38
|
+
end
|
39
|
+
|
40
|
+
def update(existing_user_in_zendesk, requested_user)
|
41
|
+
existing_user_in_zendesk.update(details: "Job title: #{requested_user.job}")
|
42
|
+
if !requested_user.phone.nil? && !requested_user.phone.empty?
|
43
|
+
existing_user_in_zendesk.update(phone: requested_user.phone)
|
44
|
+
end
|
45
|
+
existing_user_in_zendesk.save
|
46
|
+
existing_user_in_zendesk
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
INITIALIZER = <<END
|
2
|
+
require 'yaml'
|
3
|
+
require 'gds_zendesk/client'
|
4
|
+
require 'gds_zendesk/dummy_client'
|
5
|
+
|
6
|
+
GDS_ZENDESK_CLIENT = if Rails.env.development? || Rails.env.test?
|
7
|
+
GDSZendesk::DummyClient.new(logger: Rails.logger)
|
8
|
+
else
|
9
|
+
config_yaml_file = File.join(Rails.root, 'config', 'zendesk.yml')
|
10
|
+
config = YAML.load_file(config_yaml_file)[Rails.env]
|
11
|
+
GDSZendesk::Client.new(username: config['username'], password: config['password'], logger: Rails.logger)
|
12
|
+
end
|
13
|
+
END
|
14
|
+
|
15
|
+
# This module name is slightly differently capitalised to the main library module
|
16
|
+
# The reason for this is that the module name is used by Rails within the
|
17
|
+
# generator CLI tools, and the tools get confused if the module is called GDSZendesk
|
18
|
+
module GdsZendesk
|
19
|
+
class InstallGenerator < Rails::Generators::Base
|
20
|
+
def create_initializer_file
|
21
|
+
initializer "gds_zendesk.rb", INITIALIZER
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'gds_zendesk/test_helpers'
|
3
|
+
require 'gds_zendesk/client'
|
4
|
+
require 'null_logger'
|
5
|
+
|
6
|
+
module GDSZendesk
|
7
|
+
describe Client do
|
8
|
+
include GDSZendesk::TestHelpers
|
9
|
+
|
10
|
+
def valid_credentials
|
11
|
+
{ "username" => "user", "password" => "pass" }
|
12
|
+
end
|
13
|
+
|
14
|
+
def client(options = {})
|
15
|
+
Client.new(valid_credentials.merge(options))
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should raise an error if no username is provided" do
|
19
|
+
lambda { Client.new(password: "abc") }.should raise_error(ArgumentError,
|
20
|
+
/username not provided/)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise an error if no password is provided" do
|
24
|
+
lambda { Client.new(username: "abc") }.should raise_error(ArgumentError,
|
25
|
+
/password not provided/)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should use a null logger if no logger has been provided" do
|
29
|
+
client.config_options[:logger].should be_an_instance_of(NullLogger::Logger)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should use the passed logger if one has been provided" do
|
33
|
+
custom_logger = stub("logger")
|
34
|
+
|
35
|
+
client(logger: custom_logger).config_options[:logger].should eq(custom_logger)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should raise tickets in Zendesk" do
|
39
|
+
self.valid_zendesk_credentials = valid_credentials
|
40
|
+
post_stub = stub_zendesk_ticket_creation(some: "data")
|
41
|
+
|
42
|
+
client.ticket.create(some: "data")
|
43
|
+
|
44
|
+
post_stub.should have_been_requested
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'gds_zendesk/dummy_client'
|
2
|
+
|
3
|
+
module GDSZendesk
|
4
|
+
describe DummyClient do
|
5
|
+
context "when a ticket has been raised" do
|
6
|
+
let(:ticket_options) { { opt1: "val1" } }
|
7
|
+
|
8
|
+
it "should log the ticket details" do
|
9
|
+
logger = stub("logger")
|
10
|
+
logger.should_receive(:info).with("Zendesk ticket created: #{ticket_options.inspect}")
|
11
|
+
|
12
|
+
client = DummyClient.new(logger: logger)
|
13
|
+
client.ticket.create!(ticket_options)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "can simulate failures, triggered by a specific description or comment" do
|
17
|
+
logger = mock("logger")
|
18
|
+
client = DummyClient.new(logger: logger)
|
19
|
+
logger.should_receive(:info).with(/Simulating Zendesk ticket creation failure/).twice
|
20
|
+
|
21
|
+
lambda {
|
22
|
+
client.ticket.create!(description: "break_zendesk")
|
23
|
+
}.should raise_error(ZendeskAPI::Error::RecordInvalid)
|
24
|
+
|
25
|
+
lambda {
|
26
|
+
client.ticket.create!(comment: { value: "break_zendesk" })
|
27
|
+
}.should raise_error(ZendeskAPI::Error::RecordInvalid)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when a user has been created" do
|
32
|
+
let(:created_user_options) { { email: "a@b.com" } }
|
33
|
+
|
34
|
+
it "should log the user details" do
|
35
|
+
logger = stub("logger")
|
36
|
+
logger.should_receive(:info).with("Zendesk user created: #{created_user_options.inspect}")
|
37
|
+
|
38
|
+
client = DummyClient.new(logger: logger)
|
39
|
+
client.users.create!(created_user_options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'gds_zendesk/client'
|
4
|
+
require 'gds_zendesk/users'
|
5
|
+
require 'gds_zendesk/test_helpers'
|
6
|
+
|
7
|
+
module GDSZendesk
|
8
|
+
describe Users do
|
9
|
+
include GDSZendesk::TestHelpers
|
10
|
+
|
11
|
+
let(:users) { Client.new(valid_zendesk_credentials).users }
|
12
|
+
|
13
|
+
context "existing users" do
|
14
|
+
before do
|
15
|
+
zendesk_has_user(email: "test@test.com", id: 123)
|
16
|
+
end
|
17
|
+
|
18
|
+
context "creating/updating a user" do
|
19
|
+
it "should update the phone and job title if those are set" do
|
20
|
+
stub_post = stub_zendesk_user_update(123, phone: "12345", details: "Job title: Developer")
|
21
|
+
users.create_or_update_user(stub("requested user", email: "test@test.com", phone: "12345", job: "Developer"))
|
22
|
+
|
23
|
+
stub_post.should have_been_requested
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should know whether the user is suspended or not" do
|
28
|
+
zendesk_has_user(email: "test@test.com", id: 123, suspended: "true")
|
29
|
+
users.suspended?("test@test.com").should be_true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "non-existent users" do
|
34
|
+
before do
|
35
|
+
zendesk_has_no_user_with_email("test@test.com")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not be suspended" do
|
39
|
+
users.should_not be_suspended("test@test.com")
|
40
|
+
end
|
41
|
+
|
42
|
+
context "creating/updating" do
|
43
|
+
it "should create that user" do
|
44
|
+
stub_post = stub_zendesk_user_creation(
|
45
|
+
verified: true,
|
46
|
+
name: "Abc",
|
47
|
+
email: "test@test.com",
|
48
|
+
phone: "12345",
|
49
|
+
details: "Job title: Developer"
|
50
|
+
)
|
51
|
+
user_being_requested = stub("requested user",
|
52
|
+
name: "Abc", email: "test@test.com", phone: "12345", job: "Developer")
|
53
|
+
|
54
|
+
users.create_or_update_user(user_being_requested)
|
55
|
+
stub_post.should have_been_requested
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gds_zendesk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jake Benilov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-01-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: null_logger
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.0.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: zendesk_api
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - '='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 10.0.3
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.0.3
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - '='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.12.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.12.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: gem_publisher
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.2.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.2.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: faraday_middleware
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.8.8
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.8.8
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: webmock
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.9.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - '='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.9.0
|
126
|
+
description: Client and models for communicating with Zendesk
|
127
|
+
email:
|
128
|
+
- benilov@gmail.com
|
129
|
+
executables: []
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- .gitignore
|
134
|
+
- Gemfile
|
135
|
+
- LICENCE.txt
|
136
|
+
- README.md
|
137
|
+
- Rakefile
|
138
|
+
- gds_zendesk.gemspec
|
139
|
+
- jenkins.sh
|
140
|
+
- lib/gds_zendesk.rb
|
141
|
+
- lib/gds_zendesk/client.rb
|
142
|
+
- lib/gds_zendesk/dummy_client.rb
|
143
|
+
- lib/gds_zendesk/field_mappings.rb
|
144
|
+
- lib/gds_zendesk/test_helpers.rb
|
145
|
+
- lib/gds_zendesk/users.rb
|
146
|
+
- lib/gds_zendesk/version.rb
|
147
|
+
- lib/generators/gds_zendesk/install/install_generator.rb
|
148
|
+
- spec/gds_zendesk/client_spec.rb
|
149
|
+
- spec/gds_zendesk/dummy_client_spec.rb
|
150
|
+
- spec/gds_zendesk/users_spec.rb
|
151
|
+
- spec/spec_helper.rb
|
152
|
+
homepage: https://github.com/alphagov/gds_zendesk
|
153
|
+
licenses: []
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options: []
|
156
|
+
require_paths:
|
157
|
+
- lib
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
+
none: false
|
160
|
+
requirements:
|
161
|
+
- - ! '>='
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
hash: 4508364526887278478
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
169
|
+
requirements:
|
170
|
+
- - ! '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
hash: 4508364526887278478
|
176
|
+
requirements: []
|
177
|
+
rubyforge_project:
|
178
|
+
rubygems_version: 1.8.23
|
179
|
+
signing_key:
|
180
|
+
specification_version: 3
|
181
|
+
summary: Client and models for communicating with Zendesk
|
182
|
+
test_files:
|
183
|
+
- spec/gds_zendesk/client_spec.rb
|
184
|
+
- spec/gds_zendesk/dummy_client_spec.rb
|
185
|
+
- spec/gds_zendesk/users_spec.rb
|
186
|
+
- spec/spec_helper.rb
|