gds_zendesk 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|