adobe_connect 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in adobe_connect.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Zach Pendleton
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # AdobeConnect
2
+
3
+ This gem provides a wrapper for interacting with the Adobe Connect API that
4
+ (hopefully) sucks less than interacting with the Adobe Connect API by itself.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'adobe_connect', '0.0.1'
11
+
12
+ And then run:
13
+
14
+ $ bundle install
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install adobe_connect
19
+
20
+ ## Get started
21
+
22
+ You can get started by running `adobe_connect_console` in your terminal. This
23
+ will open up a new Pry session with all of the Connect classes loaded.
24
+
25
+ # start by configuring it with a username, password, and domain.
26
+ AdobeConnect::Config.declare do
27
+ username 'test@example.com'
28
+ password 'password'
29
+ domain 'http://connect.example.com'
30
+ end
31
+
32
+ connect = AdobeConnect::Service.new
33
+
34
+ # log in so you have a session
35
+ connect.log_in #=> true
36
+
37
+ # get crazy with your bad self
38
+ connect.principal_list(filter_login: 'test@example.com')
39
+ connect.sco_contents_by_url(url_path: '/whatever/')
40
+
41
+ ## Details
42
+
43
+ Once you've instantiated a Service instance, it has methods for all of the API
44
+ calls that Connect supports. Just replace your Connect action and parameter
45
+ name dashes with underscores. e.g. `principal-update` becomes
46
+ `principal_update` and `first-name` becomes `first_name`.
47
+
48
+ Responses are AdobeConnect::Response objects, and respond to normal Nokogiri
49
+ methods for querying XML. They also have a `fetch()` method for getting headers
50
+ and a `status` method for getting back the status code of your request.
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ t.libs.push('test')
7
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'adobe_connect/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'adobe_connect'
8
+ gem.version = AdobeConnect::VERSION
9
+ gem.authors = ['Zach Pendleton']
10
+ gem.email = ['zachpendleton@gmail.com']
11
+ gem.description = %q{An API wrapper for interacting with Adobe Connect services.}
12
+ gem.summary = %q{An API wrapper for Adobe Connect services.}
13
+ gem.homepage = 'https://github.com/zachpendleton/adobe_connect'
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 'activesupport', '>= 2.3.16'
21
+ gem.add_dependency 'nokogiri', '~> 1.5.6'
22
+ gem.add_dependency 'pry', '>= 0.9.11.4'
23
+ gem.add_dependency 'rake', '~> 10.0.3'
24
+
25
+ gem.add_development_dependency 'minitest', '~> 4.6.0'
26
+ gem.add_development_dependency 'mocha', '~> 0.13.2'
27
+ end
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+
3
+ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
4
+ bundle exec pry -r $DIR/../lib/adobe_connect.rb
@@ -0,0 +1,31 @@
1
+ module AdobeConnect
2
+ module Config
3
+
4
+ @settings = Hash.new
5
+
6
+ class << self
7
+ def merge(settings)
8
+ @settings.merge(settings)
9
+ end
10
+
11
+ def declare(&block)
12
+ instance_eval(&block)
13
+ end
14
+
15
+ def [](key)
16
+ @settings[key]
17
+ end
18
+
19
+ def []=(key, value)
20
+ @settings[key] = value
21
+ end
22
+
23
+ def settings; @settings; end
24
+
25
+ private
26
+ [:username, :password, :domain].each do |method|
27
+ define_method(method) { |value| @settings[method] = value }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ module AdobeConnect
2
+ class MeetingFolder
3
+ attr_reader :name, :id, :service, :url
4
+
5
+ def initialize(id, name, url, service = AdobeConnect::Service.new)
6
+ @name = name
7
+ @id = id
8
+ @service = service
9
+ @url = url
10
+ end
11
+
12
+ def contents
13
+ service.sco_contents(sco_id: id)
14
+ end
15
+
16
+ def self.find(name, service = AdobeConnect::Service.new)
17
+ response = service.sco_search_by_field(
18
+ query: name,
19
+ filter_type: 'folder',
20
+ field: 'name')
21
+
22
+ MeetingFolder.new(response.at_xpath('//sco').attr('sco-id'),
23
+ response.at_xpath('//name').text,
24
+ response.at_xpath('//url-path').text,
25
+ service)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,16 @@
1
+ module AdobeConnect
2
+ class ParamFormatter
3
+ attr_reader :params
4
+
5
+ def initialize(params)
6
+ @params = params
7
+ end
8
+
9
+ def format
10
+ params.inject(['']) do |array, param|
11
+ key, value = param.map { |p| ERB::Util.url_encode(p) }
12
+ array << "#{key.dasherize}=#{value}"
13
+ end.join('&')
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ module AdobeConnect
2
+ class Response
3
+ attr_reader :status, :body
4
+
5
+ def initialize(response)
6
+ @response = response
7
+ @status = response.status
8
+ @body = Nokogiri::XML(response.body)
9
+ end
10
+
11
+ def fetch(header)
12
+ @response.fetch(header)
13
+ end
14
+
15
+ def xpath(*args)
16
+ @body.xpath(*args)
17
+ end
18
+
19
+ def at_xpath(*args)
20
+ @body.at_xpath(*args)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,55 @@
1
+ module AdobeConnect
2
+ class Service
3
+ attr_reader :username, :domain, :session
4
+
5
+ def initialize(options = AdobeConnect::Config)
6
+ @username = options[:username]
7
+ @password = options[:password]
8
+ @domain = URI.parse(options[:domain])
9
+ @authenticated = false
10
+ end
11
+
12
+ def log_in
13
+ response = request('login', { login: username, password: password }, false)
14
+ if response.at_xpath('//status').attr('code') == 'ok'
15
+ @session = response.fetch('set-cookie').match(/(?<=BREEZESESSION=)[^;]+/)[0]
16
+ @authenticated = true
17
+ else
18
+ false
19
+ end
20
+ end
21
+
22
+ def authenticated?
23
+ @authenticated
24
+ end
25
+
26
+ def client
27
+ if @client.nil?
28
+ @client = Net::HTTP.new(domain.host, domain.port)
29
+ @client.use_ssl = (domain.scheme == 'https')
30
+ end
31
+
32
+ @client
33
+ end
34
+
35
+ def method_missing(method, *args)
36
+ action = method.to_s.dasherize
37
+ params = args.first
38
+
39
+ request(action, params)
40
+ end
41
+
42
+ private
43
+ attr_reader :password
44
+
45
+ def request(action, params, use_session = true)
46
+ if use_session
47
+ log_in unless authenticated?
48
+ params[:session] = session
49
+ end
50
+
51
+ query_string = ParamFormatter.new(params).format
52
+ client.get("/api/xml?action=#{action}#{query_string}")
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,19 @@
1
+ module AdobeConnect
2
+ class Session
3
+ attr_reader :service, :user
4
+
5
+ def initialize(user, service = Service.new)
6
+ @user = user
7
+ @service = service
8
+ end
9
+
10
+ def key
11
+ unless key
12
+ service.log_in
13
+ @key = service.session
14
+ end
15
+
16
+ key
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,55 @@
1
+ module AdobeConnect
2
+ class User
3
+ attr_reader :id, :canvas_user, :service, :errors
4
+
5
+ def initialize(canvas_user, service = Service.new)
6
+ @canvas_user = canvas_user
7
+ @service = service
8
+ @errors = []
9
+ end
10
+
11
+ def username
12
+ canvas_user.email
13
+ end
14
+
15
+ def password
16
+ Digest::MD5.hexdigest(@canvas_user.uuid)[0..9]
17
+ end
18
+
19
+ def save
20
+ response = service.principal_update(first_name: canvas_user.first_name,
21
+ last_name: canvas_user.last_name, login: canvas_user.email,
22
+ password: password, type: 'user', has_children: 0,
23
+ email: canvas_user.email)
24
+
25
+ if response.at_xpath('//status').attr('code') == 'ok'
26
+ true
27
+ else
28
+ save_errors(response)
29
+ false
30
+ end
31
+ end
32
+
33
+ def self.create(canvas_user)
34
+ user = AdobeConnect::User.new(canvas_user)
35
+ user.save
36
+
37
+ user
38
+ end
39
+
40
+ def self.find(canvas_user)
41
+ user = AdobeConnect::User.new(canvas_user)
42
+ response = user.service.principal_list(filter_login: user.username)
43
+
44
+ if principal = response.at_xpath('//principal')
45
+ user.instance_variable_set(:@id, principal.attr('principal-id'))
46
+ user
47
+ end
48
+ end
49
+
50
+ private
51
+ def save_errors(response)
52
+ @errors = response.xpath('//invalid').map(&:attributes)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module AdobeConnect
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,14 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+ require 'erb'
3
+ require 'net/https'
4
+ require 'nokogiri'
5
+
6
+ require 'adobe_connect/config'
7
+ require 'adobe_connect/response'
8
+ require 'adobe_connect/session'
9
+ require 'adobe_connect/service'
10
+ require 'adobe_connect/param_formatter'
11
+ require 'adobe_connect/meeting_folder'
12
+ require 'adobe_connect/user'
13
+
14
+ module AdobeConnect; end
@@ -0,0 +1,76 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ <scos>
5
+ <sco sco-id="26013" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
6
+ <name>BIG-001: Course Conference [12]</name>
7
+ <url-path>/canvas-meeting-12/</url-path>
8
+ <date-begin>2013-01-18T10:37:21.000-07:00</date-begin>
9
+ <date-created>2013-01-18T10:37:29.133-07:00</date-created>
10
+ <date-modified>2013-01-18T10:46:37.187-07:00</date-modified>
11
+ </sco>
12
+ <sco sco-id="26102" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
13
+ <name>BIOL 1550 E01: Course Conference [45]</name>
14
+ <url-path>/canvas-meeting-45/</url-path>
15
+ <date-begin>2013-01-25T14:15:19.000-07:00</date-begin>
16
+ <date-created>2013-01-25T14:15:26.890-07:00</date-created>
17
+ <date-modified>2013-01-25T14:28:36.350-07:00</date-modified>
18
+ </sco>
19
+ <sco sco-id="25917" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
20
+ <name>Discussion Copy 1: Adobe connect conference [18847]</name>
21
+ <url-path>/canvas-meeting-18847/</url-path>
22
+ <date-begin>2013-01-15T12:22:03.000-07:00</date-begin>
23
+ <date-created>2013-01-15T12:22:06.977-07:00</date-created>
24
+ <date-modified>2013-01-15T12:31:13.053-07:00</date-modified>
25
+ </sco>
26
+ <sco sco-id="26109" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
27
+ <name>ENGL 2600 E01: Course Conference [46]</name>
28
+ <url-path>/canvas-meeting-46/</url-path>
29
+ <date-begin>2013-01-25T14:15:39.000-07:00</date-begin>
30
+ <date-created>2013-01-25T14:15:47.287-07:00</date-created>
31
+ <date-modified>2013-01-25T14:27:59.050-07:00</date-modified>
32
+ </sco>
33
+ <sco sco-id="26156" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
34
+ <name>ENGL-2100: Course Conference [27]</name>
35
+ <url-path>/canvas-meeting-27/</url-path>
36
+ <date-begin>2013-01-31T15:04:53.000-07:00</date-begin>
37
+ <date-created>2013-01-31T15:05:00.680-07:00</date-created>
38
+ <date-modified>2013-01-31T15:14:11.273-07:00</date-modified>
39
+ </sco>
40
+ <sco sco-id="25924" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
41
+ <name>IE9 1/26: Course Conference [18848]</name>
42
+ <url-path>/canvas-meeting-18848/</url-path>
43
+ <date-begin>2013-01-15T12:52:08.000-07:00</date-begin>
44
+ <date-created>2013-01-15T12:52:12.113-07:00</date-created>
45
+ <date-modified>2013-01-15T12:52:12.113-07:00</date-modified>
46
+ </sco>
47
+ <sco sco-id="25930" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
48
+ <name>IE9 1/26: Group Conference [18849]</name>
49
+ <url-path>/canvas-meeting-18849/</url-path>
50
+ <date-begin>2013-01-15T14:04:35.000-07:00</date-begin>
51
+ <date-created>2013-01-15T14:04:39.303-07:00</date-created>
52
+ <date-modified>2013-01-15T14:16:56.483-07:00</date-modified>
53
+ </sco>
54
+ <sco sco-id="26096" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
55
+ <name>LTIDemo: Course Conference [44]</name>
56
+ <url-path>/canvas-meeting-44/</url-path>
57
+ <date-begin>2013-01-25T14:15:03.000-07:00</date-begin>
58
+ <date-created>2013-01-25T14:15:11.373-07:00</date-created>
59
+ <date-modified>2013-01-25T14:26:22.120-07:00</date-modified>
60
+ </sco>
61
+ <sco sco-id="26122" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
62
+ <name>LTIDemo: Course Conference [47]</name>
63
+ <url-path>/canvas-meeting-47/</url-path>
64
+ <date-begin>2013-01-25T14:17:59.000-07:00</date-begin>
65
+ <date-created>2013-01-25T14:18:06.710-07:00</date-created>
66
+ <date-modified>2013-01-25T14:29:11.300-07:00</date-modified>
67
+ </sco>
68
+ <sco sco-id="26087" source-sco-id="" folder-id="25915" type="meeting" icon="meeting" display-seq="0" duration="" is-folder="0">
69
+ <name>STC: Course Conference [19114]</name>
70
+ <url-path>/canvas-meeting-19114/</url-path>
71
+ <date-begin>2013-01-25T10:16:36.000-07:00</date-begin>
72
+ <date-created>2013-01-25T10:16:44.260-07:00</date-created>
73
+ <date-modified>2013-01-25T10:38:59.190-07:00</date-modified>
74
+ </sco>
75
+ </scos>
76
+ </results>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ <sco-search-by-field-info>
5
+ <sco sco-id="25915" account-id="7" folder-id="11004" type="folder" icon="folder" max-retries="" lang="en" display-seq="0" source-sco-id="" version="0" parent-type="-2" tree-type="6" grand-parent="7">
6
+ <name>canvas_meetings</name>
7
+ <url-path>/meeting-path/</url-path>
8
+ <date-created>2013-01-15T12:21:42.243-07:00</date-created>
9
+ <date-modified>2013-01-15T12:21:42.243-07:00</date-modified>
10
+ <recordcreated>2013-01-15T05:21:42.463-07:00</recordcreated>
11
+ <principal-name>Zach Pendleton</principal-name>
12
+ <folder-name>User Meetings</folder-name>
13
+ </sco>
14
+ </sco-search-by-field-info>
15
+ </results>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="no-data"/>
4
+ </results>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ </results>
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ <principal-list/>
5
+ </results>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ <principal-list>
5
+ <principal principal-id="26243" account-id="7" type="user" has-children="false" is-primary="false" is-hidden="false" training-group-id="">
6
+ <name>Test User</name>
7
+ <login>test@example.com</login>
8
+ <email>test@example.com</email>
9
+ <display-uid>test@example.com</display-uid>
10
+ </principal>
11
+ </principal-list>
12
+ </results>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="invalid">
4
+ <invalid field="login" type="string" subcode="range" min="1" max="60"/>
5
+ <invalid field="login" type="string" subcode="missing"/>
6
+ <invalid field="first-name" type="string" subcode="range" min="1" max="254"/>
7
+ </status>
8
+ </results>
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <results>
3
+ <status code="ok"/>
4
+ <principal has-children="0" type="user" account-id="7" principal-id="26243">
5
+ <ext-login>testinguser@example.com</ext-login>
6
+ <name>Testing User</name>
7
+ <login>testinguser@example.com</login>
8
+ </principal>
9
+ </results>
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class ConfigTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @config = AdobeConnect::Config
6
+ end
7
+
8
+ def test_bracket_notation_stores_settings
9
+ @config[:test] = true
10
+ assert @config.instance_variable_get(:@settings)[:test]
11
+ end
12
+
13
+ def test_bracket_notation_returns_settings
14
+ @config[:test] = '123'
15
+ assert_equal '123', @config[:test]
16
+ end
17
+
18
+ def test_declare_stores_a_username
19
+ @config.declare { username 'test@example.com' }
20
+ assert_equal 'test@example.com', @config[:username]
21
+ end
22
+
23
+ def test_declare_stores_a_password
24
+ @config.declare { password 'password' }
25
+ assert_equal 'password', @config[:password]
26
+ end
27
+
28
+ def test_declare_stores_a_domain
29
+ @config.declare { domain 'http://example.com' }
30
+ assert_equal 'http://example.com', @config[:domain]
31
+ end
32
+
33
+ def test_settings_returns_a_hash
34
+ assert_instance_of Hash, @config.settings
35
+ end
36
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class AdobeConnectMeetingFolderTest < MiniTest::Unit::TestCase
4
+
5
+ AdobeConnect::Config.declare do
6
+ username 'test@example.com'
7
+ password 'pwd'
8
+ domain 'http://example.com'
9
+ end
10
+
11
+ FOLDER_SUCCESS = File.read('test/fixtures/folder_success.xml')
12
+ FOLDER_CONTENTS = File.read('test/fixtures/folder_contents.xml')
13
+
14
+ def setup
15
+ @folder = AdobeConnect::MeetingFolder.new('1', 'test folder', '/test-meeting/')
16
+ end
17
+
18
+ def test_initialize_takes_a_name
19
+ assert_equal @folder.name, 'test folder'
20
+ end
21
+
22
+ def test_initialize_takes_an_id
23
+ assert_equal @folder.id, '1'
24
+ end
25
+
26
+ def test_initialize_takes_a_url
27
+ assert_equal @folder.url, '/test-meeting/'
28
+ end
29
+
30
+ def test_initialize_defaults_to_a_new_service
31
+ assert_instance_of AdobeConnect::Service, @folder.service
32
+ end
33
+
34
+ def test_find_returns_a_new_folder
35
+ response = mock(status: 200)
36
+ response.expects(:body).returns(FOLDER_SUCCESS)
37
+ ac_response = AdobeConnect::Response.new(response)
38
+
39
+ AdobeConnect::Service.any_instance.
40
+ expects(:request).
41
+ with('sco-search-by-field', query: 'canvas_meetings',
42
+ filter_type: 'folder', field: 'name').
43
+ returns(ac_response)
44
+
45
+ folder = AdobeConnect::MeetingFolder.find('canvas_meetings')
46
+
47
+ assert_instance_of AdobeConnect::MeetingFolder, folder
48
+ assert_equal folder.name, 'canvas_meetings'
49
+ assert_equal folder.id, '25915'
50
+ assert_equal folder.url, '/meeting-path/'
51
+ end
52
+
53
+ def test_contents_returns_folder_contents
54
+ response = mock(status: 200)
55
+ response.expects(:body).returns(FOLDER_CONTENTS)
56
+ ac_response = AdobeConnect::Response.new(response)
57
+ @folder.service.expects(:sco_contents).returns(ac_response)
58
+
59
+ assert_equal @folder.contents.xpath('//sco').length, 10
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class AdobeConnectParamFormatterTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ params = { a: 1, b: 'param value', 'dashed_value' => 3 }
6
+ @formatter = AdobeConnect::ParamFormatter.new(params)
7
+ @query_string = @formatter.format
8
+ end
9
+
10
+ def test_it_should_format_params_hash_to_a_string
11
+ assert_instance_of String, @query_string
12
+ end
13
+
14
+ def test_it_should_include_basic_params
15
+ assert_match Regexp.new('a=1'), @query_string
16
+ end
17
+
18
+ def test_it_should_escape_params
19
+ assert_match Regexp.new('b=param%20value'), @query_string
20
+ end
21
+
22
+ def test_it_should_dasherize_underscored_keys
23
+ assert_match Regexp.new('dashed-value'), @query_string
24
+ end
25
+
26
+ def test_it_should_include_a_leading_ampersand
27
+ assert_match Regexp.new('^&'), @query_string
28
+ end
29
+
30
+ def test_an_empty_hash_should_return_an_empty_string
31
+ assert_equal AdobeConnect::ParamFormatter.new({}).format, ''
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class AdobeConnectResponseTest < MiniTest::Unit::TestCase
4
+
5
+ TEST_HEADERS = { 'Accept' => 'application/json' }
6
+ TEST_BODY = <<-END
7
+ <?xml version="1.0" encoding="utf-8"?>
8
+ <response>
9
+ <name>Test</name>
10
+ </response>
11
+ END
12
+
13
+ def setup
14
+ response = stub(status: 200, headers: TEST_HEADERS, body: TEST_BODY)
15
+ @response = AdobeConnect::Response.new(response)
16
+ end
17
+
18
+ def test_initialize_takes_a_net_http_response
19
+ assert @response.instance_variable_get(:@response)
20
+ end
21
+
22
+ def test_initialize_creates_a_nokogiri_wrapped_body
23
+ assert_instance_of Nokogiri::XML::Document, @response.body
24
+ end
25
+
26
+ def test_response_has_a_status
27
+ assert_equal 200, @response.status
28
+ end
29
+
30
+ def test_fetch_delegates_to_response
31
+ @response.instance_variable_get(:@response).expects(:fetch).with('Accept')
32
+ @response.fetch('Accept')
33
+ end
34
+
35
+ def test_xpath_delegates_to_body
36
+ @response.body.expects(:xpath).with('//name')
37
+ @response.xpath('//name')
38
+ end
39
+
40
+ def test_at_xpath_delegates_to_body
41
+ @response.body.expects(:at_xpath).with('//name')
42
+ @response.at_xpath('//name')
43
+ end
44
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class AdobeConnectServiceTest < MiniTest::Unit::TestCase
4
+ LOGIN_SUCCESS = File.read('test/fixtures/log_in_success.xml')
5
+ LOGIN_FAIL = File.read('test/fixtures/log_in_fail.xml')
6
+
7
+ def setup
8
+ @service = AdobeConnect::Service.new(username: 'name', password: 'password',
9
+ domain: 'http://example.com')
10
+ end
11
+
12
+ def test_initialize_takes_a_config_hash
13
+ assert_equal @service.username, 'name'
14
+ assert_equal @service.domain, URI.parse('http://example.com')
15
+ end
16
+
17
+ def test_password_is_not_be_public
18
+ assert_raises(NoMethodError) { @service.password }
19
+ end
20
+
21
+ def test_authenticated_defaults_to_false
22
+ assert_equal @service.authenticated?, false
23
+ end
24
+
25
+ def test_log_in_authenticates
26
+ response = mock(status: 200)
27
+ response.expects(:fetch).returns('BREEZESESSION=12345')
28
+ response.expects(:body).returns(LOGIN_SUCCESS)
29
+ ac_response = AdobeConnect::Response.new(response)
30
+ @service.client.stubs(:get).returns(ac_response)
31
+
32
+ @service.log_in
33
+ assert @service.authenticated?
34
+ end
35
+
36
+ def test_log_in_creates_a_session
37
+ response = mock(status: 200)
38
+ response.expects(:fetch).with('set-cookie').returns('BREEZESESSION=12345;HttpOnly;path=/')
39
+ response.expects(:body).returns(LOGIN_SUCCESS)
40
+ ac_response = AdobeConnect::Response.new(response)
41
+ @service.client.stubs(:get).
42
+ with("/api/xml?action=login&login=name&password=password").
43
+ returns(ac_response)
44
+
45
+ @service.log_in
46
+ assert_equal @service.session, '12345'
47
+ end
48
+
49
+ def test_log_in_returns_false_on_failure
50
+ response = mock(status: 200)
51
+ response.expects(:body).returns(LOGIN_FAIL)
52
+ ac_response = AdobeConnect::Response.new(response)
53
+ @service.client.stubs(:get).returns(ac_response)
54
+
55
+ refute @service.log_in
56
+ end
57
+
58
+ def test_unknown_methods_are_proxied_to_the_connect_service
59
+ @service.expects(:request).with('method-name', a: 1)
60
+ @service.method_name(a: 1)
61
+ end
62
+ end
@@ -0,0 +1,103 @@
1
+ require File.expand_path('../../test_helper.rb', File.dirname(__FILE__))
2
+
3
+ class AdobeConnectUserTest < MiniTest::Unit::TestCase
4
+
5
+ AdobeConnect::Config.declare do
6
+ username 'test@example.com'
7
+ password 'pwd'
8
+ domain 'http://example.com'
9
+ end
10
+
11
+ SAVE_SUCCESS = File.read('test/fixtures/user_save_success.xml')
12
+ SAVE_ERROR = File.read('test/fixtures/user_save_error.xml')
13
+ FIND_SUCCESS = File.read('test/fixtures/user_find_success.xml')
14
+ FIND_ERROR = File.read('test/fixtures/user_find_error.xml')
15
+
16
+ def setup
17
+ @canvas_user = stub(first_name: 'Don', last_name: 'Draper',
18
+ email: 'test@example.com', uuid: '12345')
19
+ @connect_user = AdobeConnect::User.new(@canvas_user)
20
+ end
21
+
22
+ def test_initialize_should_take_a_user
23
+ assert_equal @connect_user.canvas_user, @canvas_user
24
+ end
25
+
26
+ def test_username_should_be_canvas_user_email
27
+ assert_equal @connect_user.username, @canvas_user.email
28
+ end
29
+
30
+ def test_password_should_create_a_unique_password
31
+ assert_equal @connect_user.password, @connect_user.password
32
+ end
33
+
34
+ def test_password_should_be_ten_characters_long
35
+ assert_equal @connect_user.password.length, 10
36
+ end
37
+
38
+ def test_save_persists_user_to_connect_server
39
+ response = mock(status: 200)
40
+ response.expects(:body).returns(SAVE_SUCCESS)
41
+ ac_response = AdobeConnect::Response.new(response)
42
+
43
+ @connect_user.service.expects(:principal_update).
44
+ with(first_name: @canvas_user.first_name,
45
+ last_name: @canvas_user.last_name, login: @connect_user.username,
46
+ password: @connect_user.password, type: 'user', has_children: 0,
47
+ email: @canvas_user.email).
48
+ returns(ac_response)
49
+
50
+ assert @connect_user.save
51
+ end
52
+
53
+ def test_save_returns_false_on_failure
54
+ response = mock(status: 200)
55
+ response.expects(:body).returns(SAVE_ERROR)
56
+ ac_response = AdobeConnect::Response.new(response)
57
+
58
+ @connect_user.service.expects(:principal_update).returns(ac_response)
59
+ refute @connect_user.save
60
+ end
61
+
62
+ def test_save_stores_errors_on_failure
63
+ response = mock(status: 200)
64
+ response.expects(:body).returns(SAVE_ERROR)
65
+ ac_response = AdobeConnect::Response.new(response)
66
+
67
+ @connect_user.service.expects(:principal_update).returns(ac_response)
68
+ @connect_user.save
69
+ assert_equal 3, @connect_user.errors.length
70
+ end
71
+
72
+ def test_create_should_return_a_new_user
73
+ AdobeConnect::User.any_instance.expects(:save).returns(true)
74
+
75
+ connect_user = AdobeConnect::User.create(@canvas_user)
76
+ assert_instance_of AdobeConnect::User, connect_user
77
+ end
78
+
79
+ def test_find_should_return_an_existing_user
80
+ response = mock(status: 200)
81
+ response.expects(:body).returns(FIND_SUCCESS)
82
+ ac_response = AdobeConnect::Response.new(response)
83
+ AdobeConnect::Service.any_instance.expects(:principal_list).
84
+ with(filter_login: 'test@example.com').
85
+ returns(ac_response)
86
+
87
+ canvas_user = stub(email: 'test@example.com')
88
+ connect_user = AdobeConnect::User.find(canvas_user)
89
+ assert_instance_of AdobeConnect::User, connect_user
90
+ end
91
+
92
+ def test_find_should_set_user_attributes
93
+ response = mock(status: 200)
94
+ response.expects(:body).returns(FIND_ERROR)
95
+ ac_response = AdobeConnect::Response.new(response)
96
+ AdobeConnect::Service.any_instance.expects(:principal_list).
97
+ returns(ac_response)
98
+
99
+ canvas_user = stub(email: 'notfound@example.com')
100
+ connect_user = AdobeConnect::User.find(canvas_user)
101
+ assert_nil connect_user
102
+ end
103
+ end
@@ -0,0 +1,5 @@
1
+ require 'minitest/autorun'
2
+ require 'mocha/setup'
3
+ require 'pry'
4
+
5
+ require File.expand_path('../lib/adobe_connect.rb', File.dirname(__FILE__))
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adobe_connect
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Zach Pendleton
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.3.16
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: 2.3.16
30
+ - !ruby/object:Gem::Dependency
31
+ name: nokogiri
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.5.6
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.5.6
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.11.4
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.11.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 10.0.3
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 10.0.3
78
+ - !ruby/object:Gem::Dependency
79
+ name: minitest
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 4.6.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: 4.6.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: mocha
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.13.2
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.13.2
110
+ description: An API wrapper for interacting with Adobe Connect services.
111
+ email:
112
+ - zachpendleton@gmail.com
113
+ executables:
114
+ - adobe_connect_console
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - adobe_connect.gemspec
124
+ - bin/adobe_connect_console
125
+ - lib/adobe_connect.rb
126
+ - lib/adobe_connect/config.rb
127
+ - lib/adobe_connect/meeting_folder.rb
128
+ - lib/adobe_connect/param_formatter.rb
129
+ - lib/adobe_connect/response.rb
130
+ - lib/adobe_connect/service.rb
131
+ - lib/adobe_connect/session.rb
132
+ - lib/adobe_connect/user.rb
133
+ - lib/adobe_connect/version.rb
134
+ - test/fixtures/folder_contents.xml
135
+ - test/fixtures/folder_success.xml
136
+ - test/fixtures/log_in_fail.xml
137
+ - test/fixtures/log_in_success.xml
138
+ - test/fixtures/user_find_error.xml
139
+ - test/fixtures/user_find_success.xml
140
+ - test/fixtures/user_save_error.xml
141
+ - test/fixtures/user_save_success.xml
142
+ - test/lib/adobe_connect/config_test.rb
143
+ - test/lib/adobe_connect/meeting_folder_test.rb
144
+ - test/lib/adobe_connect/param_formatter_test.rb
145
+ - test/lib/adobe_connect/response_test.rb
146
+ - test/lib/adobe_connect/service_test.rb
147
+ - test/lib/adobe_connect/user_test.rb
148
+ - test/test_helper.rb
149
+ homepage: https://github.com/zachpendleton/adobe_connect
150
+ licenses: []
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 1.8.25
170
+ signing_key:
171
+ specification_version: 3
172
+ summary: An API wrapper for Adobe Connect services.
173
+ test_files:
174
+ - test/fixtures/folder_contents.xml
175
+ - test/fixtures/folder_success.xml
176
+ - test/fixtures/log_in_fail.xml
177
+ - test/fixtures/log_in_success.xml
178
+ - test/fixtures/user_find_error.xml
179
+ - test/fixtures/user_find_success.xml
180
+ - test/fixtures/user_save_error.xml
181
+ - test/fixtures/user_save_success.xml
182
+ - test/lib/adobe_connect/config_test.rb
183
+ - test/lib/adobe_connect/meeting_folder_test.rb
184
+ - test/lib/adobe_connect/param_formatter_test.rb
185
+ - test/lib/adobe_connect/response_test.rb
186
+ - test/lib/adobe_connect/service_test.rb
187
+ - test/lib/adobe_connect/user_test.rb
188
+ - test/test_helper.rb