diff --git a/README.md b/README.md index a24aaa9..882c1e6 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,11 @@ List all courses moodle.courses.index ``` +Search for a course by name +``` +moodle.courses.search('My course') +``` + Show a course ``` moodle.courses.show(course_id) diff --git a/lib/moodle_rb/courses.rb b/lib/moodle_rb/courses.rb index aca12fb..8f79533 100644 --- a/lib/moodle_rb/courses.rb +++ b/lib/moodle_rb/courses.rb @@ -22,6 +22,21 @@ def index response.parsed_response end + # Search courses by (name, module, block, tag) + def search(criteria_value, criteria_name = 'search') + response = self.class.get( + '/webservice/rest/server.php', + { + :query => query_hash('core_course_search_courses', token).merge({ + :criterianame => criteria_name, + :criteriavalue => criteria_value + }) + }.merge(query_options) + ) + check_for_errors(response) + response.parsed_response + end + # required params: # full_name # short_name diff --git a/lib/moodle_rb/version.rb b/lib/moodle_rb/version.rb index 31a7026..6f3ea83 100644 --- a/lib/moodle_rb/version.rb +++ b/lib/moodle_rb/version.rb @@ -1,5 +1,5 @@ module MoodleRb - VERSION = '2.0.0' unless defined?(self::VERSION) + VERSION = '2.1.0' unless defined?(self::VERSION) def self.version VERSION diff --git a/spec/cassettes/MoodleRb_Courses/_search/.yml b/spec/cassettes/MoodleRb_Courses/_search/.yml new file mode 100644 index 0000000..571a9c6 --- /dev/null +++ b/spec/cassettes/MoodleRb_Courses/_search/.yml @@ -0,0 +1,102 @@ +--- +http_interactions: +- request: + method: get + uri: http://localhost:8888/moodle28/webservice/rest/server.php?criterianame=search&criteriavalue=My%20course&moodlewsrestformat=json&wsfunction=core_course_search_courses&wstoken=60fc9c9415259404795094957e4ab32f + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Origin: + - "*" + Age: + - '0' + Cache-Control: + - private, must-revalidate, pre-check=0, post-check=0, max-age=0 + Content-Type: + - application/json + Date: + - Wed, 11 May 2022 03:43:20 GMT + Expires: + - Thu, 01 Jan 1970 00:00:00 GMT + Pragma: + - no-cache + Server: + - Moodle + X-Cache: + - MISS + X-Clacks-Overhead: + - GNU Terry Pratchett + X-Powered-By: + - Moodle Ninjas + Content-Length: + - '3946' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"total":1,"courses":[{"id":316,"fullname":"My large course","displayname":"My + large course","shortname":"MLC","categoryid":8,"categoryname":"VETtrak testing","sortorder":50002,"summary":"Test + course 1
\nLorem ipsum dolor sit amet, consectetuer adipiscing elit. + Nulla non arcu lacinia neque faucibus fringilla. Vivamus porttitor turpis + ac leo. Integer in sapien. Nullam eget nisl. Aliquam erat volutpat. Cras elementum. + Mauris suscipit, ligula sit amet pharetra semper, nibh ante cursus purus, + vel sagittis velit mauris vel metus. Integer malesuada. Nullam lectus justo, + vulputate eget mollis sed, tempor sed magna. Mauris elementum mauris vitae + tortor. Aliquam erat volutpat.
\nTemporibus autem quibusdam et aut officiis + debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae + sint et molestiae non recusandae. Pellentesque ipsum. Cras pede libero, dapibus + nec, pretium sit amet, tempor quis. Aliquam ante. Proin in tellus sit amet + nibh dignissim sagittis. Vivamus porttitor turpis ac leo. Duis bibendum, lectus + ut viverra rhoncus, dolor nunc faucibus libero, eget facilisis enim ipsum + id lacus. In sem justo, commodo ut, suscipit at, pharetra vitae, orci. Aliquam + erat volutpat. Nulla est.
\nVivamus luctus egestas leo. Aenean fermentum + risus id tortor. Mauris dictum facilisis augue. Aliquam erat volutpat. Aliquam + ornare wisi eu metus. Aliquam id dolor. Duis condimentum augue id magna semper + rutrum. Donec iaculis gravida nulla. Pellentesque ipsum. Etiam dictum tincidunt + diam. Quisque tincidunt scelerisque libero. Etiam egestas wisi a erat.
\nInteger lacinia. Cum sociis natoque penatibus et magnis dis parturient + montes, nascetur ridiculus mus. Mauris tincidunt sem sed arcu. Nullam feugiat, + turpis at pulvinar vulputate, erat libero tristique tellus, nec bibendum odio + risus sit amet ante. Aliquam id dolor. Maecenas sollicitudin. Et harum quidem + rerum facilis est et expedita distinctio. Mauris suscipit, ligula sit amet + pharetra semper, nibh ante cursus purus, vel sagittis velit mauris vel metus. + Nullam dapibus fermentum ipsum. Pellentesque habitant morbi tristique senectus + et netus et malesuada fames ac turpis egestas. Nemo enim ipsam voluptatem + quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni + dolores eos qui ratione voluptatem sequi nesciunt. Pellentesque sapien. Duis + risus. Mauris elementum mauris vitae tortor. Suspendisse nisl. Integer rutrum, + orci vestibulum ullamcorper ultricies, lacus quam ultricies odio, vitae placerat + pede sem sit amet enim.
\nIn laoreet, magna id viverra tincidunt, sem + odio bibendum justo, vel imperdiet sapien wisi sed libero. Proin pede metus, + vulputate nec, fermentum fringilla, vehicula vitae, justo. Nullam justo enim, + consectetuer nec, ullamcorper ac, vestibulum in, elit. Quis autem vel eum + iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, + vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? Maecenas lorem. + Etiam posuere lacus quis dolor. Class aptent taciti sociosqu ad litora torquent + per conubia nostra, per inceptos hymenaeos. Curabitur ligula sapien, pulvinar + a vestibulum quis, facilisis vel sapien. Nam sed tellus id magna elementum + tincidunt. Suspendisse nisl. Vivamus luctus egestas leo. Nulla non arcu lacinia + neque faucibus fringilla. Etiam dui sem, fermentum vitae, sagittis id, malesuada + in, quam. Etiam dictum tincidunt diam. Etiam commodo dui eget wisi. Nemo enim + ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Proin + pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Duis + ante orci, molestie vitae vehicula venenatis, tincidunt ac pede. Pellentesque + sapien.","summaryformat":1,"summaryfiles":[],"overviewfiles":[],"showactivitydates":true,"showcompletionconditions":true,"contacts":[],"enrollmentmethods":["manual"]}],"warnings":[]}' + http_version: + recorded_at: Wed, 11 May 2022 03:42:46 GMT +recorded_with: VCR 2.9.3 diff --git a/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml b/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml new file mode 100644 index 0000000..876ea9b --- /dev/null +++ b/spec/cassettes/MoodleRb_Courses/_search/when_using_invalid_token/.yml @@ -0,0 +1,55 @@ +--- +http_interactions: +- request: + method: get + uri: http://localhost:8888/moodle28/webservice/rest/server.php?criterianame=search&criteriavalue=My%20course&moodlewsrestformat=json&wsfunction=core_course_search_courses&wstoken= + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Accept-Ranges: + - bytes + Access-Control-Allow-Origin: + - "*" + Age: + - '0' + Cache-Control: + - private, must-revalidate, pre-check=0, post-check=0, max-age=0 + Content-Type: + - application/json + Date: + - Wed, 11 May 2022 03:43:20 GMT + Expires: + - Thu, 01 Jan 1970 00:00:00 GMT + Pragma: + - no-cache + Server: + - Moodle + X-Cache: + - MISS + X-Clacks-Overhead: + - GNU Terry Pratchett + X-Powered-By: + - Moodle Ninjas + Content-Length: + - '103' + Connection: + - keep-alive + body: + encoding: UTF-8 + string: '{"exception":"moodle_exception","errorcode":"invalidtoken","message":"Invalid + token - token not found"}' + http_version: + recorded_at: Wed, 11 May 2022 03:42:46 GMT +recorded_with: VCR 2.9.3 diff --git a/spec/lib/moodle_rb/courses_spec.rb b/spec/lib/moodle_rb/courses_spec.rb index de75492..e254205 100644 --- a/spec/lib/moodle_rb/courses_spec.rb +++ b/spec/lib/moodle_rb/courses_spec.rb @@ -36,6 +36,27 @@ end end + describe '#search', :vcr => { + :match_requests_on => [:body, :path], :record => :once + } do + let(:result) { course_moodle_rb.search('My course') } + + specify do + expect(result["total"]).to eq 1 + expect(result["courses"]).to be_a Array + end + + context 'when using invalid token' do + let(:token) { '' } + specify do + expect{ course_moodle_rb.search('My course') }.to raise_error( + MoodleRb::MoodleError, + 'Invalid token - token not found' + ) + end + end + end + describe '#create', :vcr => { :match_requests_on => [:path], :record => :once } do