adobe_connect 0.0.1

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 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