diff options
author | Alexey Shchepin <alexey@process-one.net> | 2016-03-31 14:53:31 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2016-03-31 14:53:31 +0300 |
commit | 3dc55c6d47e3093a6147ce275c7269a7d08ffc45 (patch) | |
tree | 1ff7eb63244a18f9c91dc26dd6e6845499f9f5b5 /test/mod_roster_mock.exs | |
parent | mix version updated for 16.03 release (diff) |
Commands refactor, first pass.
- add API versionning
- changed error handling, based on exception
- commands moved/merged from mod_admin_p1 to mod_admin_extra
- command bufixes
- add some elixir unit test cases
Squashed commit of the following:
commit dd59855b3486f78a9349756e4f102e79b3accff8
Merge: 14e8ffc 506e08e
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Oct 30 11:43:18 2015 +0100
Merge branch '3.2.x' into api
commit 14e8ffce78cbea6c8605371d1fc50a0c1d1e012c
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Oct 27 16:35:17 2015 +0100
Added OAuth tests to ejabberd_commands
commit f81c550c14628edfe4861c228576cb767924366a
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Oct 27 16:34:55 2015 +0100
Added some mod_http_api tests
commit 6a64578d5b2ba532a2feb6503ed98561e56d5d53
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Mon Oct 26 15:29:36 2015 +0100
Fix get_last command test
Previous version won't work with dst.
commit 27e0cde9e9c1f001effe68f8424a365ad947c068
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Oct 23 17:59:34 2015 +0200
Add tests on admin command policy
commit 19dad8d54f54c9fabd454280483cccfb06c8e78a
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Oct 23 16:49:36 2015 +0200
Added command related tests (http api & user policy)
commit e0e596ab4a3f3a70aba5f374f028939ab794de33
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Oct 23 16:49:16 2015 +0200
Fix command call.
commit 128cd7d1ede3c47a34f8ec3a750c980ccad2c61d
Merge: 60c4c4c 447313c
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Thu Oct 22 14:48:39 2015 +0200
Merge branch '3.2.x' into api
commit 60c4c4c0751302524c14219c6bc8c56a6069a689
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Thu Oct 22 14:45:57 2015 +0200
Fix ejabberd_commands spec.
commit 8e145c28c5da762c2b93ee32327eff1db94ebfed
Merge: 397273a f13dc94
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Wed Oct 21 18:26:07 2015 +0200
Merge branch '3.2.x' into api
commit 397273a23ed415feac87aed33da6452229793387
Merge: c30e89b f289e27
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Wed Oct 21 15:27:45 2015 +0200
Merge branch '3.2.x' into api
commit c30e89bb8a0013bff37e61e4c6953350c9c1f313
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Wed Oct 21 12:47:02 2015 +0200
Merge mod_http_api
commit 7b0db22b4acd48ff6fabce41c1b2525e6580a3c5
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Oct 16 11:55:48 2015 +0200
Fix exunit tests to run with common_test suites
commit d8b1a89800ac7379a57a7eb4a09c3c93c3e1e5eb
Merge: 2879ae8 63455b3
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Thu Oct 15 11:39:45 2015 +0200
Merge branch '3.2.x' into api
commit 2879ae87ff3eee369ef3d780136b96ecff5285d1
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Wed Oct 14 14:53:44 2015 +0200
Fix update_roster command.
commit a1d453dd7a3afda9861a8d747494a45057ad574b
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Oct 13 16:14:28 2015 +0200
API commands refactor
Moving and/or merging commands from mod_admin_p1 to mod_admin_extra
commit b709ed26b0fc0ca4f3bdd5a59fa58ec7e3db97fa
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Wed Oct 7 15:10:01 2015 +0200
Add tests on commands
commit 6711687bee9c672cb3d5aed0744e13420ecf6dbd
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Sep 29 15:58:16 2015 +0200
Add ejabberd_commands tests
commit df8682f419cf3877e77e36a19bca0fc55dc991f8
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Mon Sep 28 14:54:39 2015 +0200
Added API versioning for ejabberdctl and rest commands
commit cd017b0e3aac431bc3ee807ceb7f8641e1523ef5
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Fri Sep 18 11:21:45 2015 +0200
Better error handling of HTTP API commands.
commit ca5cb6acd8e4643f9d6c484d2277b0d7e88471e5
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Sep 15 15:03:05 2015 +0200
add commands to mod_admin_extra:
- get_offline_count
- get_presence
- change_password
commit 7f583fa099e30ac2b0915669fd8f102ac565b833
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Tue Sep 15 15:02:16 2015 +0200
Improve REST API error handling
commit 14753b1c02cdce434a786b7f80f6c09f0d210075
Author: Jerome Sautret <jerome.sautret@process-one.net>
Date: Mon Sep 14 10:51:17 2015 +0200
Change REST API return codes for integer type.
Diffstat (limited to 'test/mod_roster_mock.exs')
-rw-r--r-- | test/mod_roster_mock.exs | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/test/mod_roster_mock.exs b/test/mod_roster_mock.exs new file mode 100644 index 00000000..b4991cfd --- /dev/null +++ b/test/mod_roster_mock.exs @@ -0,0 +1,192 @@ + # mod_roster mock + ###################### + +defmodule ModRosterMock do + @author "jsautret@process-one.net" + + require Record + Record.defrecord :roster, Record.extract(:roster, + from: "mod_roster.hrl") + + @agent __MODULE__ + + def init(domain, module) do + try do + Agent.stop(@agent) + catch + :exit, _e -> :ok + end + + {:ok, _pid} = Agent.start_link(fn -> %{} end, name: @agent) + + mock_with_moka module + + #:mod_roster.stop(domain) + :mod_roster.start(domain, []) + end + + def mock_with_moka(module) do + try do + + module_mock = :moka.start(module) + :moka.replace(module_mock, :mod_roster, :invalidate_roster_cache, + fn (_user, _server) -> + :ok + end) + + :moka.load(module_mock) + + roster_mock = :moka.start(:mod_roster) + + :moka.replace(roster_mock, :gen_mod, :db_type, + fn (_host, _opts) -> + {:none} + end) + + :moka.replace(roster_mock, :gen_iq_handler, :add_iq_handler, + fn (_module, _host, _ns, _m, _f, _iqdisc) -> + :ok + end) + + :moka.replace(roster_mock, :gen_iq_handler, :remove_iq_handler, + fn (_module, _host, _ns) -> + :ok + end) + + :moka.replace(roster_mock, :transaction, + fn (_server, function) -> + {:atomic, function.()} + end) + + :moka.replace(roster_mock, :get_roster, + fn (user, domain) -> + to_records(get_roster(user, domain)) + end) + + :moka.replace(roster_mock, :update_roster_t, + fn (user, domain, {u, d, _r}, item) -> + add_roster_item(user, domain, u<>"@"<>d, + roster(item, :name), + roster(item, :subscription), + roster(item, :groups), + roster(item, :ask), + roster(item, :askmessage)) + end) + + :moka.replace(roster_mock, :del_roster_t, + fn (user, domain, jid) -> + remove_roster_item(user, domain, :jlib.jid_to_string(jid)) + end) + + :moka.load(roster_mock) + + catch + {:already_started, _pid} -> :ok + end + + end + + def mock_with_meck do +# mock(:gen_mod, :db_type, +# fn (_server, :mod_roster) -> +# :mnesia +# end) +# +# mock(:mnesia, :transaction, +# fn (_server, function) -> +# {:atomic, function.()} +# end) +# +# mock(:mnesia, :write, +# fn (Item) -> +# throw Item +# {:atomic, :ok} +# end) + + mock(:mod_roster, :transaction, + fn (_server, function) -> + {:atomic, function.()} + end) + + mock(:mod_roster, :update_roster_t, + fn (user, domain, {u, d, _r}, item) -> + add_roster_item(user, domain, u<>"@"<>d, + roster(item, :name), + roster(item, :subscription), + roster(item, :groups), + roster(item, :ask), + roster(item, :askmessage)) + end) + + mock(:mod_roster, :invalidate_roster_cache, + fn (_user, _server) -> + :ok + end) + + end + + def add_roster_item(user, domain, jid, nick, subs \\ :none, groups \\ [], + ask \\ :none, askmessage \\ "") + when is_binary(user) and byte_size(user) > 0 + and is_binary(domain) and byte_size(domain) > 0 + and is_binary(jid) and byte_size(jid) > 0 + and is_binary(nick) + and is_atom(subs) + and is_list(groups) + and is_atom(ask) + and is_binary(askmessage) + do + Agent.update(@agent, fn roster -> + Map.put(roster, {user, domain, jid}, %{nick: nick, + subs: subs, groups: groups, + ask: ask, askmessage: askmessage}) + end) + end + + def remove_roster_item(user, domain, jid) do + Agent.update(@agent, fn roster -> + Map.delete(roster, {user, domain, jid}) + end) + end + + def get_rosters() do + Agent.get(@agent, fn roster -> roster end) + end + + def get_roster(user, domain) do + Agent.get(@agent, fn roster -> + for {u, d, jid} <- Map.keys(roster), u == user, d == domain, + do: {{u, d, jid}, Map.fetch!(roster, {u, d, jid})} + end) + end + + def to_record({{user, domain, jid}, r}) do + roster(usj: {user, domain, jid}, + us: {user, domain}, + jid: :jlib.string_to_usr(jid), + subscription: r.subs, + ask: r.ask, + groups: r.groups, + askmessage: r.askmessage + ) + end + def to_records(rosters) do + for item <- rosters, do: to_record(item) + end + +#################################################################### +# Helpers +#################################################################### + + # TODO refactor: Move to ejabberd_test_mock + def mock(module, function, fun) do + try do + :meck.new(module, [:non_strict, :passthrough, :unstick]) + catch + :error, {:already_started, _pid} -> :ok + end + + :meck.expect(module, function, fun) + end + +end |